mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-05 09:46:43 +07:00
wireless-drivers-next patches for v5.6
Second set of patches for v5.6. Nothing special standing out, smaller new features and fixes allover. Major changes: ar5523 * add support for SMCWUSBT-G2 USB device iwlwifi * support new versions of the FTM FW APIs * support new version of the beacon template FW API * print some extra information when the driver is loaded rtw88 * support wowlan feature for 8822c * add support for WIPHY_WOWLAN_NET_DETECT brcmfmac * add initial support for monitor mode qtnfmac * add module parameter to enable DFS offloading in firmware * add support for STA HE rates * add support for TWT responder and spatial reuse -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJeLcWsAAoJEG4XJFUm622bDGUIAJuhM4LiDAzOGnDjH5cMosOC /qwDpGD19cEeVAhNSMKUn7Uo9+qbQYIleiO7XXxzCuJceYbxbT5s3Vb/fWsRUPjS cBDmGuK8/giqMQJshXvfCTsoF83CyirCjY/MJvomK2BRlXM8hQ3s6hAcfU0zQ96e OU1akcfZzUwjaBKaDYLncxLuGbeUXMy8AZwFdgQlQRMoObpen/IIwx6jDK/A+3l6 VCOJF+JTkDytfNWmTpZ65uJrYEXoLe6G4028FjOI4BDFmEgvdHC5vTm7VOBhrkuB 9tsKcYNvECCNn2WI96V+etD8kaZPscQIW8hgOrYyGxw43lJg5zH4Z9eWAmHojxE= =UOhb -----END PGP SIGNATURE----- Merge tag 'wireless-drivers-next-2020-01-26' of git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers-next Kalle Valo says: ==================== wireless-drivers-next patches for v5.6 Second set of patches for v5.6. Nothing special standing out, smaller new features and fixes allover. Major changes: ar5523 * add support for SMCWUSBT-G2 USB device iwlwifi * support new versions of the FTM FW APIs * support new version of the beacon template FW API * print some extra information when the driver is loaded rtw88 * support wowlan feature for 8822c * add support for WIPHY_WOWLAN_NET_DETECT brcmfmac * add initial support for monitor mode qtnfmac * add module parameter to enable DFS offloading in firmware * add support for STA HE rates * add support for TWT responder and spatial reuse ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
82bc2e4a26
@ -50,7 +50,7 @@ Optional properties:
|
||||
entry in clock-names.
|
||||
- clock-names: Should contain the clock names "wifi_wcss_cmd", "wifi_wcss_ref",
|
||||
"wifi_wcss_rtc" for "qcom,ipq4019-wifi" compatible target and
|
||||
"cxo_ref_clk_pin" for "qcom,wcn3990-wifi"
|
||||
"cxo_ref_clk_pin" and optionally "qdss" for "qcom,wcn3990-wifi"
|
||||
compatible target.
|
||||
- qcom,msi_addr: MSI interrupt address.
|
||||
- qcom,msi_base: Base value to add before writing MSI data into
|
||||
@ -88,6 +88,9 @@ Optional properties:
|
||||
of the host capability QMI request
|
||||
- qcom,xo-cal-data: xo cal offset to be configured in xo trim register.
|
||||
|
||||
- qcom,msa-fixed-perm: Boolean context flag to disable SCM call for statically
|
||||
mapped msa region.
|
||||
|
||||
Example (to supply PCI based wifi block details):
|
||||
|
||||
In this example, the node is defined as child node of the PCI controller.
|
||||
@ -185,4 +188,5 @@ wifi@18000000 {
|
||||
vdd-3.3-ch0-supply = <&vreg_l25a_3p3>;
|
||||
memory-region = <&wifi_msa_mem>;
|
||||
iommus = <&apps_smmu 0x0040 0x1>;
|
||||
qcom,msa-fixed-perm;
|
||||
};
|
||||
|
@ -9961,7 +9961,6 @@ F: drivers/net/ethernet/marvell/mvneta.*
|
||||
|
||||
MARVELL MWIFIEX WIRELESS DRIVER
|
||||
M: Amitkumar Karwar <amitkarwar@gmail.com>
|
||||
M: Nishant Sarmukadam <nishants@marvell.com>
|
||||
M: Ganapathi Bhat <ganapathi.bhat@nxp.com>
|
||||
M: Xinming Hu <huxinming820@gmail.com>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
|
@ -74,7 +74,7 @@ static void ar5523_read_reply(struct ar5523 *ar, struct ar5523_cmd_hdr *hdr,
|
||||
|
||||
if (cmd->odata) {
|
||||
if (cmd->olen < olen) {
|
||||
ar5523_err(ar, "olen to small %d < %d\n",
|
||||
ar5523_err(ar, "olen too small %d < %d\n",
|
||||
cmd->olen, olen);
|
||||
cmd->olen = 0;
|
||||
cmd->res = -EOVERFLOW;
|
||||
@ -1770,6 +1770,8 @@ static const struct usb_device_id ar5523_id_table[] = {
|
||||
AR5523_DEVICE_UX(0x0846, 0x4300), /* Netgear / WG111U */
|
||||
AR5523_DEVICE_UG(0x0846, 0x4250), /* Netgear / WG111T */
|
||||
AR5523_DEVICE_UG(0x0846, 0x5f00), /* Netgear / WPN111 */
|
||||
AR5523_DEVICE_UG(0x083a, 0x4506), /* SMC / EZ Connect
|
||||
SMCWUSBT-G2 */
|
||||
AR5523_DEVICE_UG(0x157e, 0x3006), /* Umedia / AR5523_1 */
|
||||
AR5523_DEVICE_UX(0x157e, 0x3205), /* Umedia / AR5523_2 */
|
||||
AR5523_DEVICE_UG(0x157e, 0x3006), /* Umedia / TEW444UBEU */
|
||||
|
@ -2140,7 +2140,7 @@ static bool ath10k_htt_rx_pn_check_replay_hl(struct ath10k *ar,
|
||||
if (last_pn_valid)
|
||||
pn_invalid = ath10k_htt_rx_pn_cmp48(&new_pn, last_pn);
|
||||
else
|
||||
peer->tids_last_pn_valid[tid] = 1;
|
||||
peer->tids_last_pn_valid[tid] = true;
|
||||
|
||||
if (!pn_invalid)
|
||||
last_pn->pn48 = new_pn.pn48;
|
||||
|
@ -816,7 +816,7 @@ ath10k_is_rssi_enable(struct ath10k_hw_params *hw,
|
||||
|
||||
#define TARGET_10_4_TX_DBG_LOG_SIZE 1024
|
||||
#define TARGET_10_4_NUM_WDS_ENTRIES 32
|
||||
#define TARGET_10_4_DMA_BURST_SIZE 0
|
||||
#define TARGET_10_4_DMA_BURST_SIZE 1
|
||||
#define TARGET_10_4_MAC_AGGR_DELIM 0
|
||||
#define TARGET_10_4_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK 1
|
||||
#define TARGET_10_4_VOW_CONFIG 0
|
||||
|
@ -1578,7 +1578,7 @@ static int ath10k_pci_set_ram_config(struct ath10k *ar, u32 config)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* if an error happened returns < 0, otherwise the length */
|
||||
/* Always returns the length */
|
||||
static int ath10k_pci_dump_memory_sram(struct ath10k *ar,
|
||||
const struct ath10k_mem_region *region,
|
||||
u8 *buf)
|
||||
@ -1604,11 +1604,22 @@ static int ath10k_pci_dump_memory_reg(struct ath10k *ar,
|
||||
{
|
||||
struct ath10k_pci *ar_pci = ath10k_pci_priv(ar);
|
||||
u32 i;
|
||||
int ret;
|
||||
|
||||
mutex_lock(&ar->conf_mutex);
|
||||
if (ar->state != ATH10K_STATE_ON) {
|
||||
ath10k_warn(ar, "Skipping pci_dump_memory_reg invalid state\n");
|
||||
ret = -EIO;
|
||||
goto done;
|
||||
}
|
||||
|
||||
for (i = 0; i < region->len; i += 4)
|
||||
*(u32 *)(buf + i) = ioread32(ar_pci->mem + region->start + i);
|
||||
|
||||
return region->len;
|
||||
ret = region->len;
|
||||
done:
|
||||
mutex_unlock(&ar->conf_mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* if an error happened returns < 0, otherwise the length */
|
||||
@ -1704,7 +1715,11 @@ static void ath10k_pci_dump_memory(struct ath10k *ar,
|
||||
count = ath10k_pci_dump_memory_sram(ar, current_region, buf);
|
||||
break;
|
||||
case ATH10K_MEM_REGION_TYPE_IOREG:
|
||||
count = ath10k_pci_dump_memory_reg(ar, current_region, buf);
|
||||
ret = ath10k_pci_dump_memory_reg(ar, current_region, buf);
|
||||
if (ret < 0)
|
||||
break;
|
||||
|
||||
count = ret;
|
||||
break;
|
||||
default:
|
||||
ret = ath10k_pci_dump_memory_generic(ar, current_region, buf);
|
||||
|
@ -84,6 +84,9 @@ static int ath10k_qmi_setup_msa_permissions(struct ath10k_qmi *qmi)
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
if (qmi->msa_fixed_perm)
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < qmi->nr_mem_region; i++) {
|
||||
ret = ath10k_qmi_map_msa_permission(qmi, &qmi->mem_region[i]);
|
||||
if (ret)
|
||||
@ -102,6 +105,9 @@ static void ath10k_qmi_remove_msa_permission(struct ath10k_qmi *qmi)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (qmi->msa_fixed_perm)
|
||||
return;
|
||||
|
||||
for (i = 0; i < qmi->nr_mem_region; i++)
|
||||
ath10k_qmi_unmap_msa_permission(qmi, &qmi->mem_region[i]);
|
||||
}
|
||||
@ -1035,6 +1041,9 @@ static int ath10k_qmi_setup_msa_resources(struct ath10k_qmi *qmi, u32 msa_size)
|
||||
qmi->msa_mem_size = msa_size;
|
||||
}
|
||||
|
||||
if (of_property_read_bool(dev->of_node, "qcom,msa-fixed-perm"))
|
||||
qmi->msa_fixed_perm = true;
|
||||
|
||||
ath10k_dbg(ar, ATH10K_DBG_QMI, "msa pa: %pad , msa va: 0x%p\n",
|
||||
&qmi->msa_pa,
|
||||
qmi->msa_va);
|
||||
|
@ -104,6 +104,7 @@ struct ath10k_qmi {
|
||||
bool fw_ready;
|
||||
char fw_build_timestamp[MAX_TIMESTAMP_LEN + 1];
|
||||
struct ath10k_qmi_cal_data cal_data[MAX_NUM_CAL_V01];
|
||||
bool msa_fixed_perm;
|
||||
};
|
||||
|
||||
int ath10k_qmi_wlan_enable(struct ath10k *ar,
|
||||
|
@ -642,16 +642,23 @@ static int ath10k_sdio_mbox_rx_fetch(struct ath10k *ar)
|
||||
|
||||
ret = ath10k_sdio_readsb(ar, ar_sdio->mbox_info.htc_addr,
|
||||
skb->data, pkt->alloc_len);
|
||||
|
||||
if (ret) {
|
||||
ar_sdio->n_rx_pkts = 0;
|
||||
ath10k_sdio_mbox_free_rx_pkt(pkt);
|
||||
return ret;
|
||||
}
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
htc_hdr = (struct ath10k_htc_hdr *)skb->data;
|
||||
pkt->act_len = le16_to_cpu(htc_hdr->len) + sizeof(*htc_hdr);
|
||||
|
||||
if (pkt->act_len > pkt->alloc_len) {
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
skb_put(skb, pkt->act_len);
|
||||
return 0;
|
||||
|
||||
err:
|
||||
ar_sdio->n_rx_pkts = 0;
|
||||
ath10k_sdio_mbox_free_rx_pkt(pkt);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -687,6 +694,11 @@ static int ath10k_sdio_mbox_rx_fetch_bundle(struct ath10k *ar)
|
||||
htc_hdr = (struct ath10k_htc_hdr *)(ar_sdio->vsg_buffer + pkt_offset);
|
||||
pkt->act_len = le16_to_cpu(htc_hdr->len) + sizeof(*htc_hdr);
|
||||
|
||||
if (pkt->act_len > pkt->alloc_len ) {
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
skb_put_data(pkt->skb, htc_hdr, pkt->act_len);
|
||||
pkt_offset += pkt->alloc_len;
|
||||
}
|
||||
|
@ -46,7 +46,7 @@ static const char * const ath10k_regulators[] = {
|
||||
};
|
||||
|
||||
static const char * const ath10k_clocks[] = {
|
||||
"cxo_ref_clk_pin",
|
||||
"cxo_ref_clk_pin", "qdss",
|
||||
};
|
||||
|
||||
static void ath10k_snoc_htc_tx_cb(struct ath10k_ce_pipe *ce_state);
|
||||
@ -582,7 +582,7 @@ static void ath10k_snoc_process_rx_cb(struct ath10k_ce_pipe *ce_state,
|
||||
max_nbytes, DMA_FROM_DEVICE);
|
||||
|
||||
if (unlikely(max_nbytes < nbytes)) {
|
||||
ath10k_warn(ar, "rxed more than expected (nbytes %d, max %d)",
|
||||
ath10k_warn(ar, "rxed more than expected (nbytes %d, max %d)\n",
|
||||
nbytes, max_nbytes);
|
||||
dev_kfree_skb_any(skb);
|
||||
continue;
|
||||
@ -1201,7 +1201,7 @@ static int ath10k_snoc_request_irq(struct ath10k *ar)
|
||||
irqflags, ce_name[id], ar);
|
||||
if (ret) {
|
||||
ath10k_err(ar,
|
||||
"failed to register IRQ handler for CE %d: %d",
|
||||
"failed to register IRQ handler for CE %d: %d\n",
|
||||
id, ret);
|
||||
goto err_irq;
|
||||
}
|
||||
@ -1466,7 +1466,6 @@ MODULE_DEVICE_TABLE(of, ath10k_snoc_dt_match);
|
||||
static int ath10k_snoc_probe(struct platform_device *pdev)
|
||||
{
|
||||
const struct ath10k_snoc_drv_priv *drv_data;
|
||||
const struct of_device_id *of_id;
|
||||
struct ath10k_snoc *ar_snoc;
|
||||
struct device *dev;
|
||||
struct ath10k *ar;
|
||||
@ -1474,18 +1473,16 @@ static int ath10k_snoc_probe(struct platform_device *pdev)
|
||||
int ret;
|
||||
u32 i;
|
||||
|
||||
of_id = of_match_device(ath10k_snoc_dt_match, &pdev->dev);
|
||||
if (!of_id) {
|
||||
dev_err(&pdev->dev, "failed to find matching device tree id\n");
|
||||
dev = &pdev->dev;
|
||||
drv_data = device_get_match_data(dev);
|
||||
if (!drv_data) {
|
||||
dev_err(dev, "failed to find matching device tree id\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
drv_data = of_id->data;
|
||||
dev = &pdev->dev;
|
||||
|
||||
ret = dma_set_mask_and_coherent(dev, drv_data->dma_mask);
|
||||
if (ret) {
|
||||
dev_err(dev, "failed to set dma mask: %d", ret);
|
||||
dev_err(dev, "failed to set dma mask: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -9490,7 +9490,7 @@ static int ath10k_wmi_mgmt_tx_clean_up_pending(int msdu_id, void *ptr,
|
||||
|
||||
msdu = pkt_addr->vaddr;
|
||||
dma_unmap_single(ar->dev, pkt_addr->paddr,
|
||||
msdu->len, DMA_FROM_DEVICE);
|
||||
msdu->len, DMA_TO_DEVICE);
|
||||
ieee80211_free_txskb(ar->hw, msdu);
|
||||
|
||||
return 0;
|
||||
|
@ -22,7 +22,7 @@ config ATH11K_DEBUG
|
||||
|
||||
config ATH11K_DEBUGFS
|
||||
bool "QCA ath11k debugfs support"
|
||||
depends on ATH11K && DEBUG_FS
|
||||
depends on ATH11K && DEBUG_FS && MAC80211_DEBUGFS
|
||||
---help---
|
||||
Enable ath11k debugfs support
|
||||
|
||||
|
@ -17,8 +17,7 @@ ath11k-y += core.o \
|
||||
ce.o \
|
||||
peer.o
|
||||
|
||||
ath11k-$(CONFIG_ATH11K_DEBUGFS) += debug_htt_stats.o
|
||||
ath11k-$(CONFIG_MAC80211_DEBUGFS) += debugfs_sta.o
|
||||
ath11k-$(CONFIG_ATH11K_DEBUGFS) += debug_htt_stats.o debugfs_sta.o
|
||||
ath11k-$(CONFIG_NL80211_TESTMODE) += testmode.o
|
||||
ath11k-$(CONFIG_ATH11K_TRACING) += trace.o
|
||||
|
||||
|
@ -931,7 +931,22 @@ static ssize_t ath11k_write_pktlog_filter(struct file *file,
|
||||
HTT_RX_FILTER_TLV_FLAGS_PACKET_HEADER |
|
||||
HTT_RX_FILTER_TLV_FLAGS_ATTENTION;
|
||||
} else if (mode == ATH11K_PKTLOG_MODE_LITE) {
|
||||
ret = ath11k_dp_tx_htt_h2t_ppdu_stats_req(ar,
|
||||
HTT_PPDU_STATS_TAG_PKTLOG);
|
||||
if (ret) {
|
||||
ath11k_err(ar->ab, "failed to enable pktlog lite: %d\n", ret);
|
||||
goto out;
|
||||
}
|
||||
|
||||
rx_filter = HTT_RX_FILTER_TLV_LITE_MODE;
|
||||
} else {
|
||||
ret = ath11k_dp_tx_htt_h2t_ppdu_stats_req(ar,
|
||||
HTT_PPDU_STATS_TAG_DEFAULT);
|
||||
if (ret) {
|
||||
ath11k_err(ar->ab, "failed to send htt ppdu stats req: %d\n",
|
||||
ret);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
tlv_filter.rx_filter = rx_filter;
|
||||
|
@ -172,6 +172,16 @@ static inline int ath11k_debug_is_extd_rx_stats_enabled(struct ath11k *ar)
|
||||
{
|
||||
return ar->debug.extd_rx_stats;
|
||||
}
|
||||
|
||||
void ath11k_sta_add_debugfs(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta, struct dentry *dir);
|
||||
void
|
||||
ath11k_accumulate_per_peer_tx_stats(struct ath11k_sta *arsta,
|
||||
struct ath11k_per_peer_tx_stats *peer_stats,
|
||||
u8 legacy_rate_idx);
|
||||
void ath11k_update_per_peer_stats_from_txcompl(struct ath11k *ar,
|
||||
struct sk_buff *msdu,
|
||||
struct hal_tx_status *ts);
|
||||
#else
|
||||
static inline int ath11k_debug_soc_create(struct ath11k_base *ab)
|
||||
{
|
||||
@ -243,19 +253,7 @@ static inline bool ath11k_debug_is_pktlog_peer_valid(struct ath11k *ar, u8 *addr
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif /* CONFIG_ATH11K_DEBUGFS */
|
||||
|
||||
#ifdef CONFIG_MAC80211_DEBUGFS
|
||||
void ath11k_sta_add_debugfs(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta, struct dentry *dir);
|
||||
void
|
||||
ath11k_accumulate_per_peer_tx_stats(struct ath11k_sta *arsta,
|
||||
struct ath11k_per_peer_tx_stats *peer_stats,
|
||||
u8 legacy_rate_idx);
|
||||
void ath11k_update_per_peer_stats_from_txcompl(struct ath11k *ar,
|
||||
struct sk_buff *msdu,
|
||||
struct hal_tx_status *ts);
|
||||
#else /* !CONFIG_MAC80211_DEBUGFS */
|
||||
static inline void
|
||||
ath11k_accumulate_per_peer_tx_stats(struct ath11k_sta *arsta,
|
||||
struct ath11k_per_peer_tx_stats *peer_stats,
|
||||
|
@ -776,11 +776,14 @@ static inline void htt_print_tx_peer_rate_stats_tlv(const void *tag_buf,
|
||||
u32 len = stats_req->buf_len;
|
||||
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
|
||||
char str_buf[HTT_MAX_STRING_LEN] = {0};
|
||||
char *tx_gi[HTT_TX_PEER_STATS_NUM_GI_COUNTERS];
|
||||
char *tx_gi[HTT_TX_PEER_STATS_NUM_GI_COUNTERS] = {NULL};
|
||||
u8 j;
|
||||
|
||||
for (j = 0; j < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; j++)
|
||||
for (j = 0; j < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; j++) {
|
||||
tx_gi[j] = kmalloc(HTT_MAX_STRING_LEN, GFP_ATOMIC);
|
||||
if (!tx_gi[j])
|
||||
goto fail;
|
||||
}
|
||||
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "HTT_TX_PEER_RATE_STATS_TLV:");
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "tx_ldpc = %u",
|
||||
@ -841,15 +844,16 @@ static inline void htt_print_tx_peer_rate_stats_tlv(const void *tag_buf,
|
||||
HTT_TX_PDEV_STATS_NUM_DCM_COUNTERS);
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "tx_dcm = %s\n", str_buf);
|
||||
|
||||
for (j = 0; j < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; j++)
|
||||
kfree(tx_gi[j]);
|
||||
|
||||
if (len >= buf_len)
|
||||
buf[buf_len - 1] = 0;
|
||||
else
|
||||
buf[len] = 0;
|
||||
|
||||
stats_req->buf_len = len;
|
||||
|
||||
fail:
|
||||
for (j = 0; j < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; j++)
|
||||
kfree(tx_gi[j]);
|
||||
}
|
||||
|
||||
static inline void htt_print_rx_peer_rate_stats_tlv(const void *tag_buf,
|
||||
@ -860,15 +864,21 @@ static inline void htt_print_rx_peer_rate_stats_tlv(const void *tag_buf,
|
||||
u32 len = stats_req->buf_len;
|
||||
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
|
||||
u8 j;
|
||||
char *rssi_chain[HTT_RX_PEER_STATS_NUM_SPATIAL_STREAMS];
|
||||
char *rx_gi[HTT_RX_PEER_STATS_NUM_GI_COUNTERS];
|
||||
char *rssi_chain[HTT_RX_PEER_STATS_NUM_SPATIAL_STREAMS] = {NULL};
|
||||
char *rx_gi[HTT_RX_PEER_STATS_NUM_GI_COUNTERS] = {NULL};
|
||||
char str_buf[HTT_MAX_STRING_LEN] = {0};
|
||||
|
||||
for (j = 0; j < HTT_RX_PEER_STATS_NUM_SPATIAL_STREAMS; j++)
|
||||
for (j = 0; j < HTT_RX_PEER_STATS_NUM_SPATIAL_STREAMS; j++) {
|
||||
rssi_chain[j] = kmalloc(HTT_MAX_STRING_LEN, GFP_ATOMIC);
|
||||
if (!rssi_chain[j])
|
||||
goto fail;
|
||||
}
|
||||
|
||||
for (j = 0; j < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; j++)
|
||||
for (j = 0; j < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; j++) {
|
||||
rx_gi[j] = kmalloc(HTT_MAX_STRING_LEN, GFP_ATOMIC);
|
||||
if (!rx_gi[j])
|
||||
goto fail;
|
||||
}
|
||||
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "HTT_RX_PEER_RATE_STATS_TLV:");
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "nsts = %u",
|
||||
@ -928,18 +938,19 @@ static inline void htt_print_rx_peer_rate_stats_tlv(const void *tag_buf,
|
||||
HTT_RX_PDEV_STATS_NUM_PREAMBLE_TYPES);
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "rx_pream = %s\n", str_buf);
|
||||
|
||||
for (j = 0; j < HTT_RX_PEER_STATS_NUM_SPATIAL_STREAMS; j++)
|
||||
kfree(rssi_chain[j]);
|
||||
|
||||
for (j = 0; j < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; j++)
|
||||
kfree(rx_gi[j]);
|
||||
|
||||
if (len >= buf_len)
|
||||
buf[buf_len - 1] = 0;
|
||||
else
|
||||
buf[len] = 0;
|
||||
|
||||
stats_req->buf_len = len;
|
||||
|
||||
fail:
|
||||
for (j = 0; j < HTT_RX_PEER_STATS_NUM_SPATIAL_STREAMS; j++)
|
||||
kfree(rssi_chain[j]);
|
||||
|
||||
for (j = 0; j < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; j++)
|
||||
kfree(rx_gi[j]);
|
||||
}
|
||||
|
||||
static inline void
|
||||
@ -2832,10 +2843,13 @@ static inline void htt_print_tx_pdev_rate_stats_tlv(const void *tag_buf,
|
||||
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
|
||||
u8 j;
|
||||
char str_buf[HTT_MAX_STRING_LEN] = {0};
|
||||
char *tx_gi[HTT_TX_PEER_STATS_NUM_GI_COUNTERS];
|
||||
char *tx_gi[HTT_TX_PEER_STATS_NUM_GI_COUNTERS] = {NULL};
|
||||
|
||||
for (j = 0; j < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; j++)
|
||||
for (j = 0; j < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; j++) {
|
||||
tx_gi[j] = kmalloc(HTT_MAX_STRING_LEN, GFP_ATOMIC);
|
||||
if (!tx_gi[j])
|
||||
goto fail;
|
||||
}
|
||||
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "HTT_TX_PDEV_RATE_STATS_TLV:");
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "mac_id = %u",
|
||||
@ -2988,15 +3002,15 @@ static inline void htt_print_tx_pdev_rate_stats_tlv(const void *tag_buf,
|
||||
HTT_TX_PDEV_STATS_NUM_DCM_COUNTERS);
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "tx_dcm = %s\n", str_buf);
|
||||
|
||||
for (j = 0; j < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; j++)
|
||||
kfree(tx_gi[j]);
|
||||
|
||||
if (len >= buf_len)
|
||||
buf[buf_len - 1] = 0;
|
||||
else
|
||||
buf[len] = 0;
|
||||
|
||||
stats_req->buf_len = len;
|
||||
fail:
|
||||
for (j = 0; j < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; j++)
|
||||
kfree(tx_gi[j]);
|
||||
}
|
||||
|
||||
static inline void htt_print_rx_pdev_rate_stats_tlv(const void *tag_buf,
|
||||
@ -3006,16 +3020,30 @@ static inline void htt_print_rx_pdev_rate_stats_tlv(const void *tag_buf,
|
||||
u8 *buf = stats_req->buf;
|
||||
u32 len = stats_req->buf_len;
|
||||
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
|
||||
u8 j;
|
||||
char *rssi_chain[HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS];
|
||||
char *rx_gi[HTT_RX_PDEV_STATS_NUM_GI_COUNTERS];
|
||||
u8 i, j;
|
||||
u16 index = 0;
|
||||
char *rssi_chain[HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS] = {NULL};
|
||||
char *rx_gi[HTT_RX_PDEV_STATS_NUM_GI_COUNTERS] = {NULL};
|
||||
char str_buf[HTT_MAX_STRING_LEN] = {0};
|
||||
char *rx_pilot_evm_db[HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS] = {NULL};
|
||||
|
||||
for (j = 0; j < HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++)
|
||||
for (j = 0; j < HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) {
|
||||
rssi_chain[j] = kmalloc(HTT_MAX_STRING_LEN, GFP_ATOMIC);
|
||||
if (!rssi_chain[j])
|
||||
goto fail;
|
||||
}
|
||||
|
||||
for (j = 0; j < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; j++)
|
||||
for (j = 0; j < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
|
||||
rx_gi[j] = kmalloc(HTT_MAX_STRING_LEN, GFP_ATOMIC);
|
||||
if (!rx_gi[j])
|
||||
goto fail;
|
||||
}
|
||||
|
||||
for (j = 0; j < HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) {
|
||||
rx_pilot_evm_db[j] = kmalloc(HTT_MAX_STRING_LEN, GFP_ATOMIC);
|
||||
if (!rx_pilot_evm_db[j])
|
||||
goto fail;
|
||||
}
|
||||
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "HTT_RX_PDEV_RATE_STATS_TLV:");
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "mac_id = %u",
|
||||
@ -3059,6 +3087,32 @@ static inline void htt_print_rx_pdev_rate_stats_tlv(const void *tag_buf,
|
||||
ARRAY_TO_STRING(str_buf, htt_stats_buf->rx_bw,
|
||||
HTT_RX_PDEV_STATS_NUM_BW_COUNTERS);
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "rx_bw = %s ", str_buf);
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "rx_evm_nss_count = %u",
|
||||
htt_stats_buf->nss_count);
|
||||
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "rx_evm_pilot_count = %u",
|
||||
htt_stats_buf->pilot_count);
|
||||
|
||||
for (j = 0; j < HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) {
|
||||
index = 0;
|
||||
|
||||
for (i = 0; i < HTT_RX_PDEV_STATS_RXEVM_MAX_PILOTS_PER_NSS; i++)
|
||||
index += snprintf(&rx_pilot_evm_db[j][index],
|
||||
HTT_MAX_STRING_LEN - index,
|
||||
" %u:%d,",
|
||||
i,
|
||||
htt_stats_buf->rx_pilot_evm_db[j][i]);
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "pilot_evm_dB[%u] = %s ",
|
||||
j, rx_pilot_evm_db[j]);
|
||||
}
|
||||
|
||||
index = 0;
|
||||
memset(str_buf, 0x0, HTT_MAX_STRING_LEN);
|
||||
for (i = 0; i < HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++)
|
||||
index += snprintf(&str_buf[index],
|
||||
HTT_MAX_STRING_LEN - index,
|
||||
" %u:%d,", i, htt_stats_buf->rx_pilot_evm_db_mean[i]);
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "pilot_evm_dB_mean = %s ", str_buf);
|
||||
|
||||
for (j = 0; j < HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) {
|
||||
ARRAY_TO_STRING(rssi_chain[j], htt_stats_buf->rssi_chain[j],
|
||||
@ -3079,12 +3133,6 @@ static inline void htt_print_rx_pdev_rate_stats_tlv(const void *tag_buf,
|
||||
HTT_RX_PDEV_STATS_NUM_PREAMBLE_TYPES);
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "rx_pream = %s", str_buf);
|
||||
|
||||
for (j = 0; j < HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++)
|
||||
kfree(rssi_chain[j]);
|
||||
|
||||
for (j = 0; j < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; j++)
|
||||
kfree(rx_gi[j]);
|
||||
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "rx_11ax_su_ext = %u",
|
||||
htt_stats_buf->rx_11ax_su_ext);
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "rx_11ac_mumimo = %u",
|
||||
@ -3110,8 +3158,89 @@ static inline void htt_print_rx_pdev_rate_stats_tlv(const void *tag_buf,
|
||||
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "rx_active_dur_us_low = %u",
|
||||
htt_stats_buf->rx_active_dur_us_low);
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "rx_active_dur_us_high = %u\n",
|
||||
htt_stats_buf->rx_active_dur_us_high);
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "rx_active_dur_us_high = %u",
|
||||
htt_stats_buf->rx_active_dur_us_high);
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "rx_11ax_ul_ofdma = %u",
|
||||
htt_stats_buf->rx_11ax_ul_ofdma);
|
||||
|
||||
memset(str_buf, 0x0, HTT_MAX_STRING_LEN);
|
||||
ARRAY_TO_STRING(str_buf, htt_stats_buf->ul_ofdma_rx_mcs,
|
||||
HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS);
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "ul_ofdma_rx_mcs = %s ", str_buf);
|
||||
|
||||
for (j = 0; j < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
|
||||
ARRAY_TO_STRING(rx_gi[j], htt_stats_buf->ul_ofdma_rx_gi[j],
|
||||
HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS);
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "ul_ofdma_rx_gi[%u] = %s ",
|
||||
j, rx_gi[j]);
|
||||
}
|
||||
|
||||
memset(str_buf, 0x0, HTT_MAX_STRING_LEN);
|
||||
ARRAY_TO_STRING(str_buf, htt_stats_buf->ul_ofdma_rx_nss,
|
||||
HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS);
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "ul_ofdma_rx_nss = %s ", str_buf);
|
||||
|
||||
memset(str_buf, 0x0, HTT_MAX_STRING_LEN);
|
||||
ARRAY_TO_STRING(str_buf, htt_stats_buf->ul_ofdma_rx_bw,
|
||||
HTT_RX_PDEV_STATS_NUM_BW_COUNTERS);
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "ul_ofdma_rx_bw = %s ", str_buf);
|
||||
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "ul_ofdma_rx_stbc = %u",
|
||||
htt_stats_buf->ul_ofdma_rx_stbc);
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "ul_ofdma_rx_ldpc = %u",
|
||||
htt_stats_buf->ul_ofdma_rx_ldpc);
|
||||
|
||||
memset(str_buf, 0x0, HTT_MAX_STRING_LEN);
|
||||
ARRAY_TO_STRING(str_buf, htt_stats_buf->rx_ulofdma_non_data_ppdu,
|
||||
HTT_RX_PDEV_MAX_OFDMA_NUM_USER);
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "rx_ulofdma_non_data_ppdu = %s ",
|
||||
str_buf);
|
||||
|
||||
memset(str_buf, 0x0, HTT_MAX_STRING_LEN);
|
||||
ARRAY_TO_STRING(str_buf, htt_stats_buf->rx_ulofdma_data_ppdu,
|
||||
HTT_RX_PDEV_MAX_OFDMA_NUM_USER);
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "rx_ulofdma_data_ppdu = %s ",
|
||||
str_buf);
|
||||
|
||||
memset(str_buf, 0x0, HTT_MAX_STRING_LEN);
|
||||
ARRAY_TO_STRING(str_buf, htt_stats_buf->rx_ulofdma_mpdu_ok,
|
||||
HTT_RX_PDEV_MAX_OFDMA_NUM_USER);
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "rx_ulofdma_mpdu_ok = %s ", str_buf);
|
||||
|
||||
memset(str_buf, 0x0, HTT_MAX_STRING_LEN);
|
||||
ARRAY_TO_STRING(str_buf, htt_stats_buf->rx_ulofdma_mpdu_fail,
|
||||
HTT_RX_PDEV_MAX_OFDMA_NUM_USER);
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "rx_ulofdma_mpdu_fail = %s",
|
||||
str_buf);
|
||||
|
||||
for (j = 0; j < HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) {
|
||||
index = 0;
|
||||
memset(str_buf, 0x0, HTT_MAX_STRING_LEN);
|
||||
for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++)
|
||||
index += snprintf(&str_buf[index],
|
||||
HTT_MAX_STRING_LEN - index,
|
||||
" %u:%d,",
|
||||
i, htt_stats_buf->rx_ul_fd_rssi[j][i]);
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len,
|
||||
"rx_ul_fd_rssi: nss[%u] = %s", j, str_buf);
|
||||
}
|
||||
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "per_chain_rssi_pkt_type = %#x",
|
||||
htt_stats_buf->per_chain_rssi_pkt_type);
|
||||
|
||||
for (j = 0; j < HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) {
|
||||
index = 0;
|
||||
memset(str_buf, 0x0, HTT_MAX_STRING_LEN);
|
||||
for (i = 0; i < HTT_RX_PDEV_STATS_NUM_BW_COUNTERS; i++)
|
||||
index += snprintf(&str_buf[index],
|
||||
HTT_MAX_STRING_LEN - index,
|
||||
" %u:%d,",
|
||||
i,
|
||||
htt_stats_buf->rx_per_chain_rssi_in_dbm[j][i]);
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len,
|
||||
"rx_per_chain_rssi_in_dbm[%u] = %s ", j, str_buf);
|
||||
}
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "\n");
|
||||
|
||||
if (len >= buf_len)
|
||||
buf[buf_len - 1] = 0;
|
||||
@ -3119,6 +3248,16 @@ static inline void htt_print_rx_pdev_rate_stats_tlv(const void *tag_buf,
|
||||
buf[len] = 0;
|
||||
|
||||
stats_req->buf_len = len;
|
||||
|
||||
fail:
|
||||
for (j = 0; j < HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++)
|
||||
kfree(rssi_chain[j]);
|
||||
|
||||
for (j = 0; j < HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++)
|
||||
kfree(rx_pilot_evm_db[j]);
|
||||
|
||||
for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++)
|
||||
kfree(rx_gi[i]);
|
||||
}
|
||||
|
||||
static inline void htt_print_rx_soc_fw_stats_tlv(const void *tag_buf,
|
||||
|
@ -1231,6 +1231,8 @@ struct htt_tx_pdev_rate_stats_tlv {
|
||||
#define HTT_RX_PDEV_STATS_NUM_BW_COUNTERS 4
|
||||
#define HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS 8
|
||||
#define HTT_RX_PDEV_STATS_NUM_PREAMBLE_TYPES HTT_STATS_PREAM_COUNT
|
||||
#define HTT_RX_PDEV_MAX_OFDMA_NUM_USER 8
|
||||
#define HTT_RX_PDEV_STATS_RXEVM_MAX_PILOTS_PER_NSS 16
|
||||
|
||||
struct htt_rx_pdev_rate_stats_tlv {
|
||||
u32 mac_id__word;
|
||||
@ -1269,6 +1271,46 @@ struct htt_rx_pdev_rate_stats_tlv {
|
||||
u32 rx_legacy_ofdm_rate[HTT_RX_PDEV_STATS_NUM_LEGACY_OFDM_STATS];
|
||||
u32 rx_active_dur_us_low;
|
||||
u32 rx_active_dur_us_high;
|
||||
|
||||
u32 rx_11ax_ul_ofdma;
|
||||
|
||||
u32 ul_ofdma_rx_mcs[HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS];
|
||||
u32 ul_ofdma_rx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS]
|
||||
[HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS];
|
||||
u32 ul_ofdma_rx_nss[HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS];
|
||||
u32 ul_ofdma_rx_bw[HTT_TX_PDEV_STATS_NUM_BW_COUNTERS];
|
||||
u32 ul_ofdma_rx_stbc;
|
||||
u32 ul_ofdma_rx_ldpc;
|
||||
|
||||
/* record the stats for each user index */
|
||||
u32 rx_ulofdma_non_data_ppdu[HTT_RX_PDEV_MAX_OFDMA_NUM_USER]; /* ppdu level */
|
||||
u32 rx_ulofdma_data_ppdu[HTT_RX_PDEV_MAX_OFDMA_NUM_USER]; /* ppdu level */
|
||||
u32 rx_ulofdma_mpdu_ok[HTT_RX_PDEV_MAX_OFDMA_NUM_USER]; /* mpdu level */
|
||||
u32 rx_ulofdma_mpdu_fail[HTT_RX_PDEV_MAX_OFDMA_NUM_USER]; /* mpdu level */
|
||||
|
||||
u32 nss_count;
|
||||
u32 pilot_count;
|
||||
/* RxEVM stats in dB */
|
||||
s32 rx_pilot_evm_db[HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS]
|
||||
[HTT_RX_PDEV_STATS_RXEVM_MAX_PILOTS_PER_NSS];
|
||||
/* rx_pilot_evm_db_mean:
|
||||
* EVM mean across pilots, computed as
|
||||
* mean(10*log10(rx_pilot_evm_linear)) = mean(rx_pilot_evm_db)
|
||||
*/
|
||||
s32 rx_pilot_evm_db_mean[HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS];
|
||||
s8 rx_ul_fd_rssi[HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS]
|
||||
[HTT_RX_PDEV_MAX_OFDMA_NUM_USER]; /* dBm units */
|
||||
/* per_chain_rssi_pkt_type:
|
||||
* This field shows what type of rx frame the per-chain RSSI was computed
|
||||
* on, by recording the frame type and sub-type as bit-fields within this
|
||||
* field:
|
||||
* BIT [3 : 0] :- IEEE80211_FC0_TYPE
|
||||
* BIT [7 : 4] :- IEEE80211_FC0_SUBTYPE
|
||||
* BIT [31 : 8] :- Reserved
|
||||
*/
|
||||
u32 per_chain_rssi_pkt_type;
|
||||
s8 rx_per_chain_rssi_in_dbm[HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS]
|
||||
[HTT_RX_PDEV_STATS_NUM_BW_COUNTERS];
|
||||
};
|
||||
|
||||
/* == RX PDEV/SOC STATS == */
|
||||
|
@ -507,6 +507,14 @@ enum htt_ppdu_stats_tag_type {
|
||||
| BIT(HTT_PPDU_STATS_TAG_USR_COMPLTN_FLUSH) \
|
||||
| BIT(HTT_PPDU_STATS_TAG_USR_COMMON_ARRAY))
|
||||
|
||||
#define HTT_PPDU_STATS_TAG_PKTLOG (BIT(HTT_PPDU_STATS_TAG_USR_MPDU_ENQ_BITMAP_64) | \
|
||||
BIT(HTT_PPDU_STATS_TAG_USR_MPDU_ENQ_BITMAP_256) | \
|
||||
BIT(HTT_PPDU_STATS_TAG_USR_COMPLTN_BA_BITMAP_64) | \
|
||||
BIT(HTT_PPDU_STATS_TAG_USR_COMPLTN_BA_BITMAP_256) | \
|
||||
BIT(HTT_PPDU_STATS_TAG_INFO) | \
|
||||
BIT(HTT_PPDU_STATS_TAG_TX_MGMTCTRL_PAYLOAD) | \
|
||||
HTT_PPDU_STATS_TAG_DEFAULT)
|
||||
|
||||
/* HTT_H2T_MSG_TYPE_RX_RING_SELECTION_CFG Message
|
||||
*
|
||||
* details:
|
||||
|
@ -2067,7 +2067,8 @@ static void ath11k_dp_rx_deliver_msdu(struct ath11k *ar, struct napi_struct *nap
|
||||
struct sk_buff *msdu)
|
||||
{
|
||||
static const struct ieee80211_radiotap_he known = {
|
||||
.data1 = cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA1_DATA_MCS_KNOWN),
|
||||
.data1 = cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA1_DATA_MCS_KNOWN |
|
||||
IEEE80211_RADIOTAP_HE_DATA1_BW_RU_ALLOC_KNOWN),
|
||||
.data2 = cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA2_GI_KNOWN),
|
||||
};
|
||||
struct ieee80211_rx_status *status;
|
||||
|
@ -461,7 +461,7 @@ void ath11k_dp_tx_completion_handler(struct ath11k_base *ab, int ring_id)
|
||||
int hal_ring_id = dp->tx_ring[ring_id].tcl_comp_ring.ring_id;
|
||||
struct hal_srng *status_ring = &ab->hal.srng_list[hal_ring_id];
|
||||
struct sk_buff *msdu;
|
||||
struct hal_tx_status ts;
|
||||
struct hal_tx_status ts = { 0 };
|
||||
struct dp_tx_ring *tx_ring = &dp->tx_ring[ring_id];
|
||||
u32 *desc;
|
||||
u32 msdu_id;
|
||||
@ -630,7 +630,7 @@ int ath11k_dp_tx_htt_srng_setup(struct ath11k_base *ab, u32 ring_id,
|
||||
dma_addr_t hp_addr, tp_addr;
|
||||
enum htt_srng_ring_type htt_ring_type;
|
||||
enum htt_srng_ring_id htt_ring_id;
|
||||
int ret = 0;
|
||||
int ret;
|
||||
|
||||
skb = ath11k_htc_alloc_skb(ab, len);
|
||||
if (!skb)
|
||||
@ -642,9 +642,10 @@ int ath11k_dp_tx_htt_srng_setup(struct ath11k_base *ab, u32 ring_id,
|
||||
hp_addr = ath11k_hal_srng_get_hp_addr(ab, srng);
|
||||
tp_addr = ath11k_hal_srng_get_tp_addr(ab, srng);
|
||||
|
||||
if (ath11k_dp_tx_get_ring_id_type(ab, mac_id, ring_id,
|
||||
ring_type, &htt_ring_type,
|
||||
&htt_ring_id))
|
||||
ret = ath11k_dp_tx_get_ring_id_type(ab, mac_id, ring_id,
|
||||
ring_type, &htt_ring_type,
|
||||
&htt_ring_id);
|
||||
if (ret)
|
||||
goto err_free;
|
||||
|
||||
skb_put(skb, len);
|
||||
@ -669,10 +670,8 @@ int ath11k_dp_tx_htt_srng_setup(struct ath11k_base *ab, u32 ring_id,
|
||||
HAL_ADDR_MSB_REG_SHIFT;
|
||||
|
||||
ret = ath11k_hal_srng_get_entrysize(ring_type);
|
||||
if (ret < 0) {
|
||||
ret = -EINVAL;
|
||||
if (ret < 0)
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
ring_entry_sz = ret;
|
||||
|
||||
@ -817,7 +816,7 @@ int ath11k_dp_tx_htt_rx_filter_setup(struct ath11k_base *ab, u32 ring_id,
|
||||
int len = sizeof(*cmd);
|
||||
enum htt_srng_ring_type htt_ring_type;
|
||||
enum htt_srng_ring_id htt_ring_id;
|
||||
int ret = 0;
|
||||
int ret;
|
||||
|
||||
skb = ath11k_htc_alloc_skb(ab, len);
|
||||
if (!skb)
|
||||
@ -826,9 +825,10 @@ int ath11k_dp_tx_htt_rx_filter_setup(struct ath11k_base *ab, u32 ring_id,
|
||||
memset(¶ms, 0, sizeof(params));
|
||||
ath11k_hal_srng_get_params(ab, srng, ¶ms);
|
||||
|
||||
if (ath11k_dp_tx_get_ring_id_type(ab, mac_id, ring_id,
|
||||
ring_type, &htt_ring_type,
|
||||
&htt_ring_id))
|
||||
ret = ath11k_dp_tx_get_ring_id_type(ab, mac_id, ring_id,
|
||||
ring_type, &htt_ring_type,
|
||||
&htt_ring_id);
|
||||
if (ret)
|
||||
goto err_free;
|
||||
|
||||
skb_put(skb, len);
|
||||
|
@ -3520,8 +3520,8 @@ static int ath11k_mac_copy_he_cap(struct ath11k *ar,
|
||||
static void ath11k_mac_setup_he_cap(struct ath11k *ar,
|
||||
struct ath11k_pdev_cap *cap)
|
||||
{
|
||||
struct ieee80211_supported_band *band = NULL;
|
||||
int count = 0;
|
||||
struct ieee80211_supported_band *band;
|
||||
int count;
|
||||
|
||||
if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) {
|
||||
count = ath11k_mac_copy_he_cap(ar, cap,
|
||||
@ -3529,6 +3529,7 @@ static void ath11k_mac_setup_he_cap(struct ath11k *ar,
|
||||
NL80211_BAND_2GHZ);
|
||||
band = &ar->mac.sbands[NL80211_BAND_2GHZ];
|
||||
band->iftype_data = ar->mac.iftype[NL80211_BAND_2GHZ];
|
||||
band->n_iftype_data = count;
|
||||
}
|
||||
|
||||
if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP) {
|
||||
@ -3537,9 +3538,8 @@ static void ath11k_mac_setup_he_cap(struct ath11k *ar,
|
||||
NL80211_BAND_5GHZ);
|
||||
band = &ar->mac.sbands[NL80211_BAND_5GHZ];
|
||||
band->iftype_data = ar->mac.iftype[NL80211_BAND_5GHZ];
|
||||
band->n_iftype_data = count;
|
||||
}
|
||||
|
||||
band->n_iftype_data = count;
|
||||
}
|
||||
|
||||
static int __ath11k_set_antenna(struct ath11k *ar, u32 tx_ant, u32 rx_ant)
|
||||
@ -4212,12 +4212,6 @@ static int ath11k_mac_op_add_interface(struct ieee80211_hw *hw,
|
||||
arvif->vdev_id, ret);
|
||||
}
|
||||
|
||||
ret = ath11k_mac_set_txbf_conf(arvif);
|
||||
if (ret) {
|
||||
ath11k_warn(ar->ab, "failed to set txbf conf for vdev %d: %d\n",
|
||||
arvif->vdev_id, ret);
|
||||
}
|
||||
|
||||
ath11k_dp_vdev_tx_attach(ar, arvif);
|
||||
|
||||
mutex_unlock(&ar->conf_mutex);
|
||||
@ -4567,6 +4561,11 @@ ath11k_mac_vdev_start_restart(struct ath11k_vif *arvif,
|
||||
arg.channel.freq, arg.vdev_id);
|
||||
}
|
||||
|
||||
ret = ath11k_mac_set_txbf_conf(arvif);
|
||||
if (ret)
|
||||
ath11k_warn(ab, "failed to set txbf conf for vdev %d: %d\n",
|
||||
arvif->vdev_id, ret);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -5468,7 +5467,7 @@ static const struct ieee80211_ops ath11k_ops = {
|
||||
.flush = ath11k_mac_op_flush,
|
||||
.sta_statistics = ath11k_mac_op_sta_statistics,
|
||||
CFG80211_TESTMODE_CMD(ath11k_tm_cmd)
|
||||
#ifdef CONFIG_MAC80211_DEBUGFS
|
||||
#ifdef CONFIG_ATH11K_DEBUGFS
|
||||
.sta_add_debugfs = ath11k_sta_add_debugfs,
|
||||
#endif
|
||||
};
|
||||
|
@ -406,7 +406,7 @@ static bool ar9003_aic_cal_post_process(struct ath_hw *ah)
|
||||
sram.com_att_6db =
|
||||
ar9003_aic_find_index(1, fixed_com_att_db);
|
||||
|
||||
sram.valid = 1;
|
||||
sram.valid = true;
|
||||
|
||||
sram.rot_dir_att_db =
|
||||
min(max(rot_dir_path_att_db,
|
||||
|
@ -1620,7 +1620,7 @@ int wcn36xx_smd_send_beacon(struct wcn36xx *wcn, struct ieee80211_vif *vif,
|
||||
msg_body.beacon_length6 = msg_body.beacon_length + 6;
|
||||
|
||||
if (msg_body.beacon_length > BEACON_TEMPLATE_SIZE) {
|
||||
wcn36xx_err("Beacon is to big: beacon size=%d\n",
|
||||
wcn36xx_err("Beacon is too big: beacon size=%d\n",
|
||||
msg_body.beacon_length);
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
|
@ -762,7 +762,7 @@ int wil_priv_init(struct wil6210_priv *wil)
|
||||
*/
|
||||
wil->rx_buff_id_count = WIL_RX_BUFF_ARR_SIZE_DEFAULT;
|
||||
|
||||
wil->amsdu_en = 1;
|
||||
wil->amsdu_en = true;
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -1140,7 +1140,7 @@ static int wil_tx_desc_map(union wil_tx_desc *desc, dma_addr_t pa,
|
||||
void wil_tx_data_init(struct wil_ring_tx_data *txdata)
|
||||
{
|
||||
spin_lock_bh(&txdata->lock);
|
||||
txdata->dot1x_open = 0;
|
||||
txdata->dot1x_open = false;
|
||||
txdata->enabled = 0;
|
||||
txdata->idle = 0;
|
||||
txdata->last_idle = 0;
|
||||
|
@ -1513,14 +1513,14 @@ static void wmi_link_stats_parse(struct wil6210_vif *vif, u64 tsf,
|
||||
if (vif->fw_stats_ready) {
|
||||
/* clean old statistics */
|
||||
vif->fw_stats_tsf = 0;
|
||||
vif->fw_stats_ready = 0;
|
||||
vif->fw_stats_ready = false;
|
||||
}
|
||||
|
||||
wil_link_stats_store_basic(vif, payload + hdr_size);
|
||||
|
||||
if (!has_next) {
|
||||
vif->fw_stats_tsf = tsf;
|
||||
vif->fw_stats_ready = 1;
|
||||
vif->fw_stats_ready = true;
|
||||
}
|
||||
|
||||
break;
|
||||
@ -1535,14 +1535,14 @@ static void wmi_link_stats_parse(struct wil6210_vif *vif, u64 tsf,
|
||||
if (wil->fw_stats_global.ready) {
|
||||
/* clean old statistics */
|
||||
wil->fw_stats_global.tsf = 0;
|
||||
wil->fw_stats_global.ready = 0;
|
||||
wil->fw_stats_global.ready = false;
|
||||
}
|
||||
|
||||
wil_link_stats_store_global(vif, payload + hdr_size);
|
||||
|
||||
if (!has_next) {
|
||||
wil->fw_stats_global.tsf = tsf;
|
||||
wil->fw_stats_global.ready = 1;
|
||||
wil->fw_stats_global.ready = true;
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include <linux/vmalloc.h>
|
||||
#include <net/cfg80211.h>
|
||||
#include <net/netlink.h>
|
||||
#include <uapi/linux/if_arp.h>
|
||||
|
||||
#include <brcmu_utils.h>
|
||||
#include <defs.h>
|
||||
@ -619,6 +620,82 @@ static bool brcmf_is_ibssmode(struct brcmf_cfg80211_vif *vif)
|
||||
return vif->wdev.iftype == NL80211_IFTYPE_ADHOC;
|
||||
}
|
||||
|
||||
/**
|
||||
* brcmf_mon_add_vif() - create monitor mode virtual interface
|
||||
*
|
||||
* @wiphy: wiphy device of new interface.
|
||||
* @name: name of the new interface.
|
||||
*/
|
||||
static struct wireless_dev *brcmf_mon_add_vif(struct wiphy *wiphy,
|
||||
const char *name)
|
||||
{
|
||||
struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
|
||||
struct brcmf_cfg80211_vif *vif;
|
||||
struct net_device *ndev;
|
||||
struct brcmf_if *ifp;
|
||||
int err;
|
||||
|
||||
if (cfg->pub->mon_if) {
|
||||
err = -EEXIST;
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_MONITOR);
|
||||
if (IS_ERR(vif)) {
|
||||
err = PTR_ERR(vif);
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
ndev = alloc_netdev(sizeof(*ifp), name, NET_NAME_UNKNOWN, ether_setup);
|
||||
if (!ndev) {
|
||||
err = -ENOMEM;
|
||||
goto err_free_vif;
|
||||
}
|
||||
ndev->type = ARPHRD_IEEE80211_RADIOTAP;
|
||||
ndev->ieee80211_ptr = &vif->wdev;
|
||||
ndev->needs_free_netdev = true;
|
||||
ndev->priv_destructor = brcmf_cfg80211_free_netdev;
|
||||
SET_NETDEV_DEV(ndev, wiphy_dev(cfg->wiphy));
|
||||
|
||||
ifp = netdev_priv(ndev);
|
||||
ifp->vif = vif;
|
||||
ifp->ndev = ndev;
|
||||
ifp->drvr = cfg->pub;
|
||||
|
||||
vif->ifp = ifp;
|
||||
vif->wdev.netdev = ndev;
|
||||
|
||||
err = brcmf_net_mon_attach(ifp);
|
||||
if (err) {
|
||||
brcmf_err("Failed to attach %s device\n", ndev->name);
|
||||
free_netdev(ndev);
|
||||
goto err_free_vif;
|
||||
}
|
||||
|
||||
cfg->pub->mon_if = ifp;
|
||||
|
||||
return &vif->wdev;
|
||||
|
||||
err_free_vif:
|
||||
brcmf_free_vif(vif);
|
||||
err_out:
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
static int brcmf_mon_del_vif(struct wiphy *wiphy, struct wireless_dev *wdev)
|
||||
{
|
||||
struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
|
||||
struct net_device *ndev = wdev->netdev;
|
||||
|
||||
ndev->netdev_ops->ndo_stop(ndev);
|
||||
|
||||
brcmf_net_detach(ndev, true);
|
||||
|
||||
cfg->pub->mon_if = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct wireless_dev *brcmf_cfg80211_add_iface(struct wiphy *wiphy,
|
||||
const char *name,
|
||||
unsigned char name_assign_type,
|
||||
@ -641,9 +718,10 @@ static struct wireless_dev *brcmf_cfg80211_add_iface(struct wiphy *wiphy,
|
||||
case NL80211_IFTYPE_STATION:
|
||||
case NL80211_IFTYPE_AP_VLAN:
|
||||
case NL80211_IFTYPE_WDS:
|
||||
case NL80211_IFTYPE_MONITOR:
|
||||
case NL80211_IFTYPE_MESH_POINT:
|
||||
return ERR_PTR(-EOPNOTSUPP);
|
||||
case NL80211_IFTYPE_MONITOR:
|
||||
return brcmf_mon_add_vif(wiphy, name);
|
||||
case NL80211_IFTYPE_AP:
|
||||
wdev = brcmf_ap_add_vif(wiphy, name, params);
|
||||
break;
|
||||
@ -826,9 +904,10 @@ int brcmf_cfg80211_del_iface(struct wiphy *wiphy, struct wireless_dev *wdev)
|
||||
case NL80211_IFTYPE_STATION:
|
||||
case NL80211_IFTYPE_AP_VLAN:
|
||||
case NL80211_IFTYPE_WDS:
|
||||
case NL80211_IFTYPE_MONITOR:
|
||||
case NL80211_IFTYPE_MESH_POINT:
|
||||
return -EOPNOTSUPP;
|
||||
case NL80211_IFTYPE_MONITOR:
|
||||
return brcmf_mon_del_vif(wiphy, wdev);
|
||||
case NL80211_IFTYPE_AP:
|
||||
return brcmf_cfg80211_del_ap_iface(wiphy, wdev);
|
||||
case NL80211_IFTYPE_P2P_CLIENT:
|
||||
@ -6547,12 +6626,14 @@ static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
|
||||
struct ieee80211_iface_limit *c0_limits = NULL;
|
||||
struct ieee80211_iface_limit *p2p_limits = NULL;
|
||||
struct ieee80211_iface_limit *mbss_limits = NULL;
|
||||
bool mbss, p2p, rsdb;
|
||||
int i, c, n_combos;
|
||||
bool mon_flag, mbss, p2p, rsdb, mchan;
|
||||
int i, c, n_combos, n_limits;
|
||||
|
||||
mon_flag = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MONITOR_FLAG);
|
||||
mbss = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS);
|
||||
p2p = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_P2P);
|
||||
rsdb = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_RSDB);
|
||||
mchan = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MCHAN);
|
||||
|
||||
n_combos = 1 + !!(p2p && !rsdb) + !!mbss;
|
||||
combo = kcalloc(n_combos, sizeof(*combo), GFP_KERNEL);
|
||||
@ -6562,59 +6643,45 @@ static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
|
||||
wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
|
||||
BIT(NL80211_IFTYPE_ADHOC) |
|
||||
BIT(NL80211_IFTYPE_AP);
|
||||
|
||||
c = 0;
|
||||
i = 0;
|
||||
if (p2p && rsdb)
|
||||
c0_limits = kcalloc(4, sizeof(*c0_limits), GFP_KERNEL);
|
||||
else if (p2p)
|
||||
c0_limits = kcalloc(3, sizeof(*c0_limits), GFP_KERNEL);
|
||||
else
|
||||
c0_limits = kcalloc(2, sizeof(*c0_limits), GFP_KERNEL);
|
||||
if (!c0_limits)
|
||||
goto err;
|
||||
if (p2p && rsdb) {
|
||||
combo[c].num_different_channels = 2;
|
||||
if (mon_flag)
|
||||
wiphy->interface_modes |= BIT(NL80211_IFTYPE_MONITOR);
|
||||
if (p2p)
|
||||
wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
|
||||
BIT(NL80211_IFTYPE_P2P_GO) |
|
||||
BIT(NL80211_IFTYPE_P2P_DEVICE);
|
||||
c0_limits[i].max = 2;
|
||||
c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
|
||||
|
||||
c = 0;
|
||||
i = 0;
|
||||
n_limits = 1 + mon_flag + (p2p ? 2 : 0) + (rsdb || !p2p);
|
||||
c0_limits = kcalloc(n_limits, sizeof(*c0_limits), GFP_KERNEL);
|
||||
if (!c0_limits)
|
||||
goto err;
|
||||
|
||||
combo[c].num_different_channels = 1 + (rsdb || (p2p && mchan));
|
||||
c0_limits[i].max = 1 + rsdb;
|
||||
c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
|
||||
if (mon_flag) {
|
||||
c0_limits[i].max = 1;
|
||||
c0_limits[i++].types = BIT(NL80211_IFTYPE_MONITOR);
|
||||
}
|
||||
if (p2p) {
|
||||
c0_limits[i].max = 1;
|
||||
c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_DEVICE);
|
||||
c0_limits[i].max = 2;
|
||||
c0_limits[i].max = 1 + rsdb;
|
||||
c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
|
||||
BIT(NL80211_IFTYPE_P2P_GO);
|
||||
}
|
||||
if (p2p && rsdb) {
|
||||
c0_limits[i].max = 2;
|
||||
c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
|
||||
combo[c].max_interfaces = 5;
|
||||
} else if (p2p) {
|
||||
if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MCHAN))
|
||||
combo[c].num_different_channels = 2;
|
||||
else
|
||||
combo[c].num_different_channels = 1;
|
||||
c0_limits[i].max = 1;
|
||||
c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
|
||||
wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
|
||||
BIT(NL80211_IFTYPE_P2P_GO) |
|
||||
BIT(NL80211_IFTYPE_P2P_DEVICE);
|
||||
c0_limits[i].max = 1;
|
||||
c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_DEVICE);
|
||||
c0_limits[i].max = 1;
|
||||
c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
|
||||
BIT(NL80211_IFTYPE_P2P_GO);
|
||||
combo[c].max_interfaces = i;
|
||||
} else if (rsdb) {
|
||||
combo[c].num_different_channels = 2;
|
||||
c0_limits[i].max = 2;
|
||||
c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
|
||||
c0_limits[i].max = 2;
|
||||
c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
|
||||
combo[c].max_interfaces = 3;
|
||||
} else {
|
||||
combo[c].num_different_channels = 1;
|
||||
c0_limits[i].max = 1;
|
||||
c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
|
||||
c0_limits[i].max = 1;
|
||||
c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
|
||||
combo[c].max_interfaces = i;
|
||||
@ -6645,14 +6712,20 @@ static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
|
||||
if (mbss) {
|
||||
c++;
|
||||
i = 0;
|
||||
mbss_limits = kcalloc(1, sizeof(*mbss_limits), GFP_KERNEL);
|
||||
n_limits = 1 + mon_flag;
|
||||
mbss_limits = kcalloc(n_limits, sizeof(*mbss_limits),
|
||||
GFP_KERNEL);
|
||||
if (!mbss_limits)
|
||||
goto err;
|
||||
mbss_limits[i].max = 4;
|
||||
mbss_limits[i++].types = BIT(NL80211_IFTYPE_AP);
|
||||
if (mon_flag) {
|
||||
mbss_limits[i].max = 1;
|
||||
mbss_limits[i++].types = BIT(NL80211_IFTYPE_MONITOR);
|
||||
}
|
||||
combo[c].beacon_int_infra_match = true;
|
||||
combo[c].num_different_channels = 1;
|
||||
combo[c].max_interfaces = 4;
|
||||
combo[c].max_interfaces = 4 + mon_flag;
|
||||
combo[c].n_limits = i;
|
||||
combo[c].limits = mbss_limits;
|
||||
}
|
||||
|
@ -673,7 +673,7 @@ int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked)
|
||||
return -EBADE;
|
||||
}
|
||||
|
||||
static void brcmf_net_detach(struct net_device *ndev, bool rtnl_locked)
|
||||
void brcmf_net_detach(struct net_device *ndev, bool rtnl_locked)
|
||||
{
|
||||
if (ndev->reg_state == NETREG_REGISTERED) {
|
||||
if (rtnl_locked)
|
||||
@ -686,6 +686,72 @@ static void brcmf_net_detach(struct net_device *ndev, bool rtnl_locked)
|
||||
}
|
||||
}
|
||||
|
||||
static int brcmf_net_mon_open(struct net_device *ndev)
|
||||
{
|
||||
struct brcmf_if *ifp = netdev_priv(ndev);
|
||||
struct brcmf_pub *drvr = ifp->drvr;
|
||||
u32 monitor;
|
||||
int err;
|
||||
|
||||
brcmf_dbg(TRACE, "Enter\n");
|
||||
|
||||
err = brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_MONITOR, &monitor);
|
||||
if (err) {
|
||||
bphy_err(drvr, "BRCMF_C_GET_MONITOR error (%d)\n", err);
|
||||
return err;
|
||||
} else if (monitor) {
|
||||
bphy_err(drvr, "Monitor mode is already enabled\n");
|
||||
return -EEXIST;
|
||||
}
|
||||
|
||||
monitor = 3;
|
||||
err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_MONITOR, monitor);
|
||||
if (err)
|
||||
bphy_err(drvr, "BRCMF_C_SET_MONITOR error (%d)\n", err);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int brcmf_net_mon_stop(struct net_device *ndev)
|
||||
{
|
||||
struct brcmf_if *ifp = netdev_priv(ndev);
|
||||
struct brcmf_pub *drvr = ifp->drvr;
|
||||
u32 monitor;
|
||||
int err;
|
||||
|
||||
brcmf_dbg(TRACE, "Enter\n");
|
||||
|
||||
monitor = 0;
|
||||
err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_MONITOR, monitor);
|
||||
if (err)
|
||||
bphy_err(drvr, "BRCMF_C_SET_MONITOR error (%d)\n", err);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static const struct net_device_ops brcmf_netdev_ops_mon = {
|
||||
.ndo_open = brcmf_net_mon_open,
|
||||
.ndo_stop = brcmf_net_mon_stop,
|
||||
};
|
||||
|
||||
int brcmf_net_mon_attach(struct brcmf_if *ifp)
|
||||
{
|
||||
struct brcmf_pub *drvr = ifp->drvr;
|
||||
struct net_device *ndev;
|
||||
int err;
|
||||
|
||||
brcmf_dbg(TRACE, "Enter\n");
|
||||
|
||||
ndev = ifp->ndev;
|
||||
ndev->netdev_ops = &brcmf_netdev_ops_mon;
|
||||
|
||||
err = register_netdevice(ndev);
|
||||
if (err)
|
||||
bphy_err(drvr, "Failed to register %s device\n", ndev->name);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on)
|
||||
{
|
||||
struct net_device *ndev;
|
||||
|
@ -210,6 +210,8 @@ void brcmf_txflowblock_if(struct brcmf_if *ifp,
|
||||
void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success);
|
||||
void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb);
|
||||
void brcmf_netif_mon_rx(struct brcmf_if *ifp, struct sk_buff *skb);
|
||||
void brcmf_net_detach(struct net_device *ndev, bool rtnl_locked);
|
||||
int brcmf_net_mon_attach(struct brcmf_if *ifp);
|
||||
void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on);
|
||||
int __init brcmf_core_init(void);
|
||||
void __exit brcmf_core_exit(void);
|
||||
|
@ -38,6 +38,7 @@ static const struct brcmf_feat_fwcap brcmf_fwcap_map[] = {
|
||||
{ BRCMF_FEAT_MCHAN, "mchan" },
|
||||
{ BRCMF_FEAT_P2P, "p2p" },
|
||||
{ BRCMF_FEAT_MONITOR, "monitor" },
|
||||
{ BRCMF_FEAT_MONITOR_FLAG, "rtap" },
|
||||
{ BRCMF_FEAT_MONITOR_FMT_RADIOTAP, "rtap" },
|
||||
{ BRCMF_FEAT_DOT11H, "802.11h" },
|
||||
{ BRCMF_FEAT_SAE, "sae" },
|
||||
|
@ -23,6 +23,7 @@
|
||||
* GSCAN: enhanced scan offload feature.
|
||||
* FWSUP: Firmware supplicant.
|
||||
* MONITOR: firmware can pass monitor packets to host.
|
||||
* MONITOR_FLAG: firmware flags monitor packets.
|
||||
* MONITOR_FMT_RADIOTAP: firmware provides monitor packets with radiotap header
|
||||
* MONITOR_FMT_HW_RX_HDR: firmware provides monitor packets with hw/ucode header
|
||||
* DOT11H: firmware supports 802.11h
|
||||
@ -44,6 +45,7 @@
|
||||
BRCMF_FEAT_DEF(GSCAN) \
|
||||
BRCMF_FEAT_DEF(FWSUP) \
|
||||
BRCMF_FEAT_DEF(MONITOR) \
|
||||
BRCMF_FEAT_DEF(MONITOR_FLAG) \
|
||||
BRCMF_FEAT_DEF(MONITOR_FMT_RADIOTAP) \
|
||||
BRCMF_FEAT_DEF(MONITOR_FMT_HW_RX_HDR) \
|
||||
BRCMF_FEAT_DEF(DOT11H) \
|
||||
|
@ -49,6 +49,8 @@
|
||||
#define BRCMF_C_GET_PM 85
|
||||
#define BRCMF_C_SET_PM 86
|
||||
#define BRCMF_C_GET_REVINFO 98
|
||||
#define BRCMF_C_GET_MONITOR 107
|
||||
#define BRCMF_C_SET_MONITOR 108
|
||||
#define BRCMF_C_GET_CURR_RATESET 114
|
||||
#define BRCMF_C_GET_AP 117
|
||||
#define BRCMF_C_SET_AP 118
|
||||
|
@ -908,7 +908,7 @@ static u8 brcmf_fws_hdrpush(struct brcmf_fws_info *fws, struct sk_buff *skb)
|
||||
wlh += wlh[1] + 2;
|
||||
|
||||
if (entry->send_tim_signal) {
|
||||
entry->send_tim_signal = 0;
|
||||
entry->send_tim_signal = false;
|
||||
wlh[0] = BRCMF_FWS_TYPE_PENDING_TRAFFIC_BMP;
|
||||
wlh[1] = BRCMF_FWS_TYPE_PENDING_TRAFFIC_BMP_LEN;
|
||||
wlh[2] = entry->mac_handle;
|
||||
|
@ -365,7 +365,7 @@ brcmf_msgbuf_get_pktid(struct device *dev, struct brcmf_msgbuf_pktids *pktids,
|
||||
struct brcmf_msgbuf_pktid *pktid;
|
||||
struct sk_buff *skb;
|
||||
|
||||
if (idx < 0 || idx >= pktids->array_size) {
|
||||
if (idx >= pktids->array_size) {
|
||||
brcmf_err("Invalid packet id %d (max %d)\n", idx,
|
||||
pktids->array_size);
|
||||
return NULL;
|
||||
|
@ -4243,6 +4243,12 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err,
|
||||
}
|
||||
|
||||
if (err == 0) {
|
||||
/* Assign bus interface call back */
|
||||
sdiod->bus_if->dev = sdiod->dev;
|
||||
sdiod->bus_if->ops = &brcmf_sdio_bus_ops;
|
||||
sdiod->bus_if->chip = bus->ci->chip;
|
||||
sdiod->bus_if->chiprev = bus->ci->chiprev;
|
||||
|
||||
/* Allow full data communication using DPC from now on. */
|
||||
brcmf_sdiod_change_state(bus->sdiodev, BRCMF_SDIOD_DATA);
|
||||
|
||||
@ -4259,12 +4265,6 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err,
|
||||
|
||||
sdio_release_host(sdiod->func1);
|
||||
|
||||
/* Assign bus interface call back */
|
||||
sdiod->bus_if->dev = sdiod->dev;
|
||||
sdiod->bus_if->ops = &brcmf_sdio_bus_ops;
|
||||
sdiod->bus_if->chip = bus->ci->chip;
|
||||
sdiod->bus_if->chiprev = bus->ci->chiprev;
|
||||
|
||||
err = brcmf_alloc(sdiod->dev, sdiod->settings);
|
||||
if (err) {
|
||||
brcmf_err("brcmf_alloc failed\n");
|
||||
|
@ -699,7 +699,7 @@ il_eeprom_init(struct il_priv *il)
|
||||
u32 gp = _il_rd(il, CSR_EEPROM_GP);
|
||||
int sz;
|
||||
int ret;
|
||||
u16 addr;
|
||||
int addr;
|
||||
|
||||
/* allocate eeprom */
|
||||
sz = il->cfg->eeprom_size;
|
||||
|
@ -77,8 +77,7 @@ static const struct iwl_eeprom_params iwl1000_eeprom_params = {
|
||||
.trans.base_params = &iwl1000_base_params, \
|
||||
.eeprom_params = &iwl1000_eeprom_params, \
|
||||
.led_mode = IWL_LED_BLINK, \
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K, \
|
||||
.trans.csr = &iwl_csr_v1
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K
|
||||
|
||||
const struct iwl_cfg iwl1000_bgn_cfg = {
|
||||
.name = "Intel(R) Centrino(R) Wireless-N 1000 BGN",
|
||||
@ -104,8 +103,7 @@ const struct iwl_cfg iwl1000_bg_cfg = {
|
||||
.eeprom_params = &iwl1000_eeprom_params, \
|
||||
.led_mode = IWL_LED_RF_STATE, \
|
||||
.rx_with_siso_diversity = true, \
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K, \
|
||||
.trans.csr = &iwl_csr_v1
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K
|
||||
|
||||
const struct iwl_cfg iwl100_bgn_cfg = {
|
||||
.name = "Intel(R) Centrino(R) Wireless-N 100 BGN",
|
||||
|
@ -103,8 +103,7 @@ static const struct iwl_eeprom_params iwl20x0_eeprom_params = {
|
||||
.trans.base_params = &iwl2000_base_params, \
|
||||
.eeprom_params = &iwl20x0_eeprom_params, \
|
||||
.led_mode = IWL_LED_RF_STATE, \
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K, \
|
||||
.trans.csr = &iwl_csr_v1
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K
|
||||
|
||||
|
||||
const struct iwl_cfg iwl2000_2bgn_cfg = {
|
||||
@ -131,8 +130,7 @@ const struct iwl_cfg iwl2000_2bgn_d_cfg = {
|
||||
.trans.base_params = &iwl2030_base_params, \
|
||||
.eeprom_params = &iwl20x0_eeprom_params, \
|
||||
.led_mode = IWL_LED_RF_STATE, \
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K, \
|
||||
.trans.csr = &iwl_csr_v1
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K
|
||||
|
||||
const struct iwl_cfg iwl2030_2bgn_cfg = {
|
||||
.name = "Intel(R) Centrino(R) Wireless-N 2230 BGN",
|
||||
@ -153,8 +151,7 @@ const struct iwl_cfg iwl2030_2bgn_cfg = {
|
||||
.eeprom_params = &iwl20x0_eeprom_params, \
|
||||
.led_mode = IWL_LED_RF_STATE, \
|
||||
.rx_with_siso_diversity = true, \
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K, \
|
||||
.trans.csr = &iwl_csr_v1
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K
|
||||
|
||||
const struct iwl_cfg iwl105_bgn_cfg = {
|
||||
.name = "Intel(R) Centrino(R) Wireless-N 105 BGN",
|
||||
@ -181,8 +178,7 @@ const struct iwl_cfg iwl105_bgn_d_cfg = {
|
||||
.eeprom_params = &iwl20x0_eeprom_params, \
|
||||
.led_mode = IWL_LED_RF_STATE, \
|
||||
.rx_with_siso_diversity = true, \
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K, \
|
||||
.trans.csr = &iwl_csr_v1
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K
|
||||
|
||||
const struct iwl_cfg iwl135_bgn_cfg = {
|
||||
.name = "Intel(R) Centrino(R) Wireless-N 135 BGN",
|
||||
|
@ -92,6 +92,7 @@
|
||||
#define IWL_22000_SO_A_GF_A_FW_PRE "iwlwifi-so-a0-gf-a0-"
|
||||
#define IWL_22000_TY_A_GF_A_FW_PRE "iwlwifi-ty-a0-gf-a0-"
|
||||
#define IWL_22000_SO_A_GF4_A_FW_PRE "iwlwifi-so-a0-gf4-a0-"
|
||||
#define IWL_22000_SOSNJ_A_GF4_A_FW_PRE "iwlwifi-SoSnj-a0-gf4-a0-"
|
||||
|
||||
#define IWL_22000_HR_MODULE_FIRMWARE(api) \
|
||||
IWL_22000_HR_FW_PRE __stringify(api) ".ucode"
|
||||
@ -199,7 +200,6 @@ static const struct iwl_ht_params iwl_22000_ht_params = {
|
||||
IWL_DEVICE_22000_COMMON, \
|
||||
.trans.device_family = IWL_DEVICE_FAMILY_22000, \
|
||||
.trans.base_params = &iwl_22000_base_params, \
|
||||
.trans.csr = &iwl_csr_v1, \
|
||||
.gp2_reg_addr = 0xa02c68, \
|
||||
.mon_dram_regs = { \
|
||||
.write_ptr = { \
|
||||
@ -217,7 +217,6 @@ static const struct iwl_ht_params iwl_22000_ht_params = {
|
||||
.trans.umac_prph_offset = 0x300000, \
|
||||
.trans.device_family = IWL_DEVICE_FAMILY_AX210, \
|
||||
.trans.base_params = &iwl_ax210_base_params, \
|
||||
.trans.csr = &iwl_csr_v1, \
|
||||
.min_txq_size = 128, \
|
||||
.gp2_reg_addr = 0xd02c68, \
|
||||
.min_256_ba_txq_size = 512, \
|
||||
@ -236,24 +235,16 @@ static const struct iwl_ht_params iwl_22000_ht_params = {
|
||||
}, \
|
||||
}
|
||||
|
||||
const struct iwl_cfg iwl22000_2ac_cfg_hr = {
|
||||
.name = "Intel(R) Dual Band Wireless AC 22000",
|
||||
.fw_name_pre = IWL_22000_HR_FW_PRE,
|
||||
IWL_DEVICE_22500,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl22000_2ac_cfg_hr_cdb = {
|
||||
.name = "Intel(R) Dual Band Wireless AC 22000",
|
||||
.fw_name_pre = IWL_22000_HR_CDB_FW_PRE,
|
||||
IWL_DEVICE_22500,
|
||||
.cdb = true,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl22000_2ac_cfg_jf = {
|
||||
.name = "Intel(R) Dual Band Wireless AC 22000",
|
||||
.fw_name_pre = IWL_22000_JF_FW_PRE,
|
||||
IWL_DEVICE_22500,
|
||||
};
|
||||
/*
|
||||
* If the device doesn't support HE, no need to have that many buffers.
|
||||
* 22000 devices can split multiple frames into a single RB, so fewer are
|
||||
* needed; AX210 cannot (but use smaller RBs by default) - these sizes
|
||||
* were picked according to 8 MSDUs inside 256 A-MSDUs in an A-MPDU, with
|
||||
* additional overhead to account for processing time.
|
||||
*/
|
||||
#define IWL_NUM_RBDS_NON_HE 512
|
||||
#define IWL_NUM_RBDS_22000_HE 2048
|
||||
#define IWL_NUM_RBDS_AX210_HE 4096
|
||||
|
||||
const struct iwl_cfg iwl_ax101_cfg_qu_hr = {
|
||||
.name = "Intel(R) Wi-Fi 6 AX101",
|
||||
@ -266,6 +257,7 @@ const struct iwl_cfg iwl_ax101_cfg_qu_hr = {
|
||||
*/
|
||||
.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
|
||||
.tx_with_siso_diversity = true,
|
||||
.num_rbds = IWL_NUM_RBDS_22000_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl_ax201_cfg_qu_hr = {
|
||||
@ -278,6 +270,7 @@ const struct iwl_cfg iwl_ax201_cfg_qu_hr = {
|
||||
* HT size; mac80211 would otherwise pick the HE max (256) by default.
|
||||
*/
|
||||
.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
|
||||
.num_rbds = IWL_NUM_RBDS_22000_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl_ax101_cfg_qu_c0_hr_b0 = {
|
||||
@ -290,6 +283,7 @@ const struct iwl_cfg iwl_ax101_cfg_qu_c0_hr_b0 = {
|
||||
* HT size; mac80211 would otherwise pick the HE max (256) by default.
|
||||
*/
|
||||
.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
|
||||
.num_rbds = IWL_NUM_RBDS_22000_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl_ax201_cfg_qu_c0_hr_b0 = {
|
||||
@ -302,6 +296,7 @@ const struct iwl_cfg iwl_ax201_cfg_qu_c0_hr_b0 = {
|
||||
* HT size; mac80211 would otherwise pick the HE max (256) by default.
|
||||
*/
|
||||
.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
|
||||
.num_rbds = IWL_NUM_RBDS_22000_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl_ax101_cfg_quz_hr = {
|
||||
@ -314,6 +309,7 @@ const struct iwl_cfg iwl_ax101_cfg_quz_hr = {
|
||||
* HT size; mac80211 would otherwise pick the HE max (256) by default.
|
||||
*/
|
||||
.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
|
||||
.num_rbds = IWL_NUM_RBDS_22000_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl_ax201_cfg_quz_hr = {
|
||||
@ -326,6 +322,7 @@ const struct iwl_cfg iwl_ax201_cfg_quz_hr = {
|
||||
* HT size; mac80211 would otherwise pick the HE max (256) by default.
|
||||
*/
|
||||
.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
|
||||
.num_rbds = IWL_NUM_RBDS_22000_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl_ax1650s_cfg_quz_hr = {
|
||||
@ -338,6 +335,7 @@ const struct iwl_cfg iwl_ax1650s_cfg_quz_hr = {
|
||||
* HT size; mac80211 would otherwise pick the HE max (256) by default.
|
||||
*/
|
||||
.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
|
||||
.num_rbds = IWL_NUM_RBDS_22000_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl_ax1650i_cfg_quz_hr = {
|
||||
@ -350,6 +348,7 @@ const struct iwl_cfg iwl_ax1650i_cfg_quz_hr = {
|
||||
* HT size; mac80211 would otherwise pick the HE max (256) by default.
|
||||
*/
|
||||
.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
|
||||
.num_rbds = IWL_NUM_RBDS_22000_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl_ax200_cfg_cc = {
|
||||
@ -363,6 +362,7 @@ const struct iwl_cfg iwl_ax200_cfg_cc = {
|
||||
*/
|
||||
.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
|
||||
.trans.bisr_workaround = 1,
|
||||
.num_rbds = IWL_NUM_RBDS_22000_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg killer1650x_2ax_cfg = {
|
||||
@ -376,6 +376,7 @@ const struct iwl_cfg killer1650x_2ax_cfg = {
|
||||
*/
|
||||
.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
|
||||
.trans.bisr_workaround = 1,
|
||||
.num_rbds = IWL_NUM_RBDS_22000_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg killer1650w_2ax_cfg = {
|
||||
@ -389,6 +390,7 @@ const struct iwl_cfg killer1650w_2ax_cfg = {
|
||||
*/
|
||||
.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
|
||||
.trans.bisr_workaround = 1,
|
||||
.num_rbds = IWL_NUM_RBDS_22000_HE,
|
||||
};
|
||||
|
||||
/*
|
||||
@ -400,48 +402,56 @@ const struct iwl_cfg iwl9461_2ac_cfg_qu_b0_jf_b0 = {
|
||||
.name = "Intel(R) Wireless-AC 9461",
|
||||
.fw_name_pre = IWL_QU_B_JF_B_FW_PRE,
|
||||
IWL_DEVICE_22500,
|
||||
.num_rbds = IWL_NUM_RBDS_NON_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl9462_2ac_cfg_qu_b0_jf_b0 = {
|
||||
.name = "Intel(R) Wireless-AC 9462",
|
||||
.fw_name_pre = IWL_QU_B_JF_B_FW_PRE,
|
||||
IWL_DEVICE_22500,
|
||||
.num_rbds = IWL_NUM_RBDS_NON_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl9560_2ac_cfg_qu_b0_jf_b0 = {
|
||||
.name = "Intel(R) Wireless-AC 9560",
|
||||
.fw_name_pre = IWL_QU_B_JF_B_FW_PRE,
|
||||
IWL_DEVICE_22500,
|
||||
.num_rbds = IWL_NUM_RBDS_NON_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl9560_2ac_160_cfg_qu_b0_jf_b0 = {
|
||||
.name = "Intel(R) Wireless-AC 9560 160MHz",
|
||||
.fw_name_pre = IWL_QU_B_JF_B_FW_PRE,
|
||||
IWL_DEVICE_22500,
|
||||
.num_rbds = IWL_NUM_RBDS_NON_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl9461_2ac_cfg_qu_c0_jf_b0 = {
|
||||
.name = "Intel(R) Wireless-AC 9461",
|
||||
.fw_name_pre = IWL_QU_C_JF_B_FW_PRE,
|
||||
IWL_DEVICE_22500,
|
||||
.num_rbds = IWL_NUM_RBDS_NON_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl9462_2ac_cfg_qu_c0_jf_b0 = {
|
||||
.name = "Intel(R) Wireless-AC 9462",
|
||||
.fw_name_pre = IWL_QU_C_JF_B_FW_PRE,
|
||||
IWL_DEVICE_22500,
|
||||
.num_rbds = IWL_NUM_RBDS_NON_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl9560_2ac_cfg_qu_c0_jf_b0 = {
|
||||
.name = "Intel(R) Wireless-AC 9560",
|
||||
.fw_name_pre = IWL_QU_C_JF_B_FW_PRE,
|
||||
IWL_DEVICE_22500,
|
||||
.num_rbds = IWL_NUM_RBDS_NON_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl9560_2ac_160_cfg_qu_c0_jf_b0 = {
|
||||
.name = "Intel(R) Wireless-AC 9560 160MHz",
|
||||
.fw_name_pre = IWL_QU_C_JF_B_FW_PRE,
|
||||
IWL_DEVICE_22500,
|
||||
.num_rbds = IWL_NUM_RBDS_NON_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl9560_2ac_cfg_qnj_jf_b0 = {
|
||||
@ -454,6 +464,7 @@ const struct iwl_cfg iwl9560_2ac_cfg_qnj_jf_b0 = {
|
||||
* HT size; mac80211 would otherwise pick the HE max (256) by default.
|
||||
*/
|
||||
.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
|
||||
.num_rbds = IWL_NUM_RBDS_NON_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl9560_2ac_cfg_quz_a0_jf_b0_soc = {
|
||||
@ -468,6 +479,7 @@ const struct iwl_cfg iwl9560_2ac_cfg_quz_a0_jf_b0_soc = {
|
||||
.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
|
||||
.integrated = true,
|
||||
.soc_latency = 5000,
|
||||
.num_rbds = IWL_NUM_RBDS_NON_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl9560_2ac_160_cfg_quz_a0_jf_b0_soc = {
|
||||
@ -482,6 +494,7 @@ const struct iwl_cfg iwl9560_2ac_160_cfg_quz_a0_jf_b0_soc = {
|
||||
.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
|
||||
.integrated = true,
|
||||
.soc_latency = 5000,
|
||||
.num_rbds = IWL_NUM_RBDS_NON_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl9461_2ac_cfg_quz_a0_jf_b0_soc = {
|
||||
@ -496,6 +509,7 @@ const struct iwl_cfg iwl9461_2ac_cfg_quz_a0_jf_b0_soc = {
|
||||
.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
|
||||
.integrated = true,
|
||||
.soc_latency = 5000,
|
||||
.num_rbds = IWL_NUM_RBDS_NON_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl9462_2ac_cfg_quz_a0_jf_b0_soc = {
|
||||
@ -510,6 +524,7 @@ const struct iwl_cfg iwl9462_2ac_cfg_quz_a0_jf_b0_soc = {
|
||||
.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
|
||||
.integrated = true,
|
||||
.soc_latency = 5000,
|
||||
.num_rbds = IWL_NUM_RBDS_NON_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl9560_killer_s_2ac_cfg_quz_a0_jf_b0_soc = {
|
||||
@ -524,6 +539,7 @@ const struct iwl_cfg iwl9560_killer_s_2ac_cfg_quz_a0_jf_b0_soc = {
|
||||
.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
|
||||
.integrated = true,
|
||||
.soc_latency = 5000,
|
||||
.num_rbds = IWL_NUM_RBDS_NON_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl9560_killer_i_2ac_cfg_quz_a0_jf_b0_soc = {
|
||||
@ -538,18 +554,21 @@ const struct iwl_cfg iwl9560_killer_i_2ac_cfg_quz_a0_jf_b0_soc = {
|
||||
.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
|
||||
.integrated = true,
|
||||
.soc_latency = 5000,
|
||||
.num_rbds = IWL_NUM_RBDS_NON_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg killer1550i_2ac_cfg_qu_b0_jf_b0 = {
|
||||
.name = "Killer (R) Wireless-AC 1550i Wireless Network Adapter (9560NGW)",
|
||||
.fw_name_pre = IWL_QU_B_JF_B_FW_PRE,
|
||||
IWL_DEVICE_22500,
|
||||
.num_rbds = IWL_NUM_RBDS_NON_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg killer1550s_2ac_cfg_qu_b0_jf_b0 = {
|
||||
.name = "Killer (R) Wireless-AC 1550s Wireless Network Adapter (9560NGW)",
|
||||
.fw_name_pre = IWL_QU_B_JF_B_FW_PRE,
|
||||
IWL_DEVICE_22500,
|
||||
.num_rbds = IWL_NUM_RBDS_NON_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg killer1650s_2ax_cfg_qu_b0_hr_b0 = {
|
||||
@ -562,6 +581,7 @@ const struct iwl_cfg killer1650s_2ax_cfg_qu_b0_hr_b0 = {
|
||||
* HT size; mac80211 would otherwise pick the HE max (256) by default.
|
||||
*/
|
||||
.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
|
||||
.num_rbds = IWL_NUM_RBDS_22000_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg killer1650i_2ax_cfg_qu_b0_hr_b0 = {
|
||||
@ -574,6 +594,7 @@ const struct iwl_cfg killer1650i_2ax_cfg_qu_b0_hr_b0 = {
|
||||
* HT size; mac80211 would otherwise pick the HE max (256) by default.
|
||||
*/
|
||||
.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
|
||||
.num_rbds = IWL_NUM_RBDS_22000_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg killer1650s_2ax_cfg_qu_c0_hr_b0 = {
|
||||
@ -586,6 +607,7 @@ const struct iwl_cfg killer1650s_2ax_cfg_qu_c0_hr_b0 = {
|
||||
* HT size; mac80211 would otherwise pick the HE max (256) by default.
|
||||
*/
|
||||
.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
|
||||
.num_rbds = IWL_NUM_RBDS_22000_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg killer1650i_2ax_cfg_qu_c0_hr_b0 = {
|
||||
@ -598,6 +620,7 @@ const struct iwl_cfg killer1650i_2ax_cfg_qu_c0_hr_b0 = {
|
||||
* HT size; mac80211 would otherwise pick the HE max (256) by default.
|
||||
*/
|
||||
.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
|
||||
.num_rbds = IWL_NUM_RBDS_22000_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl22000_2ax_cfg_jf = {
|
||||
@ -610,6 +633,7 @@ const struct iwl_cfg iwl22000_2ax_cfg_jf = {
|
||||
* HT size; mac80211 would otherwise pick the HE max (256) by default.
|
||||
*/
|
||||
.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
|
||||
.num_rbds = IWL_NUM_RBDS_22000_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl22000_2ax_cfg_qnj_hr_a0_f0 = {
|
||||
@ -622,6 +646,7 @@ const struct iwl_cfg iwl22000_2ax_cfg_qnj_hr_a0_f0 = {
|
||||
* HT size; mac80211 would otherwise pick the HE max (256) by default.
|
||||
*/
|
||||
.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
|
||||
.num_rbds = IWL_NUM_RBDS_22000_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl22000_2ax_cfg_qnj_hr_b0 = {
|
||||
@ -634,6 +659,7 @@ const struct iwl_cfg iwl22000_2ax_cfg_qnj_hr_b0 = {
|
||||
* HT size; mac80211 would otherwise pick the HE max (256) by default.
|
||||
*/
|
||||
.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
|
||||
.num_rbds = IWL_NUM_RBDS_22000_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl22000_2ax_cfg_qnj_hr_a0 = {
|
||||
@ -646,18 +672,21 @@ const struct iwl_cfg iwl22000_2ax_cfg_qnj_hr_a0 = {
|
||||
* HT size; mac80211 would otherwise pick the HE max (256) by default.
|
||||
*/
|
||||
.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
|
||||
.num_rbds = IWL_NUM_RBDS_22000_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwlax210_2ax_cfg_so_jf_a0 = {
|
||||
.name = "Intel(R) Wireless-AC 9560 160MHz",
|
||||
.fw_name_pre = IWL_22000_SO_A_JF_B_FW_PRE,
|
||||
IWL_DEVICE_AX210,
|
||||
.num_rbds = IWL_NUM_RBDS_NON_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwlax210_2ax_cfg_so_hr_a0 = {
|
||||
.name = "Intel(R) Wi-Fi 7 AX210 160MHz",
|
||||
.fw_name_pre = IWL_22000_SO_A_HR_B_FW_PRE,
|
||||
IWL_DEVICE_AX210,
|
||||
.num_rbds = IWL_NUM_RBDS_AX210_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwlax211_2ax_cfg_so_gf_a0 = {
|
||||
@ -665,6 +694,7 @@ const struct iwl_cfg iwlax211_2ax_cfg_so_gf_a0 = {
|
||||
.fw_name_pre = IWL_22000_SO_A_GF_A_FW_PRE,
|
||||
.uhb_supported = true,
|
||||
IWL_DEVICE_AX210,
|
||||
.num_rbds = IWL_NUM_RBDS_AX210_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwlax210_2ax_cfg_ty_gf_a0 = {
|
||||
@ -672,12 +702,23 @@ const struct iwl_cfg iwlax210_2ax_cfg_ty_gf_a0 = {
|
||||
.fw_name_pre = IWL_22000_TY_A_GF_A_FW_PRE,
|
||||
.uhb_supported = true,
|
||||
IWL_DEVICE_AX210,
|
||||
.num_rbds = IWL_NUM_RBDS_AX210_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwlax411_2ax_cfg_so_gf4_a0 = {
|
||||
.name = "Intel(R) Wi-Fi 7 AX411 160MHz",
|
||||
.fw_name_pre = IWL_22000_SO_A_GF4_A_FW_PRE,
|
||||
.uhb_supported = true,
|
||||
IWL_DEVICE_AX210,
|
||||
.num_rbds = IWL_NUM_RBDS_AX210_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwlax411_2ax_cfg_sosnj_gf4_a0 = {
|
||||
.name = "Intel(R) Wi-Fi 7 AX411 160MHz",
|
||||
.fw_name_pre = IWL_22000_SOSNJ_A_GF4_A_FW_PRE,
|
||||
.uhb_supported = true,
|
||||
IWL_DEVICE_AX210,
|
||||
.num_rbds = IWL_NUM_RBDS_AX210_HE,
|
||||
};
|
||||
|
||||
MODULE_FIRMWARE(IWL_22000_HR_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
|
||||
|
@ -75,8 +75,7 @@ static const struct iwl_eeprom_params iwl5000_eeprom_params = {
|
||||
.trans.base_params = &iwl5000_base_params, \
|
||||
.eeprom_params = &iwl5000_eeprom_params, \
|
||||
.led_mode = IWL_LED_BLINK, \
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K, \
|
||||
.trans.csr = &iwl_csr_v1
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K
|
||||
|
||||
const struct iwl_cfg iwl5300_agn_cfg = {
|
||||
.name = "Intel(R) Ultimate N WiFi Link 5300 AGN",
|
||||
@ -125,7 +124,6 @@ const struct iwl_cfg iwl5350_agn_cfg = {
|
||||
.ht_params = &iwl5000_ht_params,
|
||||
.led_mode = IWL_LED_BLINK,
|
||||
.internal_wimax_coex = true,
|
||||
.trans.csr = &iwl_csr_v1,
|
||||
};
|
||||
|
||||
#define IWL_DEVICE_5150 \
|
||||
@ -141,8 +139,7 @@ const struct iwl_cfg iwl5350_agn_cfg = {
|
||||
.eeprom_params = &iwl5000_eeprom_params, \
|
||||
.led_mode = IWL_LED_BLINK, \
|
||||
.internal_wimax_coex = true, \
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K, \
|
||||
.trans.csr = &iwl_csr_v1
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K
|
||||
|
||||
const struct iwl_cfg iwl5150_agn_cfg = {
|
||||
.name = "Intel(R) WiMAX/WiFi Link 5150 AGN",
|
||||
|
@ -124,8 +124,7 @@ static const struct iwl_eeprom_params iwl6000_eeprom_params = {
|
||||
.trans.base_params = &iwl6000_g2_base_params, \
|
||||
.eeprom_params = &iwl6000_eeprom_params, \
|
||||
.led_mode = IWL_LED_RF_STATE, \
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K, \
|
||||
.trans.csr = &iwl_csr_v1
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K
|
||||
|
||||
const struct iwl_cfg iwl6005_2agn_cfg = {
|
||||
.name = "Intel(R) Centrino(R) Advanced-N 6205 AGN",
|
||||
@ -179,8 +178,7 @@ const struct iwl_cfg iwl6005_2agn_mow2_cfg = {
|
||||
.trans.base_params = &iwl6000_g2_base_params, \
|
||||
.eeprom_params = &iwl6000_eeprom_params, \
|
||||
.led_mode = IWL_LED_RF_STATE, \
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K, \
|
||||
.trans.csr = &iwl_csr_v1
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K
|
||||
|
||||
const struct iwl_cfg iwl6030_2agn_cfg = {
|
||||
.name = "Intel(R) Centrino(R) Advanced-N 6230 AGN",
|
||||
@ -216,8 +214,7 @@ const struct iwl_cfg iwl6030_2bg_cfg = {
|
||||
.trans.base_params = &iwl6000_g2_base_params, \
|
||||
.eeprom_params = &iwl6000_eeprom_params, \
|
||||
.led_mode = IWL_LED_RF_STATE, \
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K, \
|
||||
.trans.csr = &iwl_csr_v1
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K
|
||||
|
||||
const struct iwl_cfg iwl6035_2agn_cfg = {
|
||||
.name = "Intel(R) Centrino(R) Advanced-N 6235 AGN",
|
||||
@ -272,8 +269,7 @@ const struct iwl_cfg iwl130_bg_cfg = {
|
||||
.trans.base_params = &iwl6000_base_params, \
|
||||
.eeprom_params = &iwl6000_eeprom_params, \
|
||||
.led_mode = IWL_LED_BLINK, \
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K, \
|
||||
.trans.csr = &iwl_csr_v1
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K
|
||||
|
||||
const struct iwl_cfg iwl6000i_2agn_cfg = {
|
||||
.name = "Intel(R) Centrino(R) Advanced-N 6200 AGN",
|
||||
@ -306,8 +302,7 @@ const struct iwl_cfg iwl6000i_2bg_cfg = {
|
||||
.eeprom_params = &iwl6000_eeprom_params, \
|
||||
.led_mode = IWL_LED_BLINK, \
|
||||
.internal_wimax_coex = true, \
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K, \
|
||||
.trans.csr = &iwl_csr_v1
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K
|
||||
|
||||
const struct iwl_cfg iwl6050_2agn_cfg = {
|
||||
.name = "Intel(R) Centrino(R) Advanced-N + WiMAX 6250 AGN",
|
||||
@ -333,8 +328,7 @@ const struct iwl_cfg iwl6050_2abg_cfg = {
|
||||
.eeprom_params = &iwl6000_eeprom_params, \
|
||||
.led_mode = IWL_LED_BLINK, \
|
||||
.internal_wimax_coex = true, \
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K, \
|
||||
.trans.csr = &iwl_csr_v1
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K
|
||||
|
||||
const struct iwl_cfg iwl6150_bgn_cfg = {
|
||||
.name = "Intel(R) Centrino(R) Wireless-N + WiMAX 6150 BGN",
|
||||
@ -361,7 +355,6 @@ const struct iwl_cfg iwl6000_3agn_cfg = {
|
||||
.eeprom_params = &iwl6000_eeprom_params,
|
||||
.ht_params = &iwl6000_ht_params,
|
||||
.led_mode = IWL_LED_BLINK,
|
||||
.trans.csr = &iwl_csr_v1,
|
||||
};
|
||||
|
||||
MODULE_FIRMWARE(IWL6000_MODULE_FIRMWARE(IWL6000_UCODE_API_MAX));
|
||||
|
@ -154,8 +154,7 @@ static const struct iwl_ht_params iwl7000_ht_params = {
|
||||
.nvm_hw_section_num = 0, \
|
||||
.non_shared_ant = ANT_A, \
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K, \
|
||||
.dccm_offset = IWL7000_DCCM_OFFSET, \
|
||||
.trans.csr = &iwl_csr_v1
|
||||
.dccm_offset = IWL7000_DCCM_OFFSET
|
||||
|
||||
#define IWL_DEVICE_7000 \
|
||||
IWL_DEVICE_7000_COMMON, \
|
||||
|
@ -151,8 +151,7 @@ static const struct iwl_tt_params iwl8000_tt_params = {
|
||||
.apmg_not_supported = true, \
|
||||
.nvm_type = IWL_NVM_EXT, \
|
||||
.dbgc_supported = true, \
|
||||
.min_umac_error_event_table = 0x800000, \
|
||||
.trans.csr = &iwl_csr_v1
|
||||
.min_umac_error_event_table = 0x800000
|
||||
|
||||
#define IWL_DEVICE_8000 \
|
||||
IWL_DEVICE_8000_COMMON, \
|
||||
|
@ -138,13 +138,13 @@ static const struct iwl_tt_params iwl9000_tt_params = {
|
||||
.thermal_params = &iwl9000_tt_params, \
|
||||
.apmg_not_supported = true, \
|
||||
.trans.mq_rx_supported = true, \
|
||||
.num_rbds = 512, \
|
||||
.vht_mu_mimo_supported = true, \
|
||||
.mac_addr_from_csr = true, \
|
||||
.trans.rf_id = true, \
|
||||
.nvm_type = IWL_NVM_EXT, \
|
||||
.dbgc_supported = true, \
|
||||
.min_umac_error_event_table = 0x800000, \
|
||||
.trans.csr = &iwl_csr_v1, \
|
||||
.d3_debug_data_base_addr = 0x401000, \
|
||||
.d3_debug_data_length = 92 * 1024, \
|
||||
.ht_params = &iwl9000_ht_params, \
|
||||
@ -171,6 +171,12 @@ static const struct iwl_tt_params iwl9000_tt_params = {
|
||||
}, \
|
||||
}
|
||||
|
||||
const struct iwl_cfg_trans_params iwl9000_trans_cfg = {
|
||||
.device_family = IWL_DEVICE_FAMILY_9000,
|
||||
.base_params = &iwl9000_base_params,
|
||||
.mq_rx_supported = true,
|
||||
.rf_id = true,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl9160_2ac_cfg = {
|
||||
.name = "Intel(R) Dual Band Wireless AC 9160",
|
||||
@ -184,8 +190,10 @@ const struct iwl_cfg iwl9260_2ac_cfg = {
|
||||
IWL_DEVICE_9000,
|
||||
};
|
||||
|
||||
const char iwl9260_160_name[] = "Intel(R) Wireless-AC 9260 160MHz";
|
||||
const char iwl9560_160_name[] = "Intel(R) Wireless-AC 9560 160MHz";
|
||||
|
||||
const struct iwl_cfg iwl9260_2ac_160_cfg = {
|
||||
.name = "Intel(R) Wireless-AC 9260 160MHz",
|
||||
.fw_name_pre = IWL9260_FW_PRE,
|
||||
IWL_DEVICE_9000,
|
||||
};
|
||||
|
@ -1255,7 +1255,7 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,
|
||||
************************/
|
||||
hw = iwl_alloc_all();
|
||||
if (!hw) {
|
||||
pr_err("%s: Cannot allocate network device\n", cfg->name);
|
||||
pr_err("%s: Cannot allocate network device\n", trans->name);
|
||||
goto out;
|
||||
}
|
||||
|
||||
@ -1390,7 +1390,7 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,
|
||||
* 2. Read REV register
|
||||
***********************/
|
||||
IWL_INFO(priv, "Detected %s, REV=0x%X\n",
|
||||
priv->cfg->name, priv->trans->hw_rev);
|
||||
priv->trans->name, priv->trans->hw_rev);
|
||||
|
||||
if (iwl_trans_start_hw(priv->trans))
|
||||
goto out_free_hw;
|
||||
|
@ -240,7 +240,7 @@ enum iwl_tof_responder_cfg_flags {
|
||||
};
|
||||
|
||||
/**
|
||||
* struct iwl_tof_responder_config_cmd - ToF AP mode (for debug)
|
||||
* struct iwl_tof_responder_config_cmd_v6 - ToF AP mode (for debug)
|
||||
* @cmd_valid_fields: &iwl_tof_responder_cmd_valid_field
|
||||
* @responder_cfg_flags: &iwl_tof_responder_cfg_flags
|
||||
* @bandwidth: current AP Bandwidth: &enum iwl_tof_bandwidth
|
||||
@ -258,7 +258,7 @@ enum iwl_tof_responder_cfg_flags {
|
||||
* @bssid: Current AP BSSID
|
||||
* @reserved2: reserved
|
||||
*/
|
||||
struct iwl_tof_responder_config_cmd {
|
||||
struct iwl_tof_responder_config_cmd_v6 {
|
||||
__le32 cmd_valid_fields;
|
||||
__le32 responder_cfg_flags;
|
||||
u8 bandwidth;
|
||||
@ -274,6 +274,42 @@ struct iwl_tof_responder_config_cmd {
|
||||
__le16 reserved2;
|
||||
} __packed; /* TOF_RESPONDER_CONFIG_CMD_API_S_VER_6 */
|
||||
|
||||
/**
|
||||
* struct iwl_tof_responder_config_cmd - ToF AP mode (for debug)
|
||||
* @cmd_valid_fields: &iwl_tof_responder_cmd_valid_field
|
||||
* @responder_cfg_flags: &iwl_tof_responder_cfg_flags
|
||||
* @format_bw: bits 0 - 3: &enum iwl_location_frame_format.
|
||||
* bits 4 - 7: &enum iwl_location_bw.
|
||||
* @rate: current AP rate
|
||||
* @channel_num: current AP Channel
|
||||
* @ctrl_ch_position: coding of the control channel position relative to
|
||||
* the center frequency, see iwl_mvm_get_ctrl_pos()
|
||||
* @sta_id: index of the AP STA when in AP mode
|
||||
* @reserved1: reserved
|
||||
* @toa_offset: Artificial addition [pSec] for the ToA - to be used for debug
|
||||
* purposes, simulating station movement by adding various values
|
||||
* to this field
|
||||
* @common_calib: XVT: common calibration value
|
||||
* @specific_calib: XVT: specific calibration value
|
||||
* @bssid: Current AP BSSID
|
||||
* @reserved2: reserved
|
||||
*/
|
||||
struct iwl_tof_responder_config_cmd {
|
||||
__le32 cmd_valid_fields;
|
||||
__le32 responder_cfg_flags;
|
||||
u8 format_bw;
|
||||
u8 rate;
|
||||
u8 channel_num;
|
||||
u8 ctrl_ch_position;
|
||||
u8 sta_id;
|
||||
u8 reserved1;
|
||||
__le16 toa_offset;
|
||||
__le16 common_calib;
|
||||
__le16 specific_calib;
|
||||
u8 bssid[ETH_ALEN];
|
||||
__le16 reserved2;
|
||||
} __packed; /* TOF_RESPONDER_CONFIG_CMD_API_S_VER_6 */
|
||||
|
||||
#define IWL_LCI_CIVIC_IE_MAX_SIZE 400
|
||||
|
||||
/**
|
||||
@ -403,7 +439,7 @@ enum iwl_initiator_ap_flags {
|
||||
};
|
||||
|
||||
/**
|
||||
* struct iwl_tof_range_req_ap_entry - AP configuration parameters
|
||||
* struct iwl_tof_range_req_ap_entry_v3 - AP configuration parameters
|
||||
* @initiator_ap_flags: see &enum iwl_initiator_ap_flags.
|
||||
* @channel_num: AP Channel number
|
||||
* @bandwidth: AP bandwidth. One of iwl_tof_bandwidth.
|
||||
@ -420,7 +456,7 @@ enum iwl_initiator_ap_flags {
|
||||
* @reserved: For alignment and future use
|
||||
* @tsf_delta: not in use
|
||||
*/
|
||||
struct iwl_tof_range_req_ap_entry {
|
||||
struct iwl_tof_range_req_ap_entry_v3 {
|
||||
__le32 initiator_ap_flags;
|
||||
u8 channel_num;
|
||||
u8 bandwidth;
|
||||
@ -434,6 +470,72 @@ struct iwl_tof_range_req_ap_entry {
|
||||
__le32 tsf_delta;
|
||||
} __packed; /* LOCATION_RANGE_REQ_AP_ENTRY_CMD_API_S_VER_3 */
|
||||
|
||||
/**
|
||||
* enum iwl_location_frame_format - location frame formats
|
||||
* @IWL_LOCATION_FRAME_FORMAT_LEGACY: legacy
|
||||
* @IWL_LOCATION_FRAME_FORMAT_HT: HT
|
||||
* @IWL_LOCATION_FRAME_FORMAT_VHT: VHT
|
||||
* @IWL_LOCATION_FRAME_FORMAT_HE: HE
|
||||
*/
|
||||
enum iwl_location_frame_format {
|
||||
IWL_LOCATION_FRAME_FORMAT_LEGACY,
|
||||
IWL_LOCATION_FRAME_FORMAT_HT,
|
||||
IWL_LOCATION_FRAME_FORMAT_VHT,
|
||||
IWL_LOCATION_FRAME_FORMAT_HE,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum iwl_location_bw - location bandwidth selection
|
||||
* @IWL_LOCATION_BW_20MHZ: 20MHz
|
||||
* @IWL_LOCATION_BW_40MHZ: 40MHz
|
||||
* @IWL_LOCATION_BW_80MHZ: 80MHz
|
||||
*/
|
||||
enum iwl_location_bw {
|
||||
IWL_LOCATION_BW_20MHZ,
|
||||
IWL_LOCATION_BW_40MHZ,
|
||||
IWL_LOCATION_BW_80MHZ,
|
||||
};
|
||||
|
||||
#define HLTK_11AZ_LEN 32
|
||||
#define TK_11AZ_LEN 32
|
||||
|
||||
#define LOCATION_BW_POS 4
|
||||
|
||||
/**
|
||||
* struct iwl_tof_range_req_ap_entry - AP configuration parameters
|
||||
* @initiator_ap_flags: see &enum iwl_initiator_ap_flags.
|
||||
* @channel_num: AP Channel number
|
||||
* @format_bw: bits 0 - 3: &enum iwl_location_frame_format.
|
||||
* bits 4 - 7: &enum iwl_location_bw.
|
||||
* @ctrl_ch_position: Coding of the control channel position relative to the
|
||||
* center frequency, see iwl_mvm_get_ctrl_pos().
|
||||
* @ftmr_max_retries: Max number of retries to send the FTMR in case of no
|
||||
* reply from the AP.
|
||||
* @bssid: AP's BSSID
|
||||
* @burst_period: Recommended value to be sent to the AP. Measurement
|
||||
* periodicity In units of 100ms. ignored if num_of_bursts_exp = 0
|
||||
* @samples_per_burst: the number of FTMs pairs in single Burst (1-31);
|
||||
* @num_of_bursts: Recommended value to be sent to the AP. 2s Exponent of
|
||||
* the number of measurement iterations (min 2^0 = 1, max 2^14)
|
||||
* @reserved: For alignment and future use
|
||||
* @hltk: HLTK to be used for secured 11az measurement
|
||||
* @tk: TK to be used for secured 11az measurement
|
||||
*/
|
||||
struct iwl_tof_range_req_ap_entry {
|
||||
__le32 initiator_ap_flags;
|
||||
u8 channel_num;
|
||||
u8 format_bw;
|
||||
u8 ctrl_ch_position;
|
||||
u8 ftmr_max_retries;
|
||||
u8 bssid[ETH_ALEN];
|
||||
__le16 burst_period;
|
||||
u8 samples_per_burst;
|
||||
u8 num_of_bursts;
|
||||
__le16 reserved;
|
||||
u8 hltk[HLTK_11AZ_LEN];
|
||||
u8 tk[TK_11AZ_LEN];
|
||||
} __packed; /* LOCATION_RANGE_REQ_AP_ENTRY_CMD_API_S_VER_4 */
|
||||
|
||||
/**
|
||||
* enum iwl_tof_response_mode
|
||||
* @IWL_MVM_TOF_RESPONSE_ASAP: report each AP measurement separately as soon as
|
||||
@ -535,6 +637,38 @@ struct iwl_tof_range_req_cmd_v5 {
|
||||
} __packed;
|
||||
/* LOCATION_RANGE_REQ_CMD_API_S_VER_5 */
|
||||
|
||||
/**
|
||||
* struct iwl_tof_range_req_cmd_v7 - start measurement cmd
|
||||
* @initiator_flags: see flags @ iwl_tof_initiator_flags
|
||||
* @request_id: A Token incremented per request. The same Token will be
|
||||
* sent back in the range response
|
||||
* @num_of_ap: Number of APs to measure (error if > IWL_MVM_TOF_MAX_APS)
|
||||
* @range_req_bssid: ranging request BSSID
|
||||
* @macaddr_mask: Bits set to 0 shall be copied from the MAC address template.
|
||||
* Bits set to 1 shall be randomized by the UMAC
|
||||
* @macaddr_template: MAC address template to use for non-randomized bits
|
||||
* @req_timeout_ms: Requested timeout of the response in units of milliseconds.
|
||||
* This is the session time for completing the measurement.
|
||||
* @tsf_mac_id: report the measurement start time for each ap in terms of the
|
||||
* TSF of this mac id. 0xff to disable TSF reporting.
|
||||
* @common_calib: The common calib value to inject to this measurement calc
|
||||
* @specific_calib: The specific calib value to inject to this measurement calc
|
||||
* @ap: per-AP request data, see &struct iwl_tof_range_req_ap_entry_v2.
|
||||
*/
|
||||
struct iwl_tof_range_req_cmd_v7 {
|
||||
__le32 initiator_flags;
|
||||
u8 request_id;
|
||||
u8 num_of_ap;
|
||||
u8 range_req_bssid[ETH_ALEN];
|
||||
u8 macaddr_mask[ETH_ALEN];
|
||||
u8 macaddr_template[ETH_ALEN];
|
||||
__le32 req_timeout_ms;
|
||||
__le32 tsf_mac_id;
|
||||
__le16 common_calib;
|
||||
__le16 specific_calib;
|
||||
struct iwl_tof_range_req_ap_entry_v3 ap[IWL_MVM_TOF_MAX_APS];
|
||||
} __packed; /* LOCATION_RANGE_REQ_CMD_API_S_VER_7 */
|
||||
|
||||
/**
|
||||
* struct iwl_tof_range_req_cmd - start measurement cmd
|
||||
* @initiator_flags: see flags @ iwl_tof_initiator_flags
|
||||
@ -565,7 +699,7 @@ struct iwl_tof_range_req_cmd {
|
||||
__le16 common_calib;
|
||||
__le16 specific_calib;
|
||||
struct iwl_tof_range_req_ap_entry ap[IWL_MVM_TOF_MAX_APS];
|
||||
} __packed; /* LOCATION_RANGE_REQ_CMD_API_S_VER_7 */
|
||||
} __packed; /* LOCATION_RANGE_REQ_CMD_API_S_VER_8 */
|
||||
|
||||
/*
|
||||
* enum iwl_tof_range_request_status - status of the sent request
|
||||
|
@ -921,21 +921,6 @@ struct iwl_scan_probe_params_v4 {
|
||||
|
||||
#define SCAN_MAX_NUM_CHANS_V3 67
|
||||
|
||||
/**
|
||||
* struct iwl_scan_channel_params_v3
|
||||
* @flags: channel flags &enum iwl_scan_channel_flags
|
||||
* @count: num of channels in scan request
|
||||
* @reserved: for future use and alignment
|
||||
* @channel_config: array of explicit channel configurations
|
||||
* for 2.4Ghz and 5.2Ghz bands
|
||||
*/
|
||||
struct iwl_scan_channel_params_v3 {
|
||||
u8 flags;
|
||||
u8 count;
|
||||
__le16 reserved;
|
||||
struct iwl_scan_channel_cfg_umac channel_config[SCAN_MAX_NUM_CHANS_V3];
|
||||
} __packed; /* SCAN_CHANNEL_PARAMS_API_S_VER_3 */
|
||||
|
||||
/**
|
||||
* struct iwl_scan_channel_params_v4
|
||||
* @flags: channel flags &enum iwl_scan_channel_flags
|
||||
@ -1010,20 +995,6 @@ struct iwl_scan_periodic_parms_v1 {
|
||||
__le16 reserved;
|
||||
} __packed; /* SCAN_PERIODIC_PARAMS_API_S_VER_1 */
|
||||
|
||||
/**
|
||||
* struct iwl_scan_req_params_v11
|
||||
* @general_params: &struct iwl_scan_general_params_v10
|
||||
* @channel_params: &struct iwl_scan_channel_params_v3
|
||||
* @periodic_params: &struct iwl_scan_periodic_parms_v1
|
||||
* @probe_params: &struct iwl_scan_probe_params_v3
|
||||
*/
|
||||
struct iwl_scan_req_params_v11 {
|
||||
struct iwl_scan_general_params_v10 general_params;
|
||||
struct iwl_scan_channel_params_v3 channel_params;
|
||||
struct iwl_scan_periodic_parms_v1 periodic_params;
|
||||
struct iwl_scan_probe_params_v3 probe_params;
|
||||
} __packed; /* SCAN_REQUEST_PARAMS_API_S_VER_11 */
|
||||
|
||||
/**
|
||||
* struct iwl_scan_req_params_v12
|
||||
* @general_params: &struct iwl_scan_general_params_v10
|
||||
@ -1052,18 +1023,6 @@ struct iwl_scan_req_params_v13 {
|
||||
struct iwl_scan_probe_params_v4 probe_params;
|
||||
} __packed; /* SCAN_REQUEST_PARAMS_API_S_VER_13 */
|
||||
|
||||
/**
|
||||
* struct iwl_scan_req_umac_v11
|
||||
* @uid: scan id, &enum iwl_umac_scan_uid_offsets
|
||||
* @ooc_priority: out of channel priority - &enum iwl_scan_priority
|
||||
* @scan_params: scan parameters
|
||||
*/
|
||||
struct iwl_scan_req_umac_v11 {
|
||||
__le32 uid;
|
||||
__le32 ooc_priority;
|
||||
struct iwl_scan_req_params_v11 scan_params;
|
||||
} __packed; /* SCAN_REQUEST_CMD_UMAC_API_S_VER_11 */
|
||||
|
||||
/**
|
||||
* struct iwl_scan_req_umac_v12
|
||||
* @uid: scan id, &enum iwl_umac_scan_uid_offsets
|
||||
|
@ -813,6 +813,7 @@ enum iwl_mac_beacon_flags {
|
||||
IWL_MAC_BEACON_ANT_A = BIT(9),
|
||||
IWL_MAC_BEACON_ANT_B = BIT(10),
|
||||
IWL_MAC_BEACON_ANT_C = BIT(11),
|
||||
IWL_MAC_BEACON_FILS = BIT(12),
|
||||
};
|
||||
|
||||
/**
|
||||
@ -820,6 +821,7 @@ enum iwl_mac_beacon_flags {
|
||||
* @byte_cnt: byte count of the beacon frame.
|
||||
* @flags: least significant byte for rate code. The most significant byte
|
||||
* is &enum iwl_mac_beacon_flags.
|
||||
* @short_ssid: Short SSID
|
||||
* @reserved: reserved
|
||||
* @template_id: currently equal to the mac context id of the coresponding mac.
|
||||
* @tim_idx: the offset of the tim IE in the beacon
|
||||
@ -831,14 +833,15 @@ enum iwl_mac_beacon_flags {
|
||||
struct iwl_mac_beacon_cmd {
|
||||
__le16 byte_cnt;
|
||||
__le16 flags;
|
||||
__le64 reserved;
|
||||
__le32 short_ssid;
|
||||
__le32 reserved;
|
||||
__le32 template_id;
|
||||
__le32 tim_idx;
|
||||
__le32 tim_size;
|
||||
__le32 ecsa_offset;
|
||||
__le32 csa_offset;
|
||||
struct ieee80211_hdr frame[0];
|
||||
} __packed; /* BEACON_TEMPLATE_CMD_API_S_VER_9 */
|
||||
} __packed; /* BEACON_TEMPLATE_CMD_API_S_VER_10 */
|
||||
|
||||
struct iwl_beacon_notif {
|
||||
struct iwl_mvm_tx_resp beacon_notify_hdr;
|
||||
|
@ -929,7 +929,7 @@ iwl_fw_error_dump_file(struct iwl_fw_runtime *fwrt,
|
||||
cpu_to_le32(CSR_HW_REV_STEP(fwrt->trans->hw_rev));
|
||||
memcpy(dump_info->fw_human_readable, fwrt->fw->human_readable,
|
||||
sizeof(dump_info->fw_human_readable));
|
||||
strncpy(dump_info->dev_human_readable, fwrt->trans->cfg->name,
|
||||
strncpy(dump_info->dev_human_readable, fwrt->trans->name,
|
||||
sizeof(dump_info->dev_human_readable) - 1);
|
||||
strncpy(dump_info->bus_human_readable, fwrt->dev->bus->name,
|
||||
sizeof(dump_info->bus_human_readable) - 1);
|
||||
@ -1230,13 +1230,15 @@ static bool iwl_ini_txf_iter(struct iwl_fw_runtime *fwrt,
|
||||
iter->lmac = 0;
|
||||
}
|
||||
|
||||
if (!iter->internal_txf)
|
||||
if (!iter->internal_txf) {
|
||||
for (iter->fifo++; iter->fifo < txf_num; iter->fifo++) {
|
||||
iter->fifo_size =
|
||||
cfg->lmac[iter->lmac].txfifo_size[iter->fifo];
|
||||
if (iter->fifo_size && (lmac_bitmap & BIT(iter->fifo)))
|
||||
return true;
|
||||
}
|
||||
iter->fifo--;
|
||||
}
|
||||
|
||||
iter->internal_txf = 1;
|
||||
|
||||
@ -2351,9 +2353,6 @@ int iwl_fw_dbg_ini_collect(struct iwl_fw_runtime *fwrt,
|
||||
u32 occur, delay;
|
||||
unsigned long idx;
|
||||
|
||||
if (test_bit(STATUS_GEN_ACTIVE_TRIGS, &fwrt->status))
|
||||
return -EBUSY;
|
||||
|
||||
if (!iwl_fw_ini_trigger_on(fwrt, trig)) {
|
||||
IWL_WARN(fwrt, "WRT: Trigger %d is not active, aborting dump\n",
|
||||
tp_id);
|
||||
|
@ -320,31 +320,6 @@ static ssize_t iwl_dbgfs_send_hcmd_write(struct iwl_fw_runtime *fwrt, char *buf,
|
||||
|
||||
FWRT_DEBUGFS_WRITE_FILE_OPS(send_hcmd, 512);
|
||||
|
||||
static ssize_t iwl_dbgfs_fw_dbg_domain_write(struct iwl_fw_runtime *fwrt,
|
||||
char *buf, size_t count)
|
||||
{
|
||||
u32 new_domain;
|
||||
int ret;
|
||||
|
||||
if (!iwl_trans_fw_running(fwrt->trans))
|
||||
return -EIO;
|
||||
|
||||
ret = kstrtou32(buf, 0, &new_domain);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (new_domain != fwrt->trans->dbg.domains_bitmap) {
|
||||
ret = iwl_dbg_tlv_gen_active_trigs(fwrt, new_domain);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
iwl_dbg_tlv_time_point(fwrt, IWL_FW_INI_TIME_POINT_PERIODIC,
|
||||
NULL);
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t iwl_dbgfs_fw_dbg_domain_read(struct iwl_fw_runtime *fwrt,
|
||||
size_t size, char *buf)
|
||||
{
|
||||
@ -352,7 +327,7 @@ static ssize_t iwl_dbgfs_fw_dbg_domain_read(struct iwl_fw_runtime *fwrt,
|
||||
fwrt->trans->dbg.domains_bitmap);
|
||||
}
|
||||
|
||||
FWRT_DEBUGFS_READ_WRITE_FILE_OPS(fw_dbg_domain, 20);
|
||||
FWRT_DEBUGFS_READ_FILE_OPS(fw_dbg_domain, 20);
|
||||
|
||||
void iwl_fwrt_dbgfs_register(struct iwl_fw_runtime *fwrt,
|
||||
struct dentry *dbgfs_dir)
|
||||
@ -360,5 +335,5 @@ void iwl_fwrt_dbgfs_register(struct iwl_fw_runtime *fwrt,
|
||||
INIT_DELAYED_WORK(&fwrt->timestamp.wk, iwl_fw_timestamp_marker_wk);
|
||||
FWRT_DEBUGFS_ADD_FILE(timestamp_marker, dbgfs_dir, 0200);
|
||||
FWRT_DEBUGFS_ADD_FILE(send_hcmd, dbgfs_dir, 0200);
|
||||
FWRT_DEBUGFS_ADD_FILE(fw_dbg_domain, dbgfs_dir, 0600);
|
||||
FWRT_DEBUGFS_ADD_FILE(fw_dbg_domain, dbgfs_dir, 0400);
|
||||
}
|
||||
|
@ -251,7 +251,7 @@ struct iwl_fw_dbg {
|
||||
struct iwl_fw {
|
||||
u32 ucode_ver;
|
||||
|
||||
char fw_version[ETHTOOL_FWVERS_LEN];
|
||||
char fw_version[64];
|
||||
|
||||
/* ucode images */
|
||||
struct fw_img img[IWL_UCODE_TYPE_MAX];
|
||||
|
@ -69,7 +69,7 @@
|
||||
#include "iwl-eeprom-parse.h"
|
||||
#include "fw/acpi.h"
|
||||
|
||||
#define IWL_FW_DBG_DOMAIN IWL_FW_INI_DOMAIN_ALWAYS_ON
|
||||
#define IWL_FW_DBG_DOMAIN IWL_TRANS_FW_DBG_DOMAIN(fwrt->trans)
|
||||
|
||||
struct iwl_fw_runtime_ops {
|
||||
int (*dump_start)(void *ctx);
|
||||
@ -129,14 +129,6 @@ struct iwl_txf_iter_data {
|
||||
u8 internal_txf;
|
||||
};
|
||||
|
||||
/**
|
||||
* enum iwl_fw_runtime_status - fw runtime status flags
|
||||
* @STATUS_GEN_ACTIVE_TRIGS: generating active trigger list
|
||||
*/
|
||||
enum iwl_fw_runtime_status {
|
||||
STATUS_GEN_ACTIVE_TRIGS,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct iwl_fw_runtime - runtime data for firmware
|
||||
* @fw: firmware image
|
||||
@ -150,7 +142,6 @@ enum iwl_fw_runtime_status {
|
||||
* @smem_cfg: saved firmware SMEM configuration
|
||||
* @cur_fw_img: current firmware image, must be maintained by
|
||||
* the driver by calling &iwl_fw_set_current_image()
|
||||
* @status: &enum iwl_fw_runtime_status
|
||||
* @dump: debug dump data
|
||||
*/
|
||||
struct iwl_fw_runtime {
|
||||
@ -171,8 +162,6 @@ struct iwl_fw_runtime {
|
||||
/* memory configuration */
|
||||
struct iwl_fwrt_shared_mem_cfg smem_cfg;
|
||||
|
||||
unsigned long status;
|
||||
|
||||
/* debug */
|
||||
struct {
|
||||
const struct iwl_fw_dump_desc *desc;
|
||||
|
@ -284,52 +284,6 @@ struct iwl_pwr_tx_backoff {
|
||||
u32 backoff;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct iwl_csr_params
|
||||
*
|
||||
* @flag_sw_reset: reset the device
|
||||
* @flag_mac_clock_ready:
|
||||
* Indicates MAC (ucode processor, etc.) is powered up and can run.
|
||||
* Internal resources are accessible.
|
||||
* NOTE: This does not indicate that the processor is actually running.
|
||||
* NOTE: This does not indicate that device has completed
|
||||
* init or post-power-down restore of internal SRAM memory.
|
||||
* Use CSR_UCODE_DRV_GP1_BIT_MAC_SLEEP as indication that
|
||||
* SRAM is restored and uCode is in normal operation mode.
|
||||
* This note is relevant only for pre 5xxx devices.
|
||||
* NOTE: After device reset, this bit remains "0" until host sets
|
||||
* INIT_DONE
|
||||
* @flag_init_done: Host sets this to put device into fully operational
|
||||
* D0 power mode. Host resets this after SW_RESET to put device into
|
||||
* low power mode.
|
||||
* @flag_mac_access_req: Host sets this to request and maintain MAC wakeup,
|
||||
* to allow host access to device-internal resources. Host must wait for
|
||||
* mac_clock_ready (and !GOING_TO_SLEEP) before accessing non-CSR device
|
||||
* registers.
|
||||
* @flag_val_mac_access_en: mac access is enabled
|
||||
* @flag_master_dis: disable master
|
||||
* @flag_stop_master: stop master
|
||||
* @addr_sw_reset: address for resetting the device
|
||||
* @mac_addr0_otp: first part of MAC address from OTP
|
||||
* @mac_addr1_otp: second part of MAC address from OTP
|
||||
* @mac_addr0_strap: first part of MAC address from strap
|
||||
* @mac_addr1_strap: second part of MAC address from strap
|
||||
*/
|
||||
struct iwl_csr_params {
|
||||
u8 flag_sw_reset;
|
||||
u8 flag_mac_clock_ready;
|
||||
u8 flag_init_done;
|
||||
u8 flag_mac_access_req;
|
||||
u8 flag_val_mac_access_en;
|
||||
u8 flag_master_dis;
|
||||
u8 flag_stop_master;
|
||||
u8 addr_sw_reset;
|
||||
u32 mac_addr0_otp;
|
||||
u32 mac_addr1_otp;
|
||||
u32 mac_addr0_strap;
|
||||
u32 mac_addr1_strap;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct iwl_cfg_trans - information needed to start the trans
|
||||
*
|
||||
@ -348,7 +302,6 @@ struct iwl_csr_params {
|
||||
*/
|
||||
struct iwl_cfg_trans_params {
|
||||
const struct iwl_base_params *base_params;
|
||||
const struct iwl_csr_params *csr;
|
||||
enum iwl_device_family device_family;
|
||||
u32 umac_prph_offset;
|
||||
u32 rf_id:1,
|
||||
@ -431,6 +384,8 @@ struct iwl_fw_mon_regs {
|
||||
* @uhb_supported: ultra high band channels supported
|
||||
* @min_256_ba_txq_size: minimum number of slots required in a TX queue which
|
||||
* supports 256 BA aggregation
|
||||
* @num_rbds: number of receive buffer descriptors to use
|
||||
* (only used for multi-queue capable devices)
|
||||
*
|
||||
* We enable the driver to be backward compatible wrt. hardware features.
|
||||
* API differences in uCode shouldn't be handled here but through TLVs
|
||||
@ -485,6 +440,7 @@ struct iwl_cfg {
|
||||
u8 max_vht_ampdu_exponent;
|
||||
u8 ucode_api_max;
|
||||
u8 ucode_api_min;
|
||||
u16 num_rbds;
|
||||
u32 min_umac_error_event_table;
|
||||
u32 extra_phy_cfg_flags;
|
||||
u32 d3_debug_data_base_addr;
|
||||
@ -496,12 +452,22 @@ struct iwl_cfg {
|
||||
const struct iwl_fw_mon_regs mon_smem_regs;
|
||||
};
|
||||
|
||||
extern const struct iwl_csr_params iwl_csr_v1;
|
||||
extern const struct iwl_csr_params iwl_csr_v2;
|
||||
#define IWL_CFG_ANY (~0)
|
||||
|
||||
struct iwl_dev_info {
|
||||
u16 device;
|
||||
u16 subdevice;
|
||||
const struct iwl_cfg *cfg;
|
||||
const char *name;
|
||||
};
|
||||
|
||||
/*
|
||||
* This list declares the config structures for all devices.
|
||||
*/
|
||||
extern const struct iwl_cfg_trans_params iwl9000_trans_cfg;
|
||||
extern const char iwl9260_160_name[];
|
||||
extern const char iwl9560_160_name[];
|
||||
|
||||
#if IS_ENABLED(CONFIG_IWLDVM)
|
||||
extern const struct iwl_cfg iwl5300_agn_cfg;
|
||||
extern const struct iwl_cfg iwl5100_agn_cfg;
|
||||
@ -595,9 +561,6 @@ extern const struct iwl_cfg iwl9560_2ac_cfg_shared_clk;
|
||||
extern const struct iwl_cfg iwl9560_2ac_160_cfg_shared_clk;
|
||||
extern const struct iwl_cfg iwl9560_killer_2ac_cfg_shared_clk;
|
||||
extern const struct iwl_cfg iwl9560_killer_s_2ac_cfg_shared_clk;
|
||||
extern const struct iwl_cfg iwl22000_2ac_cfg_hr;
|
||||
extern const struct iwl_cfg iwl22000_2ac_cfg_hr_cdb;
|
||||
extern const struct iwl_cfg iwl22000_2ac_cfg_jf;
|
||||
extern const struct iwl_cfg iwl_ax101_cfg_qu_hr;
|
||||
extern const struct iwl_cfg iwl_ax101_cfg_qu_c0_hr_b0;
|
||||
extern const struct iwl_cfg iwl_ax101_cfg_quz_hr;
|
||||
@ -636,6 +599,7 @@ extern const struct iwl_cfg iwlax210_2ax_cfg_so_hr_a0;
|
||||
extern const struct iwl_cfg iwlax211_2ax_cfg_so_gf_a0;
|
||||
extern const struct iwl_cfg iwlax210_2ax_cfg_ty_gf_a0;
|
||||
extern const struct iwl_cfg iwlax411_2ax_cfg_so_gf4_a0;
|
||||
extern const struct iwl_cfg iwlax411_2ax_cfg_sosnj_gf4_a0;
|
||||
#endif /* CPTCFG_IWLMVM || CPTCFG_IWLFMAC */
|
||||
|
||||
#endif /* __IWL_CONFIG_H__ */
|
||||
|
@ -6,7 +6,7 @@
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2017 Intel Deutschland GmbH
|
||||
* Copyright(c) 2018 Intel Corporation
|
||||
* Copyright(c) 2018 - 2019 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
|
||||
@ -20,7 +20,7 @@
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2017 Intel Deutschland GmbH
|
||||
* Copyright(c) 2018 Intel Corporation
|
||||
* Copyright(c) 2018 - 2019 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -64,12 +64,12 @@
|
||||
* the init done for driver command that configures several system modes
|
||||
* @IWL_CTXT_INFO_EARLY_DEBUG: enable early debug
|
||||
* @IWL_CTXT_INFO_ENABLE_CDMP: enable core dump
|
||||
* @IWL_CTXT_INFO_RB_CB_SIZE_POS: position of the RBD Cyclic Buffer Size
|
||||
* @IWL_CTXT_INFO_RB_CB_SIZE: mask of the RBD Cyclic Buffer Size
|
||||
* exponent, the actual size is 2**value, valid sizes are 8-2048.
|
||||
* The value is four bits long. Maximum valid exponent is 12
|
||||
* @IWL_CTXT_INFO_TFD_FORMAT_LONG: use long TFD Format (the
|
||||
* default is short format - not supported by the driver)
|
||||
* @IWL_CTXT_INFO_RB_SIZE_POS: RB size position
|
||||
* @IWL_CTXT_INFO_RB_SIZE: RB size mask
|
||||
* (values are IWL_CTXT_INFO_RB_SIZE_*K)
|
||||
* @IWL_CTXT_INFO_RB_SIZE_1K: Value for 1K RB size
|
||||
* @IWL_CTXT_INFO_RB_SIZE_2K: Value for 2K RB size
|
||||
@ -83,12 +83,12 @@
|
||||
* @IWL_CTXT_INFO_RB_SIZE_32K: Value for 32K RB size
|
||||
*/
|
||||
enum iwl_context_info_flags {
|
||||
IWL_CTXT_INFO_AUTO_FUNC_INIT = BIT(0),
|
||||
IWL_CTXT_INFO_EARLY_DEBUG = BIT(1),
|
||||
IWL_CTXT_INFO_ENABLE_CDMP = BIT(2),
|
||||
IWL_CTXT_INFO_RB_CB_SIZE_POS = 4,
|
||||
IWL_CTXT_INFO_TFD_FORMAT_LONG = BIT(8),
|
||||
IWL_CTXT_INFO_RB_SIZE_POS = 9,
|
||||
IWL_CTXT_INFO_AUTO_FUNC_INIT = 0x0001,
|
||||
IWL_CTXT_INFO_EARLY_DEBUG = 0x0002,
|
||||
IWL_CTXT_INFO_ENABLE_CDMP = 0x0004,
|
||||
IWL_CTXT_INFO_RB_CB_SIZE = 0x00f0,
|
||||
IWL_CTXT_INFO_TFD_FORMAT_LONG = 0x0100,
|
||||
IWL_CTXT_INFO_RB_SIZE = 0x1e00,
|
||||
IWL_CTXT_INFO_RB_SIZE_1K = 0x1,
|
||||
IWL_CTXT_INFO_RB_SIZE_2K = 0x2,
|
||||
IWL_CTXT_INFO_RB_SIZE_4K = 0x4,
|
||||
|
@ -256,6 +256,7 @@
|
||||
/* RESET */
|
||||
#define CSR_RESET_REG_FLAG_NEVO_RESET (0x00000001)
|
||||
#define CSR_RESET_REG_FLAG_FORCE_NMI (0x00000002)
|
||||
#define CSR_RESET_REG_FLAG_SW_RESET (0x00000080)
|
||||
#define CSR_RESET_REG_FLAG_MASTER_DISABLED (0x00000100)
|
||||
#define CSR_RESET_REG_FLAG_STOP_MASTER (0x00000200)
|
||||
#define CSR_RESET_LINK_PWR_MGMT_DISABLED (0x80000000)
|
||||
@ -278,11 +279,35 @@
|
||||
* 4: GOING_TO_SLEEP
|
||||
* Indicates MAC is entering a power-saving sleep power-down.
|
||||
* Not a good time to access device-internal resources.
|
||||
* 3: MAC_ACCESS_REQ
|
||||
* Host sets this to request and maintain MAC wakeup, to allow host
|
||||
* access to device-internal resources. Host must wait for
|
||||
* MAC_CLOCK_READY (and !GOING_TO_SLEEP) before accessing non-CSR
|
||||
* device registers.
|
||||
* 2: INIT_DONE
|
||||
* Host sets this to put device into fully operational D0 power mode.
|
||||
* Host resets this after SW_RESET to put device into low power mode.
|
||||
* 0: MAC_CLOCK_READY
|
||||
* Indicates MAC (ucode processor, etc.) is powered up and can run.
|
||||
* Internal resources are accessible.
|
||||
* NOTE: This does not indicate that the processor is actually running.
|
||||
* NOTE: This does not indicate that device has completed
|
||||
* init or post-power-down restore of internal SRAM memory.
|
||||
* Use CSR_UCODE_DRV_GP1_BIT_MAC_SLEEP as indication that
|
||||
* SRAM is restored and uCode is in normal operation mode.
|
||||
* Later devices (5xxx/6xxx/1xxx) use non-volatile SRAM, and
|
||||
* do not need to save/restore it.
|
||||
* NOTE: After device reset, this bit remains "0" until host sets
|
||||
* INIT_DONE
|
||||
*/
|
||||
#define CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY (0x00000001)
|
||||
#define CSR_GP_CNTRL_REG_FLAG_INIT_DONE (0x00000004)
|
||||
#define CSR_GP_CNTRL_REG_FLAG_GOING_TO_SLEEP (0x00000010)
|
||||
#define CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ (0x00000008)
|
||||
#define CSR_GP_CNTRL_REG_FLAG_GOING_TO_SLEEP (0x00000010)
|
||||
#define CSR_GP_CNTRL_REG_FLAG_XTAL_ON (0x00000400)
|
||||
|
||||
#define CSR_GP_CNTRL_REG_VAL_MAC_ACCESS_EN (0x00000001)
|
||||
|
||||
#define CSR_GP_CNTRL_REG_MSK_POWER_SAVE_TYPE (0x07000000)
|
||||
#define CSR_GP_CNTRL_REG_FLAG_RFKILL_WAKE_L1A_EN (0x04000000)
|
||||
#define CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW (0x08000000)
|
||||
|
@ -290,10 +290,19 @@ void iwl_dbg_tlv_alloc(struct iwl_trans *trans, struct iwl_ucode_tlv *tlv,
|
||||
struct iwl_fw_ini_header *hdr = (void *)&tlv->data[0];
|
||||
u32 type = le32_to_cpu(tlv->type);
|
||||
u32 tlv_idx = type - IWL_UCODE_TLV_DEBUG_BASE;
|
||||
u32 domain = le32_to_cpu(hdr->domain);
|
||||
enum iwl_ini_cfg_state *cfg_state = ext ?
|
||||
&trans->dbg.external_ini_cfg : &trans->dbg.internal_ini_cfg;
|
||||
int ret;
|
||||
|
||||
if (domain != IWL_FW_INI_DOMAIN_ALWAYS_ON &&
|
||||
!(domain & trans->dbg.domains_bitmap)) {
|
||||
IWL_DEBUG_FW(trans,
|
||||
"WRT: Skipping TLV with disabled domain 0x%0x (0x%0x)\n",
|
||||
domain, trans->dbg.domains_bitmap);
|
||||
return;
|
||||
}
|
||||
|
||||
if (tlv_idx >= ARRAY_SIZE(dbg_tlv_alloc) || !dbg_tlv_alloc[tlv_idx]) {
|
||||
IWL_ERR(trans, "WRT: Unsupported TLV type 0x%x\n", type);
|
||||
goto out_err;
|
||||
@ -667,7 +676,6 @@ static void iwl_dbg_tlv_send_hcmds(struct iwl_fw_runtime *fwrt,
|
||||
list_for_each_entry(node, hcmd_list, list) {
|
||||
struct iwl_fw_ini_hcmd_tlv *hcmd = (void *)node->tlv.data;
|
||||
struct iwl_fw_ini_hcmd *hcmd_data = &hcmd->hcmd;
|
||||
u32 domain = le32_to_cpu(hcmd->hdr.domain);
|
||||
u16 hcmd_len = le32_to_cpu(node->tlv.length) - sizeof(*hcmd);
|
||||
struct iwl_host_cmd cmd = {
|
||||
.id = WIDE_ID(hcmd_data->group, hcmd_data->id),
|
||||
@ -675,10 +683,6 @@ static void iwl_dbg_tlv_send_hcmds(struct iwl_fw_runtime *fwrt,
|
||||
.data = { hcmd_data->data, },
|
||||
};
|
||||
|
||||
if (domain != IWL_FW_INI_DOMAIN_ALWAYS_ON &&
|
||||
!(domain & fwrt->trans->dbg.domains_bitmap))
|
||||
continue;
|
||||
|
||||
iwl_trans_send_cmd(fwrt->trans, &cmd);
|
||||
}
|
||||
}
|
||||
@ -898,55 +902,17 @@ static void
|
||||
iwl_dbg_tlv_gen_active_trig_list(struct iwl_fw_runtime *fwrt,
|
||||
struct iwl_dbg_tlv_time_point_data *tp)
|
||||
{
|
||||
struct iwl_dbg_tlv_node *node, *tmp;
|
||||
struct iwl_dbg_tlv_node *node;
|
||||
struct list_head *trig_list = &tp->trig_list;
|
||||
struct list_head *active_trig_list = &tp->active_trig_list;
|
||||
|
||||
list_for_each_entry_safe(node, tmp, active_trig_list, list) {
|
||||
list_del(&node->list);
|
||||
kfree(node);
|
||||
}
|
||||
|
||||
list_for_each_entry(node, trig_list, list) {
|
||||
struct iwl_ucode_tlv *tlv = &node->tlv;
|
||||
struct iwl_fw_ini_trigger_tlv *trig = (void *)tlv->data;
|
||||
u32 domain = le32_to_cpu(trig->hdr.domain);
|
||||
|
||||
if (domain != IWL_FW_INI_DOMAIN_ALWAYS_ON &&
|
||||
!(domain & fwrt->trans->dbg.domains_bitmap))
|
||||
continue;
|
||||
|
||||
iwl_dbg_tlv_add_active_trigger(fwrt, active_trig_list, tlv);
|
||||
}
|
||||
}
|
||||
|
||||
int iwl_dbg_tlv_gen_active_trigs(struct iwl_fw_runtime *fwrt, u32 new_domain)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (test_and_set_bit(STATUS_GEN_ACTIVE_TRIGS, &fwrt->status))
|
||||
return -EBUSY;
|
||||
|
||||
iwl_fw_flush_dumps(fwrt);
|
||||
|
||||
fwrt->trans->dbg.domains_bitmap = new_domain;
|
||||
|
||||
IWL_DEBUG_FW(fwrt,
|
||||
"WRT: Generating active triggers list, domain 0x%x\n",
|
||||
fwrt->trans->dbg.domains_bitmap);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(fwrt->trans->dbg.time_point); i++) {
|
||||
struct iwl_dbg_tlv_time_point_data *tp =
|
||||
&fwrt->trans->dbg.time_point[i];
|
||||
|
||||
iwl_dbg_tlv_gen_active_trig_list(fwrt, tp);
|
||||
}
|
||||
|
||||
clear_bit(STATUS_GEN_ACTIVE_TRIGS, &fwrt->status);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool iwl_dbg_tlv_check_fw_pkt(struct iwl_fw_runtime *fwrt,
|
||||
struct iwl_fwrt_dump_data *dump_data,
|
||||
union iwl_dbg_tlv_tp_data *tp_data,
|
||||
@ -1020,7 +986,16 @@ static void iwl_dbg_tlv_init_cfg(struct iwl_fw_runtime *fwrt)
|
||||
enum iwl_fw_ini_buffer_location *ini_dest = &fwrt->trans->dbg.ini_dest;
|
||||
int ret, i;
|
||||
|
||||
iwl_dbg_tlv_gen_active_trigs(fwrt, IWL_FW_DBG_DOMAIN);
|
||||
IWL_DEBUG_FW(fwrt,
|
||||
"WRT: Generating active triggers list, domain 0x%x\n",
|
||||
fwrt->trans->dbg.domains_bitmap);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(fwrt->trans->dbg.time_point); i++) {
|
||||
struct iwl_dbg_tlv_time_point_data *tp =
|
||||
&fwrt->trans->dbg.time_point[i];
|
||||
|
||||
iwl_dbg_tlv_gen_active_trig_list(fwrt, tp);
|
||||
}
|
||||
|
||||
*ini_dest = IWL_FW_INI_LOCATION_INVALID;
|
||||
for (i = 0; i < IWL_FW_INI_ALLOCATION_NUM; i++) {
|
||||
|
@ -105,7 +105,6 @@ void iwl_dbg_tlv_init(struct iwl_trans *trans);
|
||||
void iwl_dbg_tlv_time_point(struct iwl_fw_runtime *fwrt,
|
||||
enum iwl_fw_ini_time_point tp_id,
|
||||
union iwl_dbg_tlv_tp_data *tp_data);
|
||||
int iwl_dbg_tlv_gen_active_trigs(struct iwl_fw_runtime *fwrt, u32 new_domain);
|
||||
void iwl_dbg_tlv_del_timers(struct iwl_trans *trans);
|
||||
|
||||
#endif /* __iwl_dbg_tlv_h__*/
|
||||
|
@ -493,6 +493,16 @@ static void iwl_set_ucode_capabilities(struct iwl_drv *drv, const u8 *data,
|
||||
}
|
||||
}
|
||||
|
||||
static const char *iwl_reduced_fw_name(struct iwl_drv *drv)
|
||||
{
|
||||
const char *name = drv->firmware_name;
|
||||
|
||||
if (strncmp(name, "iwlwifi-", 8) == 0)
|
||||
name += 8;
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
static int iwl_parse_v1_v2_firmware(struct iwl_drv *drv,
|
||||
const struct firmware *ucode_raw,
|
||||
struct iwl_firmware_pieces *pieces)
|
||||
@ -551,12 +561,12 @@ static int iwl_parse_v1_v2_firmware(struct iwl_drv *drv,
|
||||
|
||||
snprintf(drv->fw.fw_version,
|
||||
sizeof(drv->fw.fw_version),
|
||||
"%u.%u.%u.%u%s",
|
||||
"%u.%u.%u.%u%s %s",
|
||||
IWL_UCODE_MAJOR(drv->fw.ucode_ver),
|
||||
IWL_UCODE_MINOR(drv->fw.ucode_ver),
|
||||
IWL_UCODE_API(drv->fw.ucode_ver),
|
||||
IWL_UCODE_SERIAL(drv->fw.ucode_ver),
|
||||
buildstr);
|
||||
buildstr, iwl_reduced_fw_name(drv));
|
||||
|
||||
/* Verify size of file vs. image size info in file's header */
|
||||
|
||||
@ -636,12 +646,12 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv,
|
||||
|
||||
snprintf(drv->fw.fw_version,
|
||||
sizeof(drv->fw.fw_version),
|
||||
"%u.%u.%u.%u%s",
|
||||
"%u.%u.%u.%u%s %s",
|
||||
IWL_UCODE_MAJOR(drv->fw.ucode_ver),
|
||||
IWL_UCODE_MINOR(drv->fw.ucode_ver),
|
||||
IWL_UCODE_API(drv->fw.ucode_ver),
|
||||
IWL_UCODE_SERIAL(drv->fw.ucode_ver),
|
||||
buildstr);
|
||||
buildstr, iwl_reduced_fw_name(drv));
|
||||
|
||||
data = ucode->data;
|
||||
|
||||
@ -895,11 +905,13 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv,
|
||||
if (major >= 35)
|
||||
snprintf(drv->fw.fw_version,
|
||||
sizeof(drv->fw.fw_version),
|
||||
"%u.%08x.%u", major, minor, local_comp);
|
||||
"%u.%08x.%u %s", major, minor,
|
||||
local_comp, iwl_reduced_fw_name(drv));
|
||||
else
|
||||
snprintf(drv->fw.fw_version,
|
||||
sizeof(drv->fw.fw_version),
|
||||
"%u.%u.%u", major, minor, local_comp);
|
||||
"%u.%u.%u %s", major, minor,
|
||||
local_comp, iwl_reduced_fw_name(drv));
|
||||
break;
|
||||
}
|
||||
case IWL_UCODE_TLV_FW_DBG_DEST: {
|
||||
@ -1647,6 +1659,8 @@ struct iwl_drv *iwl_drv_start(struct iwl_trans *trans)
|
||||
drv->trans->dbgfs_dir = debugfs_create_dir("trans", drv->dbgfs_drv);
|
||||
#endif
|
||||
|
||||
drv->trans->dbg.domains_bitmap = IWL_TRANS_FW_DBG_DOMAIN(drv->trans);
|
||||
|
||||
ret = iwl_request_firmware(drv, true);
|
||||
if (ret) {
|
||||
IWL_ERR(trans, "Couldn't request the fw\n");
|
||||
|
@ -611,10 +611,7 @@ static inline unsigned int FH_MEM_CBBC_QUEUE(struct iwl_trans *trans,
|
||||
*/
|
||||
#define FH_TX_CHICKEN_BITS_SCD_AUTO_RETRY_EN (0x00000002)
|
||||
|
||||
#define MQ_RX_TABLE_SIZE 512
|
||||
#define MQ_RX_TABLE_MASK (MQ_RX_TABLE_SIZE - 1)
|
||||
#define MQ_RX_NUM_RBDS (MQ_RX_TABLE_SIZE - 1)
|
||||
#define RX_POOL_SIZE (MQ_RX_NUM_RBDS + \
|
||||
#define RX_POOL_SIZE(rbds) ((rbds) - 1 + \
|
||||
IWL_MAX_RX_HW_QUEUES * \
|
||||
(RX_CLAIM_REQ_ALLOC - RX_POST_REQ_ALLOC))
|
||||
/* cb size is the exponent */
|
||||
|
@ -70,36 +70,6 @@
|
||||
#include "iwl-prph.h"
|
||||
#include "iwl-fh.h"
|
||||
|
||||
const struct iwl_csr_params iwl_csr_v1 = {
|
||||
.flag_mac_clock_ready = 0,
|
||||
.flag_val_mac_access_en = 0,
|
||||
.flag_init_done = 2,
|
||||
.flag_mac_access_req = 3,
|
||||
.flag_sw_reset = 7,
|
||||
.flag_master_dis = 8,
|
||||
.flag_stop_master = 9,
|
||||
.addr_sw_reset = CSR_BASE + 0x020,
|
||||
.mac_addr0_otp = 0x380,
|
||||
.mac_addr1_otp = 0x384,
|
||||
.mac_addr0_strap = 0x388,
|
||||
.mac_addr1_strap = 0x38C
|
||||
};
|
||||
|
||||
const struct iwl_csr_params iwl_csr_v2 = {
|
||||
.flag_init_done = 6,
|
||||
.flag_mac_clock_ready = 20,
|
||||
.flag_val_mac_access_en = 20,
|
||||
.flag_mac_access_req = 21,
|
||||
.flag_master_dis = 28,
|
||||
.flag_stop_master = 29,
|
||||
.flag_sw_reset = 31,
|
||||
.addr_sw_reset = CSR_BASE + 0x024,
|
||||
.mac_addr0_otp = 0x30,
|
||||
.mac_addr1_otp = 0x34,
|
||||
.mac_addr0_strap = 0x38,
|
||||
.mac_addr1_strap = 0x3C
|
||||
};
|
||||
|
||||
void iwl_write8(struct iwl_trans *trans, u32 ofs, u8 val)
|
||||
{
|
||||
trace_iwlwifi_dev_iowrite8(trans->dev, ofs, val);
|
||||
@ -506,8 +476,7 @@ int iwl_finish_nic_init(struct iwl_trans *trans,
|
||||
* Set "initialization complete" bit to move adapter from
|
||||
* D0U* --> D0A* (powered-up active) state.
|
||||
*/
|
||||
iwl_set_bit(trans, CSR_GP_CNTRL,
|
||||
BIT(cfg_trans->csr->flag_init_done));
|
||||
iwl_set_bit(trans, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE);
|
||||
|
||||
if (cfg_trans->device_family == IWL_DEVICE_FAMILY_8000)
|
||||
udelay(2);
|
||||
@ -518,8 +487,8 @@ int iwl_finish_nic_init(struct iwl_trans *trans,
|
||||
* and accesses to uCode SRAM.
|
||||
*/
|
||||
err = iwl_poll_bit(trans, CSR_GP_CNTRL,
|
||||
BIT(cfg_trans->csr->flag_mac_clock_ready),
|
||||
BIT(cfg_trans->csr->flag_mac_clock_ready),
|
||||
CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY,
|
||||
CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY,
|
||||
25000);
|
||||
if (err < 0)
|
||||
IWL_DEBUG_INFO(trans, "Failed to wake NIC\n");
|
||||
|
@ -829,12 +829,8 @@ static void iwl_flip_hw_address(__le32 mac_addr0, __le32 mac_addr1, u8 *dest)
|
||||
static void iwl_set_hw_address_from_csr(struct iwl_trans *trans,
|
||||
struct iwl_nvm_data *data)
|
||||
{
|
||||
__le32 mac_addr0 =
|
||||
cpu_to_le32(iwl_read32(trans,
|
||||
trans->trans_cfg->csr->mac_addr0_strap));
|
||||
__le32 mac_addr1 =
|
||||
cpu_to_le32(iwl_read32(trans,
|
||||
trans->trans_cfg->csr->mac_addr1_strap));
|
||||
__le32 mac_addr0 = cpu_to_le32(iwl_read32(trans, CSR_MAC_ADDR0_STRAP));
|
||||
__le32 mac_addr1 = cpu_to_le32(iwl_read32(trans, CSR_MAC_ADDR1_STRAP));
|
||||
|
||||
iwl_flip_hw_address(mac_addr0, mac_addr1, data->hw_addr);
|
||||
/*
|
||||
@ -844,10 +840,8 @@ static void iwl_set_hw_address_from_csr(struct iwl_trans *trans,
|
||||
if (is_valid_ether_addr(data->hw_addr))
|
||||
return;
|
||||
|
||||
mac_addr0 = cpu_to_le32(iwl_read32(trans,
|
||||
trans->trans_cfg->csr->mac_addr0_otp));
|
||||
mac_addr1 = cpu_to_le32(iwl_read32(trans,
|
||||
trans->trans_cfg->csr->mac_addr1_otp));
|
||||
mac_addr0 = cpu_to_le32(iwl_read32(trans, CSR_MAC_ADDR0_OTP));
|
||||
mac_addr1 = cpu_to_le32(iwl_read32(trans, CSR_MAC_ADDR1_OTP));
|
||||
|
||||
iwl_flip_hw_address(mac_addr0, mac_addr1, data->hw_addr);
|
||||
}
|
||||
|
@ -411,13 +411,6 @@ enum {
|
||||
HW_STEP_LOCATION_BITS = 24,
|
||||
};
|
||||
|
||||
#define AUX_MISC_MASTER1_EN 0xA20818
|
||||
enum aux_misc_master1_en {
|
||||
AUX_MISC_MASTER1_EN_SBE_MSK = 0x1,
|
||||
};
|
||||
|
||||
#define AUX_MISC_MASTER1_SMPHR_STATUS 0xA20800
|
||||
#define RSA_ENABLE 0xA24B08
|
||||
#define PREG_AUX_BUS_WPROT_0 0xA04CC0
|
||||
|
||||
/* device family 9000 WPROT register */
|
||||
@ -430,6 +423,9 @@ enum aux_misc_master1_en {
|
||||
#define UMAG_SB_CPU_1_STATUS 0xA038C0
|
||||
#define UMAG_SB_CPU_2_STATUS 0xA038C4
|
||||
#define UMAG_GEN_HW_STATUS 0xA038C8
|
||||
#define UREG_UMAC_CURRENT_PC 0xa05c18
|
||||
#define UREG_LMAC1_CURRENT_PC 0xa05c1c
|
||||
#define UREG_LMAC2_CURRENT_PC 0xa05c20
|
||||
|
||||
/* For UMAG_GEN_HW_STATUS reg check */
|
||||
enum {
|
||||
|
@ -112,6 +112,8 @@
|
||||
* 6) Eventually, the free function will be called.
|
||||
*/
|
||||
|
||||
#define IWL_TRANS_FW_DBG_DOMAIN(trans) IWL_FW_INI_DOMAIN_ALWAYS_ON
|
||||
|
||||
#define FH_RSCSR_FRAME_SIZE_MSK 0x00003FFF /* bits 0-13 */
|
||||
#define FH_RSCSR_FRAME_INVALID 0x55550000
|
||||
#define FH_RSCSR_FRAME_ALIGN 0x40
|
||||
@ -370,6 +372,24 @@ iwl_trans_get_rb_size_order(enum iwl_amsdu_size rb_size)
|
||||
}
|
||||
}
|
||||
|
||||
static inline int
|
||||
iwl_trans_get_rb_size(enum iwl_amsdu_size rb_size)
|
||||
{
|
||||
switch (rb_size) {
|
||||
case IWL_AMSDU_2K:
|
||||
return 2 * 1024;
|
||||
case IWL_AMSDU_4K:
|
||||
return 4 * 1024;
|
||||
case IWL_AMSDU_8K:
|
||||
return 8 * 1024;
|
||||
case IWL_AMSDU_12K:
|
||||
return 12 * 1024;
|
||||
default:
|
||||
WARN_ON(1);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
struct iwl_hcmd_names {
|
||||
u8 cmd_id;
|
||||
const char *const cmd_name;
|
||||
@ -851,6 +871,8 @@ struct iwl_trans {
|
||||
|
||||
enum iwl_plat_pm_mode system_pm_mode;
|
||||
|
||||
const char *name;
|
||||
|
||||
/* pointer to trans specific struct */
|
||||
/*Ensure that this pointer will always be aligned to sizeof pointer */
|
||||
char trans_specific[0] __aligned(sizeof(void *));
|
||||
|
@ -989,6 +989,8 @@ static int __iwl_mvm_suspend(struct ieee80211_hw *hw,
|
||||
|
||||
mutex_lock(&mvm->mutex);
|
||||
|
||||
set_bit(IWL_MVM_STATUS_IN_D3, &mvm->status);
|
||||
|
||||
vif = iwl_mvm_get_bss_vif(mvm);
|
||||
if (IS_ERR_OR_NULL(vif)) {
|
||||
ret = 1;
|
||||
@ -1083,6 +1085,8 @@ static int __iwl_mvm_suspend(struct ieee80211_hw *hw,
|
||||
ieee80211_restart_hw(mvm->hw);
|
||||
}
|
||||
}
|
||||
|
||||
clear_bit(IWL_MVM_STATUS_IN_D3, &mvm->status);
|
||||
}
|
||||
out_noreset:
|
||||
mutex_unlock(&mvm->mutex);
|
||||
@ -1929,6 +1933,8 @@ static int __iwl_mvm_resume(struct iwl_mvm *mvm, bool test)
|
||||
|
||||
mutex_lock(&mvm->mutex);
|
||||
|
||||
clear_bit(IWL_MVM_STATUS_IN_D3, &mvm->status);
|
||||
|
||||
/* get the BSS vif pointer again */
|
||||
vif = iwl_mvm_get_bss_vif(mvm);
|
||||
if (IS_ERR_OR_NULL(vif))
|
||||
|
@ -752,7 +752,7 @@ static ssize_t iwl_dbgfs_fw_ver_read(struct file *file, char __user *user_buf,
|
||||
pos += scnprintf(pos, endpos - pos, "FW: %s\n",
|
||||
mvm->fwrt.fw->human_readable);
|
||||
pos += scnprintf(pos, endpos - pos, "Device: %s\n",
|
||||
mvm->fwrt.trans->cfg->name);
|
||||
mvm->fwrt.trans->name);
|
||||
pos += scnprintf(pos, endpos - pos, "Bus: %s\n",
|
||||
mvm->fwrt.dev->bus->name);
|
||||
|
||||
|
@ -208,10 +208,11 @@ static void iwl_mvm_ftm_cmd(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||
cmd->tsf_mac_id = cpu_to_le32(0xff);
|
||||
}
|
||||
|
||||
static int iwl_mvm_ftm_target_chandef(struct iwl_mvm *mvm,
|
||||
struct cfg80211_pmsr_request_peer *peer,
|
||||
u8 *channel, u8 *bandwidth,
|
||||
u8 *ctrl_ch_position)
|
||||
static int
|
||||
iwl_mvm_ftm_target_chandef_v1(struct iwl_mvm *mvm,
|
||||
struct cfg80211_pmsr_request_peer *peer,
|
||||
u8 *channel, u8 *bandwidth,
|
||||
u8 *ctrl_ch_position)
|
||||
{
|
||||
u32 freq = peer->chandef.chan->center_freq;
|
||||
|
||||
@ -242,6 +243,45 @@ static int iwl_mvm_ftm_target_chandef(struct iwl_mvm *mvm,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
iwl_mvm_ftm_target_chandef_v2(struct iwl_mvm *mvm,
|
||||
struct cfg80211_pmsr_request_peer *peer,
|
||||
u8 *channel, u8 *format_bw,
|
||||
u8 *ctrl_ch_position)
|
||||
{
|
||||
u32 freq = peer->chandef.chan->center_freq;
|
||||
|
||||
*channel = ieee80211_frequency_to_channel(freq);
|
||||
|
||||
switch (peer->chandef.width) {
|
||||
case NL80211_CHAN_WIDTH_20_NOHT:
|
||||
*format_bw = IWL_LOCATION_FRAME_FORMAT_LEGACY;
|
||||
*format_bw |= IWL_LOCATION_BW_20MHZ << LOCATION_BW_POS;
|
||||
break;
|
||||
case NL80211_CHAN_WIDTH_20:
|
||||
*format_bw = IWL_LOCATION_FRAME_FORMAT_HT;
|
||||
*format_bw |= IWL_LOCATION_BW_20MHZ << LOCATION_BW_POS;
|
||||
break;
|
||||
case NL80211_CHAN_WIDTH_40:
|
||||
*format_bw = IWL_LOCATION_FRAME_FORMAT_HT;
|
||||
*format_bw |= IWL_LOCATION_BW_40MHZ << LOCATION_BW_POS;
|
||||
break;
|
||||
case NL80211_CHAN_WIDTH_80:
|
||||
*format_bw = IWL_LOCATION_FRAME_FORMAT_VHT;
|
||||
*format_bw |= IWL_LOCATION_BW_80MHZ << LOCATION_BW_POS;
|
||||
break;
|
||||
default:
|
||||
IWL_ERR(mvm, "Unsupported BW in FTM request (%d)\n",
|
||||
peer->chandef.width);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
*ctrl_ch_position = (peer->chandef.width > NL80211_CHAN_WIDTH_20) ?
|
||||
iwl_mvm_get_ctrl_pos(&peer->chandef) : 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
iwl_mvm_ftm_put_target_v2(struct iwl_mvm *mvm,
|
||||
struct cfg80211_pmsr_request_peer *peer,
|
||||
@ -249,9 +289,9 @@ iwl_mvm_ftm_put_target_v2(struct iwl_mvm *mvm,
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = iwl_mvm_ftm_target_chandef(mvm, peer, &target->channel_num,
|
||||
&target->bandwidth,
|
||||
&target->ctrl_ch_position);
|
||||
ret = iwl_mvm_ftm_target_chandef_v1(mvm, peer, &target->channel_num,
|
||||
&target->bandwidth,
|
||||
&target->ctrl_ch_position);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@ -278,18 +318,11 @@ iwl_mvm_ftm_put_target_v2(struct iwl_mvm *mvm,
|
||||
#define FTM_PUT_FLAG(flag) (target->initiator_ap_flags |= \
|
||||
cpu_to_le32(IWL_INITIATOR_AP_FLAGS_##flag))
|
||||
|
||||
static int iwl_mvm_ftm_put_target(struct iwl_mvm *mvm,
|
||||
struct cfg80211_pmsr_request_peer *peer,
|
||||
struct iwl_tof_range_req_ap_entry *target)
|
||||
static void
|
||||
iwl_mvm_ftm_put_target_common(struct iwl_mvm *mvm,
|
||||
struct cfg80211_pmsr_request_peer *peer,
|
||||
struct iwl_tof_range_req_ap_entry *target)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = iwl_mvm_ftm_target_chandef(mvm, peer, &target->channel_num,
|
||||
&target->bandwidth,
|
||||
&target->ctrl_ch_position);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
memcpy(target->bssid, peer->addr, ETH_ALEN);
|
||||
target->burst_period =
|
||||
cpu_to_le16(peer->ftm.burst_period);
|
||||
@ -314,24 +347,149 @@ static int iwl_mvm_ftm_put_target(struct iwl_mvm *mvm,
|
||||
FTM_PUT_FLAG(ALGO_LR);
|
||||
else if (IWL_MVM_FTM_INITIATOR_ALGO == IWL_TOF_ALGO_TYPE_FFT)
|
||||
FTM_PUT_FLAG(ALGO_FFT);
|
||||
}
|
||||
|
||||
static int
|
||||
iwl_mvm_ftm_put_target_v3(struct iwl_mvm *mvm,
|
||||
struct cfg80211_pmsr_request_peer *peer,
|
||||
struct iwl_tof_range_req_ap_entry_v3 *target)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = iwl_mvm_ftm_target_chandef_v1(mvm, peer, &target->channel_num,
|
||||
&target->bandwidth,
|
||||
&target->ctrl_ch_position);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* Versions 3 and 4 has some common fields, so
|
||||
* iwl_mvm_ftm_put_target_common() can be used for version 7 too.
|
||||
*/
|
||||
iwl_mvm_ftm_put_target_common(mvm, peer, (void *)target);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int iwl_mvm_ftm_put_target_v4(struct iwl_mvm *mvm,
|
||||
struct cfg80211_pmsr_request_peer *peer,
|
||||
struct iwl_tof_range_req_ap_entry *target)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = iwl_mvm_ftm_target_chandef_v2(mvm, peer, &target->channel_num,
|
||||
&target->format_bw,
|
||||
&target->ctrl_ch_position);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
iwl_mvm_ftm_put_target_common(mvm, peer, target);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int iwl_mvm_ftm_send_cmd(struct iwl_mvm *mvm, struct iwl_host_cmd *hcmd)
|
||||
{
|
||||
u32 status;
|
||||
int err = iwl_mvm_send_cmd_status(mvm, hcmd, &status);
|
||||
|
||||
if (!err && status) {
|
||||
IWL_ERR(mvm, "FTM range request command failure, status: %u\n",
|
||||
status);
|
||||
err = iwl_ftm_range_request_status_to_err(status);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int iwl_mvm_ftm_start_v5(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||
struct cfg80211_pmsr_request *req)
|
||||
{
|
||||
struct iwl_tof_range_req_cmd_v5 cmd_v5;
|
||||
struct iwl_host_cmd hcmd = {
|
||||
.id = iwl_cmd_id(TOF_RANGE_REQ_CMD, LOCATION_GROUP, 0),
|
||||
.dataflags[0] = IWL_HCMD_DFL_DUP,
|
||||
.data[0] = &cmd_v5,
|
||||
.len[0] = sizeof(cmd_v5),
|
||||
};
|
||||
u8 i;
|
||||
int err;
|
||||
|
||||
iwl_mvm_ftm_cmd_v5(mvm, vif, &cmd_v5, req);
|
||||
|
||||
for (i = 0; i < cmd_v5.num_of_ap; i++) {
|
||||
struct cfg80211_pmsr_request_peer *peer = &req->peers[i];
|
||||
|
||||
err = iwl_mvm_ftm_put_target_v2(mvm, peer, &cmd_v5.ap[i]);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
return iwl_mvm_ftm_send_cmd(mvm, &hcmd);
|
||||
}
|
||||
|
||||
static int iwl_mvm_ftm_start_v7(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||
struct cfg80211_pmsr_request *req)
|
||||
{
|
||||
struct iwl_tof_range_req_cmd_v7 cmd_v7;
|
||||
struct iwl_host_cmd hcmd = {
|
||||
.id = iwl_cmd_id(TOF_RANGE_REQ_CMD, LOCATION_GROUP, 0),
|
||||
.dataflags[0] = IWL_HCMD_DFL_DUP,
|
||||
.data[0] = &cmd_v7,
|
||||
.len[0] = sizeof(cmd_v7),
|
||||
};
|
||||
u8 i;
|
||||
int err;
|
||||
|
||||
/*
|
||||
* Versions 7 and 8 has the same structure except from the responders
|
||||
* list, so iwl_mvm_ftm_cmd() can be used for version 7 too.
|
||||
*/
|
||||
iwl_mvm_ftm_cmd(mvm, vif, (void *)&cmd_v7, req);
|
||||
|
||||
for (i = 0; i < cmd_v7.num_of_ap; i++) {
|
||||
struct cfg80211_pmsr_request_peer *peer = &req->peers[i];
|
||||
|
||||
err = iwl_mvm_ftm_put_target_v3(mvm, peer, &cmd_v7.ap[i]);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
return iwl_mvm_ftm_send_cmd(mvm, &hcmd);
|
||||
}
|
||||
|
||||
static int iwl_mvm_ftm_start_v8(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||
struct cfg80211_pmsr_request *req)
|
||||
{
|
||||
struct iwl_tof_range_req_cmd cmd;
|
||||
struct iwl_host_cmd hcmd = {
|
||||
.id = iwl_cmd_id(TOF_RANGE_REQ_CMD, LOCATION_GROUP, 0),
|
||||
.dataflags[0] = IWL_HCMD_DFL_DUP,
|
||||
.data[0] = &cmd,
|
||||
.len[0] = sizeof(cmd),
|
||||
};
|
||||
u8 i;
|
||||
int err;
|
||||
|
||||
iwl_mvm_ftm_cmd(mvm, vif, &cmd, req);
|
||||
|
||||
for (i = 0; i < cmd.num_of_ap; i++) {
|
||||
struct cfg80211_pmsr_request_peer *peer = &req->peers[i];
|
||||
|
||||
err = iwl_mvm_ftm_put_target_v4(mvm, peer, &cmd.ap[i]);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
return iwl_mvm_ftm_send_cmd(mvm, &hcmd);
|
||||
}
|
||||
|
||||
int iwl_mvm_ftm_start(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||
struct cfg80211_pmsr_request *req)
|
||||
{
|
||||
struct iwl_tof_range_req_cmd_v5 cmd_v5;
|
||||
struct iwl_tof_range_req_cmd cmd;
|
||||
bool new_api = fw_has_api(&mvm->fw->ucode_capa,
|
||||
IWL_UCODE_TLV_API_FTM_NEW_RANGE_REQ);
|
||||
u8 num_of_ap;
|
||||
struct iwl_host_cmd hcmd = {
|
||||
.id = iwl_cmd_id(TOF_RANGE_REQ_CMD, LOCATION_GROUP, 0),
|
||||
.dataflags[0] = IWL_HCMD_DFL_DUP,
|
||||
};
|
||||
u32 status = 0;
|
||||
int err, i;
|
||||
int err;
|
||||
|
||||
lockdep_assert_held(&mvm->mutex);
|
||||
|
||||
@ -339,35 +497,16 @@ int iwl_mvm_ftm_start(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||
return -EBUSY;
|
||||
|
||||
if (new_api) {
|
||||
iwl_mvm_ftm_cmd(mvm, vif, &cmd, req);
|
||||
hcmd.data[0] = &cmd;
|
||||
hcmd.len[0] = sizeof(cmd);
|
||||
num_of_ap = cmd.num_of_ap;
|
||||
} else {
|
||||
iwl_mvm_ftm_cmd_v5(mvm, vif, &cmd_v5, req);
|
||||
hcmd.data[0] = &cmd_v5;
|
||||
hcmd.len[0] = sizeof(cmd_v5);
|
||||
num_of_ap = cmd_v5.num_of_ap;
|
||||
}
|
||||
u8 cmd_ver = iwl_mvm_lookup_cmd_ver(mvm->fw, LOCATION_GROUP,
|
||||
TOF_RANGE_REQ_CMD);
|
||||
|
||||
for (i = 0; i < num_of_ap; i++) {
|
||||
struct cfg80211_pmsr_request_peer *peer = &req->peers[i];
|
||||
|
||||
if (new_api)
|
||||
err = iwl_mvm_ftm_put_target(mvm, peer, &cmd.ap[i]);
|
||||
if (cmd_ver == 8)
|
||||
err = iwl_mvm_ftm_start_v8(mvm, vif, req);
|
||||
else
|
||||
err = iwl_mvm_ftm_put_target_v2(mvm, peer,
|
||||
&cmd_v5.ap[i]);
|
||||
err = iwl_mvm_ftm_start_v7(mvm, vif, req);
|
||||
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
err = iwl_mvm_send_cmd_status(mvm, &hcmd, &status);
|
||||
if (!err && status) {
|
||||
IWL_ERR(mvm, "FTM range request command failure, status: %u\n",
|
||||
status);
|
||||
err = iwl_ftm_range_request_status_to_err(status);
|
||||
} else {
|
||||
err = iwl_mvm_ftm_start_v5(mvm, vif, req);
|
||||
}
|
||||
|
||||
if (!err) {
|
||||
|
@ -6,7 +6,7 @@
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2015 - 2017 Intel Deutschland GmbH
|
||||
* Copyright (C) 2018 Intel Corporation
|
||||
* Copyright (C) 2018 - 2019 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
|
||||
@ -27,7 +27,7 @@
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2015 - 2017 Intel Deutschland GmbH
|
||||
* Copyright (C) 2018 Intel Corporation
|
||||
* Copyright (C) 2018 - 2019 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -62,12 +62,72 @@
|
||||
#include "mvm.h"
|
||||
#include "constants.h"
|
||||
|
||||
static int iwl_mvm_ftm_responder_set_bw_v1(struct cfg80211_chan_def *chandef,
|
||||
u8 *bw, u8 *ctrl_ch_position)
|
||||
{
|
||||
switch (chandef->width) {
|
||||
case NL80211_CHAN_WIDTH_20_NOHT:
|
||||
*bw = IWL_TOF_BW_20_LEGACY;
|
||||
break;
|
||||
case NL80211_CHAN_WIDTH_20:
|
||||
*bw = IWL_TOF_BW_20_HT;
|
||||
break;
|
||||
case NL80211_CHAN_WIDTH_40:
|
||||
*bw = IWL_TOF_BW_40;
|
||||
*ctrl_ch_position = iwl_mvm_get_ctrl_pos(chandef);
|
||||
break;
|
||||
case NL80211_CHAN_WIDTH_80:
|
||||
*bw = IWL_TOF_BW_80;
|
||||
*ctrl_ch_position = iwl_mvm_get_ctrl_pos(chandef);
|
||||
break;
|
||||
default:
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int iwl_mvm_ftm_responder_set_bw_v2(struct cfg80211_chan_def *chandef,
|
||||
u8 *format_bw,
|
||||
u8 *ctrl_ch_position)
|
||||
{
|
||||
switch (chandef->width) {
|
||||
case NL80211_CHAN_WIDTH_20_NOHT:
|
||||
*format_bw = IWL_LOCATION_FRAME_FORMAT_LEGACY;
|
||||
*format_bw |= IWL_LOCATION_BW_20MHZ << LOCATION_BW_POS;
|
||||
break;
|
||||
case NL80211_CHAN_WIDTH_20:
|
||||
*format_bw = IWL_LOCATION_FRAME_FORMAT_HT;
|
||||
*format_bw |= IWL_LOCATION_BW_20MHZ << LOCATION_BW_POS;
|
||||
break;
|
||||
case NL80211_CHAN_WIDTH_40:
|
||||
*format_bw = IWL_LOCATION_FRAME_FORMAT_HT;
|
||||
*format_bw |= IWL_LOCATION_BW_40MHZ << LOCATION_BW_POS;
|
||||
*ctrl_ch_position = iwl_mvm_get_ctrl_pos(chandef);
|
||||
break;
|
||||
case NL80211_CHAN_WIDTH_80:
|
||||
*format_bw = IWL_LOCATION_FRAME_FORMAT_VHT;
|
||||
*format_bw |= IWL_LOCATION_BW_80MHZ << LOCATION_BW_POS;
|
||||
*ctrl_ch_position = iwl_mvm_get_ctrl_pos(chandef);
|
||||
break;
|
||||
default:
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
iwl_mvm_ftm_responder_cmd(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif,
|
||||
struct cfg80211_chan_def *chandef)
|
||||
{
|
||||
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
|
||||
/*
|
||||
* The command structure is the same for versions 6 and 7, (only the
|
||||
* field interpretation is different), so the same struct can be use
|
||||
* for all cases.
|
||||
*/
|
||||
struct iwl_tof_responder_config_cmd cmd = {
|
||||
.channel_num = chandef->chan->hw_value,
|
||||
.cmd_valid_fields =
|
||||
@ -76,27 +136,22 @@ iwl_mvm_ftm_responder_cmd(struct iwl_mvm *mvm,
|
||||
IWL_TOF_RESPONDER_CMD_VALID_STA_ID),
|
||||
.sta_id = mvmvif->bcast_sta.sta_id,
|
||||
};
|
||||
u8 cmd_ver = iwl_mvm_lookup_cmd_ver(mvm->fw, LOCATION_GROUP,
|
||||
TOF_RESPONDER_CONFIG_CMD);
|
||||
int err;
|
||||
|
||||
lockdep_assert_held(&mvm->mutex);
|
||||
|
||||
switch (chandef->width) {
|
||||
case NL80211_CHAN_WIDTH_20_NOHT:
|
||||
cmd.bandwidth = IWL_TOF_BW_20_LEGACY;
|
||||
break;
|
||||
case NL80211_CHAN_WIDTH_20:
|
||||
cmd.bandwidth = IWL_TOF_BW_20_HT;
|
||||
break;
|
||||
case NL80211_CHAN_WIDTH_40:
|
||||
cmd.bandwidth = IWL_TOF_BW_40;
|
||||
cmd.ctrl_ch_position = iwl_mvm_get_ctrl_pos(chandef);
|
||||
break;
|
||||
case NL80211_CHAN_WIDTH_80:
|
||||
cmd.bandwidth = IWL_TOF_BW_80;
|
||||
cmd.ctrl_ch_position = iwl_mvm_get_ctrl_pos(chandef);
|
||||
break;
|
||||
default:
|
||||
WARN_ON(1);
|
||||
return -EINVAL;
|
||||
if (cmd_ver == 7)
|
||||
err = iwl_mvm_ftm_responder_set_bw_v2(chandef, &cmd.format_bw,
|
||||
&cmd.ctrl_ch_position);
|
||||
else
|
||||
err = iwl_mvm_ftm_responder_set_bw_v1(chandef, &cmd.format_bw,
|
||||
&cmd.ctrl_ch_position);
|
||||
|
||||
if (err) {
|
||||
IWL_ERR(mvm, "Failed to set responder bandwidth\n");
|
||||
return err;
|
||||
}
|
||||
|
||||
memcpy(cmd.bssid, vif->addr, ETH_ALEN);
|
||||
|
@ -353,22 +353,35 @@ static int iwl_mvm_load_ucode_wait_alive(struct iwl_mvm *mvm,
|
||||
if (ret) {
|
||||
struct iwl_trans *trans = mvm->trans;
|
||||
|
||||
if (ret == -ETIMEDOUT)
|
||||
iwl_fw_dbg_error_collect(&mvm->fwrt,
|
||||
FW_DBG_TRIGGER_ALIVE_TIMEOUT);
|
||||
|
||||
if (trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_22000)
|
||||
if (trans->trans_cfg->device_family >=
|
||||
IWL_DEVICE_FAMILY_22000) {
|
||||
IWL_ERR(mvm,
|
||||
"SecBoot CPU1 Status: 0x%x, CPU2 Status: 0x%x\n",
|
||||
iwl_read_umac_prph(trans, UMAG_SB_CPU_1_STATUS),
|
||||
iwl_read_umac_prph(trans,
|
||||
UMAG_SB_CPU_2_STATUS));
|
||||
else if (trans->trans_cfg->device_family >=
|
||||
IWL_DEVICE_FAMILY_8000)
|
||||
IWL_ERR(mvm, "UMAC PC: 0x%x\n",
|
||||
iwl_read_umac_prph(trans,
|
||||
UREG_UMAC_CURRENT_PC));
|
||||
IWL_ERR(mvm, "LMAC PC: 0x%x\n",
|
||||
iwl_read_umac_prph(trans,
|
||||
UREG_LMAC1_CURRENT_PC));
|
||||
if (iwl_mvm_is_cdb_supported(mvm))
|
||||
IWL_ERR(mvm, "LMAC2 PC: 0x%x\n",
|
||||
iwl_read_umac_prph(trans,
|
||||
UREG_LMAC2_CURRENT_PC));
|
||||
} else if (trans->trans_cfg->device_family >=
|
||||
IWL_DEVICE_FAMILY_8000) {
|
||||
IWL_ERR(mvm,
|
||||
"SecBoot CPU1 Status: 0x%x, CPU2 Status: 0x%x\n",
|
||||
iwl_read_prph(trans, SB_CPU_1_STATUS),
|
||||
iwl_read_prph(trans, SB_CPU_2_STATUS));
|
||||
}
|
||||
|
||||
if (ret == -ETIMEDOUT)
|
||||
iwl_fw_dbg_error_collect(&mvm->fwrt,
|
||||
FW_DBG_TRIGGER_ALIVE_TIMEOUT);
|
||||
|
||||
iwl_fw_set_current_image(&mvm->fwrt, old_type);
|
||||
return ret;
|
||||
}
|
||||
|
@ -1160,6 +1160,7 @@ struct iwl_mvm {
|
||||
* @IWL_MVM_STATUS_ROC_AUX_RUNNING: AUX remain-on-channel is running
|
||||
* @IWL_MVM_STATUS_FIRMWARE_RUNNING: firmware is running
|
||||
* @IWL_MVM_STATUS_NEED_FLUSH_P2P: need to flush P2P bcast STA
|
||||
* @IWL_MVM_STATUS_IN_D3: in D3 (or at least about to go into it)
|
||||
*/
|
||||
enum iwl_mvm_status {
|
||||
IWL_MVM_STATUS_HW_RFKILL,
|
||||
@ -1170,6 +1171,7 @@ enum iwl_mvm_status {
|
||||
IWL_MVM_STATUS_ROC_AUX_RUNNING,
|
||||
IWL_MVM_STATUS_FIRMWARE_RUNNING,
|
||||
IWL_MVM_STATUS_NEED_FLUSH_P2P,
|
||||
IWL_MVM_STATUS_IN_D3,
|
||||
};
|
||||
|
||||
/* Keep track of completed init configuration */
|
||||
|
@ -178,7 +178,7 @@ static int iwl_nvm_read_chunk(struct iwl_mvm *mvm, u16 section,
|
||||
} else {
|
||||
IWL_DEBUG_EEPROM(mvm->trans->dev,
|
||||
"NVM access command failed with status %d (device: %s)\n",
|
||||
ret, mvm->cfg->name);
|
||||
ret, mvm->trans->name);
|
||||
ret = -ENODATA;
|
||||
}
|
||||
goto exit;
|
||||
|
@ -830,7 +830,7 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
|
||||
}
|
||||
|
||||
IWL_INFO(mvm, "Detected %s, REV=0x%X\n",
|
||||
mvm->cfg->name, mvm->trans->hw_rev);
|
||||
mvm->trans->name, mvm->trans->hw_rev);
|
||||
|
||||
if (iwlwifi_mod_params.nvm_file)
|
||||
mvm->nvm_file_name = iwlwifi_mod_params.nvm_file;
|
||||
|
@ -198,7 +198,7 @@ static void iwl_mvm_power_configure_uapsd(struct iwl_mvm *mvm,
|
||||
if (!mvmvif->queue_params[ac].uapsd)
|
||||
continue;
|
||||
|
||||
if (mvm->fwrt.cur_fw_img != IWL_UCODE_WOWLAN)
|
||||
if (!test_bit(IWL_MVM_STATUS_IN_D3, &mvm->status))
|
||||
cmd->flags |=
|
||||
cpu_to_le16(POWER_FLAGS_ADVANCE_PM_ENA_MSK);
|
||||
|
||||
@ -233,15 +233,15 @@ static void iwl_mvm_power_configure_uapsd(struct iwl_mvm *mvm,
|
||||
cmd->flags |= cpu_to_le16(POWER_FLAGS_SNOOZE_ENA_MSK);
|
||||
cmd->snooze_interval = cpu_to_le16(IWL_MVM_PS_SNOOZE_INTERVAL);
|
||||
cmd->snooze_window =
|
||||
(mvm->fwrt.cur_fw_img == IWL_UCODE_WOWLAN) ?
|
||||
test_bit(IWL_MVM_STATUS_IN_D3, &mvm->status) ?
|
||||
cpu_to_le16(IWL_MVM_WOWLAN_PS_SNOOZE_WINDOW) :
|
||||
cpu_to_le16(IWL_MVM_PS_SNOOZE_WINDOW);
|
||||
}
|
||||
|
||||
cmd->uapsd_max_sp = mvm->hw->uapsd_max_sp_len;
|
||||
|
||||
if (mvm->fwrt.cur_fw_img == IWL_UCODE_WOWLAN || cmd->flags &
|
||||
cpu_to_le16(POWER_FLAGS_SNOOZE_ENA_MSK)) {
|
||||
if (test_bit(IWL_MVM_STATUS_IN_D3, &mvm->status) ||
|
||||
cmd->flags & cpu_to_le16(POWER_FLAGS_SNOOZE_ENA_MSK)) {
|
||||
cmd->rx_data_timeout_uapsd =
|
||||
cpu_to_le32(IWL_MVM_WOWLAN_PS_RX_DATA_TIMEOUT);
|
||||
cmd->tx_data_timeout_uapsd =
|
||||
@ -354,8 +354,7 @@ static bool iwl_mvm_power_is_radar(struct ieee80211_vif *vif)
|
||||
|
||||
static void iwl_mvm_power_config_skip_dtim(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif,
|
||||
struct iwl_mac_power_cmd *cmd,
|
||||
bool host_awake)
|
||||
struct iwl_mac_power_cmd *cmd)
|
||||
{
|
||||
int dtimper = vif->bss_conf.dtim_period ?: 1;
|
||||
int skip;
|
||||
@ -370,7 +369,7 @@ static void iwl_mvm_power_config_skip_dtim(struct iwl_mvm *mvm,
|
||||
if (dtimper >= 10)
|
||||
return;
|
||||
|
||||
if (host_awake) {
|
||||
if (!test_bit(IWL_MVM_STATUS_IN_D3, &mvm->status)) {
|
||||
if (iwlmvm_mod_params.power_scheme != IWL_POWER_SCHEME_LP)
|
||||
return;
|
||||
skip = 2;
|
||||
@ -390,8 +389,7 @@ static void iwl_mvm_power_config_skip_dtim(struct iwl_mvm *mvm,
|
||||
|
||||
static void iwl_mvm_power_build_cmd(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif,
|
||||
struct iwl_mac_power_cmd *cmd,
|
||||
bool host_awake)
|
||||
struct iwl_mac_power_cmd *cmd)
|
||||
{
|
||||
int dtimper, bi;
|
||||
int keep_alive;
|
||||
@ -437,9 +435,9 @@ static void iwl_mvm_power_build_cmd(struct iwl_mvm *mvm,
|
||||
cmd->lprx_rssi_threshold = POWER_LPRX_RSSI_THRESHOLD;
|
||||
}
|
||||
|
||||
iwl_mvm_power_config_skip_dtim(mvm, vif, cmd, host_awake);
|
||||
iwl_mvm_power_config_skip_dtim(mvm, vif, cmd);
|
||||
|
||||
if (!host_awake) {
|
||||
if (test_bit(IWL_MVM_STATUS_IN_D3, &mvm->status)) {
|
||||
cmd->rx_data_timeout =
|
||||
cpu_to_le32(IWL_MVM_WOWLAN_PS_RX_DATA_TIMEOUT);
|
||||
cmd->tx_data_timeout =
|
||||
@ -512,8 +510,7 @@ static int iwl_mvm_power_send_cmd(struct iwl_mvm *mvm,
|
||||
{
|
||||
struct iwl_mac_power_cmd cmd = {};
|
||||
|
||||
iwl_mvm_power_build_cmd(mvm, vif, &cmd,
|
||||
mvm->fwrt.cur_fw_img != IWL_UCODE_WOWLAN);
|
||||
iwl_mvm_power_build_cmd(mvm, vif, &cmd);
|
||||
iwl_mvm_power_log(mvm, &cmd);
|
||||
#ifdef CONFIG_IWLWIFI_DEBUGFS
|
||||
memcpy(&iwl_mvm_vif_from_mac80211(vif)->mac_pwr_cmd, &cmd, sizeof(cmd));
|
||||
@ -536,7 +533,7 @@ int iwl_mvm_power_update_device(struct iwl_mvm *mvm)
|
||||
cmd.flags |= cpu_to_le16(DEVICE_POWER_FLAGS_POWER_SAVE_ENA_MSK);
|
||||
|
||||
#ifdef CONFIG_IWLWIFI_DEBUGFS
|
||||
if ((mvm->fwrt.cur_fw_img == IWL_UCODE_WOWLAN) ?
|
||||
if (test_bit(IWL_MVM_STATUS_IN_D3, &mvm->status) ?
|
||||
mvm->disable_power_off_d3 : mvm->disable_power_off)
|
||||
cmd.flags &=
|
||||
cpu_to_le16(~DEVICE_POWER_FLAGS_POWER_SAVE_ENA_MSK);
|
||||
@ -943,7 +940,7 @@ static int iwl_mvm_power_set_ba(struct iwl_mvm *mvm,
|
||||
if (!mvmvif->bf_data.bf_enabled)
|
||||
return 0;
|
||||
|
||||
if (mvm->fwrt.cur_fw_img == IWL_UCODE_WOWLAN)
|
||||
if (test_bit(IWL_MVM_STATUS_IN_D3, &mvm->status))
|
||||
cmd.ba_escape_timer = cpu_to_le32(IWL_BA_ESCAPE_TIMER_D3);
|
||||
|
||||
mvmvif->bf_data.ba_enabled = !(!mvmvif->pm_enabled ||
|
||||
|
@ -1906,20 +1906,6 @@ iwl_mvm_scan_umac_fill_probe_p_v4(struct iwl_mvm_scan_params *params,
|
||||
iwl_scan_build_ssids(params, pp->direct_scan, bitmap_ssid);
|
||||
}
|
||||
|
||||
static void
|
||||
iwl_mvm_scan_umac_fill_ch_p_v3(struct iwl_mvm *mvm,
|
||||
struct iwl_mvm_scan_params *params,
|
||||
struct ieee80211_vif *vif,
|
||||
struct iwl_scan_channel_params_v3 *cp)
|
||||
{
|
||||
cp->flags = iwl_mvm_scan_umac_chan_flags_v2(mvm, params, vif);
|
||||
cp->count = params->n_channels;
|
||||
|
||||
iwl_mvm_umac_scan_cfg_channels(mvm, params->channels,
|
||||
params->n_channels, 0,
|
||||
cp->channel_config);
|
||||
}
|
||||
|
||||
static void
|
||||
iwl_mvm_scan_umac_fill_ch_p_v4(struct iwl_mvm *mvm,
|
||||
struct iwl_mvm_scan_params *params,
|
||||
@ -1937,37 +1923,6 @@ iwl_mvm_scan_umac_fill_ch_p_v4(struct iwl_mvm *mvm,
|
||||
vif->type);
|
||||
}
|
||||
|
||||
static int iwl_mvm_scan_umac_v11(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||
struct iwl_mvm_scan_params *params, int type,
|
||||
int uid)
|
||||
{
|
||||
struct iwl_scan_req_umac_v11 *cmd = mvm->scan_cmd;
|
||||
struct iwl_scan_req_params_v11 *scan_p = &cmd->scan_params;
|
||||
int ret;
|
||||
u16 gen_flags;
|
||||
|
||||
mvm->scan_uid_status[uid] = type;
|
||||
|
||||
cmd->ooc_priority = cpu_to_le32(iwl_mvm_scan_umac_ooc_priority(params));
|
||||
cmd->uid = cpu_to_le32(uid);
|
||||
|
||||
gen_flags = iwl_mvm_scan_umac_flags_v2(mvm, params, vif, type);
|
||||
iwl_mvm_scan_umac_fill_general_p_v10(mvm, params, vif,
|
||||
&scan_p->general_params,
|
||||
gen_flags);
|
||||
|
||||
ret = iwl_mvm_fill_scan_sched_params(params,
|
||||
scan_p->periodic_params.schedule,
|
||||
&scan_p->periodic_params.delay);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
iwl_mvm_scan_umac_fill_probe_p_v3(params, &scan_p->probe_params);
|
||||
iwl_mvm_scan_umac_fill_ch_p_v3(mvm, params, vif,
|
||||
&scan_p->channel_params);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int iwl_mvm_scan_umac_v12(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||
struct iwl_mvm_scan_params *params, int type,
|
||||
@ -2152,7 +2107,6 @@ static const struct iwl_scan_umac_handler iwl_scan_umac_handlers[] = {
|
||||
/* set the newest version first to shorten the list traverse time */
|
||||
IWL_SCAN_UMAC_HANDLER(13),
|
||||
IWL_SCAN_UMAC_HANDLER(12),
|
||||
IWL_SCAN_UMAC_HANDLER(11),
|
||||
};
|
||||
|
||||
static int iwl_mvm_build_scan_cmd(struct iwl_mvm *mvm,
|
||||
@ -2511,7 +2465,6 @@ static int iwl_scan_req_umac_get_size(u8 scan_ver)
|
||||
switch (scan_ver) {
|
||||
IWL_SCAN_REQ_UMAC_HANDLE_SIZE(13);
|
||||
IWL_SCAN_REQ_UMAC_HANDLE_SIZE(12);
|
||||
IWL_SCAN_REQ_UMAC_HANDLE_SIZE(11);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -206,7 +206,7 @@ int iwl_pcie_ctxt_info_gen3_init(struct iwl_trans *trans,
|
||||
ctxt_info_gen3->mtr_size =
|
||||
cpu_to_le16(TFD_QUEUE_CB_SIZE(cmdq_size));
|
||||
ctxt_info_gen3->mcr_size =
|
||||
cpu_to_le16(RX_QUEUE_CB_SIZE(MQ_RX_TABLE_SIZE));
|
||||
cpu_to_le16(RX_QUEUE_CB_SIZE(trans->cfg->num_rbds));
|
||||
|
||||
trans_pcie->ctxt_info_gen3 = ctxt_info_gen3;
|
||||
trans_pcie->prph_info = prph_info;
|
||||
|
@ -232,11 +232,12 @@ int iwl_pcie_ctxt_info_init(struct iwl_trans *trans,
|
||||
rb_size = IWL_CTXT_INFO_RB_SIZE_4K;
|
||||
}
|
||||
|
||||
BUILD_BUG_ON(RX_QUEUE_CB_SIZE(MQ_RX_TABLE_SIZE) > 0xF);
|
||||
control_flags = IWL_CTXT_INFO_TFD_FORMAT_LONG |
|
||||
(RX_QUEUE_CB_SIZE(MQ_RX_TABLE_SIZE) <<
|
||||
IWL_CTXT_INFO_RB_CB_SIZE_POS) |
|
||||
(rb_size << IWL_CTXT_INFO_RB_SIZE_POS);
|
||||
WARN_ON(RX_QUEUE_CB_SIZE(trans->cfg->num_rbds) > 12);
|
||||
control_flags = IWL_CTXT_INFO_TFD_FORMAT_LONG;
|
||||
control_flags |=
|
||||
u32_encode_bits(RX_QUEUE_CB_SIZE(trans->cfg->num_rbds),
|
||||
IWL_CTXT_INFO_RB_CB_SIZE);
|
||||
control_flags |= u32_encode_bits(rb_size, IWL_CTXT_INFO_RB_SIZE);
|
||||
ctxt_info->control.control_flags = cpu_to_le32(control_flags);
|
||||
|
||||
/* initialize RX default queue */
|
||||
|
@ -565,14 +565,8 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x40A4, iwl9462_2ac_cfg_quz_a0_jf_b0_soc)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x4234, iwl9560_2ac_cfg_quz_a0_jf_b0_soc)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x42A4, iwl9462_2ac_cfg_quz_a0_jf_b0_soc)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0010, iwl9260_2ac_160_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0014, iwl9260_2ac_160_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0018, iwl9260_2ac_160_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x001C, iwl9260_2ac_160_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0030, iwl9560_2ac_160_cfg)},
|
||||
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0034, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0038, iwl9560_2ac_160_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x003C, iwl9560_2ac_160_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0060, iwl9461_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0064, iwl9461_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x00A0, iwl9462_2ac_cfg_soc)},
|
||||
@ -598,21 +592,12 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
|
||||
{IWL_PCI_DEVICE(0x2526, 0x1610, iwl9270_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x2030, iwl9560_2ac_160_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x2034, iwl9560_2ac_160_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x4010, iwl9260_2ac_160_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x4018, iwl9260_2ac_160_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x401C, iwl9260_2ac_160_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x4030, iwl9560_2ac_160_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x4034, iwl9560_2ac_160_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x40A4, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x4234, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x42A4, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x6010, iwl9260_2ac_160_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x6014, iwl9260_2ac_160_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x8014, iwl9260_2ac_160_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x8010, iwl9260_2ac_160_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0xA014, iwl9260_2ac_160_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0xE010, iwl9260_2ac_160_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0xE014, iwl9260_2ac_160_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, PCI_ANY_ID, iwl9000_trans_cfg)},
|
||||
|
||||
{IWL_PCI_DEVICE(0x271B, 0x0010, iwl9160_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x271B, 0x0014, iwl9160_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x271B, 0x0210, iwl9160_2ac_cfg)},
|
||||
@ -910,7 +895,6 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0074, iwl_ax201_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0078, iwl_ax201_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x007C, iwl_ax201_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0090, iwl22000_2ac_cfg_hr_cdb)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0244, iwl_ax101_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0310, iwl_ax201_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0A10, iwl_ax201_cfg_qu_hr)},
|
||||
@ -987,28 +971,74 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, iwl_hw_card_ids);
|
||||
|
||||
#define IWL_DEV_INFO(_device, _subdevice, _cfg, _name) \
|
||||
{ .device = (_device), .subdevice = (_subdevice), .cfg = &(_cfg), \
|
||||
.name = _name }
|
||||
|
||||
static const struct iwl_dev_info iwl_dev_info_table[] = {
|
||||
#if IS_ENABLED(CONFIG_IWLMVM)
|
||||
IWL_DEV_INFO(0x2526, 0x0010, iwl9260_2ac_160_cfg, iwl9260_160_name),
|
||||
IWL_DEV_INFO(0x2526, 0x0014, iwl9260_2ac_160_cfg, iwl9260_160_name),
|
||||
IWL_DEV_INFO(0x2526, 0x0018, iwl9260_2ac_160_cfg, iwl9260_160_name),
|
||||
IWL_DEV_INFO(0x2526, 0x001C, iwl9260_2ac_160_cfg, iwl9260_160_name),
|
||||
IWL_DEV_INFO(0x2526, 0x6010, iwl9260_2ac_160_cfg, iwl9260_160_name),
|
||||
IWL_DEV_INFO(0x2526, 0x6014, iwl9260_2ac_160_cfg, iwl9260_160_name),
|
||||
IWL_DEV_INFO(0x2526, 0x8014, iwl9260_2ac_160_cfg, iwl9260_160_name),
|
||||
IWL_DEV_INFO(0x2526, 0x8010, iwl9260_2ac_160_cfg, iwl9260_160_name),
|
||||
IWL_DEV_INFO(0x2526, 0xA014, iwl9260_2ac_160_cfg, iwl9260_160_name),
|
||||
IWL_DEV_INFO(0x2526, 0xE010, iwl9260_2ac_160_cfg, iwl9260_160_name),
|
||||
IWL_DEV_INFO(0x2526, 0xE014, iwl9260_2ac_160_cfg, iwl9260_160_name),
|
||||
|
||||
IWL_DEV_INFO(0x2526, 0x0030, iwl9560_2ac_160_cfg, iwl9560_160_name),
|
||||
IWL_DEV_INFO(0x2526, 0x0038, iwl9560_2ac_160_cfg, iwl9560_160_name),
|
||||
IWL_DEV_INFO(0x2526, 0x003C, iwl9560_2ac_160_cfg, iwl9560_160_name),
|
||||
IWL_DEV_INFO(0x2526, 0x4030, iwl9560_2ac_160_cfg, iwl9560_160_name),
|
||||
#endif /* CONFIG_IWLMVM */
|
||||
};
|
||||
|
||||
/* PCI registers */
|
||||
#define PCI_CFG_RETRY_TIMEOUT 0x041
|
||||
|
||||
static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
{
|
||||
const struct iwl_cfg *cfg = (struct iwl_cfg *)(ent->driver_data);
|
||||
const struct iwl_cfg_trans_params *trans =
|
||||
(struct iwl_cfg_trans_params *)(ent->driver_data);
|
||||
const struct iwl_cfg *cfg_7265d __maybe_unused = NULL;
|
||||
struct iwl_trans *iwl_trans;
|
||||
struct iwl_trans_pcie *trans_pcie;
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
int i, ret;
|
||||
/*
|
||||
* This is needed for backwards compatibility with the old
|
||||
* tables, so we don't need to change all the config structs
|
||||
* at the same time. The cfg is used to compare with the old
|
||||
* full cfg structs.
|
||||
*/
|
||||
const struct iwl_cfg *cfg = (struct iwl_cfg *)(ent->driver_data);
|
||||
|
||||
iwl_trans = iwl_trans_pcie_alloc(pdev, ent, &cfg->trans);
|
||||
/* make sure trans is the first element in iwl_cfg */
|
||||
BUILD_BUG_ON(offsetof(struct iwl_cfg, trans));
|
||||
|
||||
iwl_trans = iwl_trans_pcie_alloc(pdev, ent, trans);
|
||||
if (IS_ERR(iwl_trans))
|
||||
return PTR_ERR(iwl_trans);
|
||||
|
||||
/* the trans_cfg should never change, so set it now */
|
||||
iwl_trans->trans_cfg = &cfg->trans;
|
||||
trans_pcie = IWL_TRANS_GET_PCIE_TRANS(iwl_trans);
|
||||
|
||||
if (WARN_ONCE(!iwl_trans->trans_cfg->csr,
|
||||
"CSR addresses aren't configured\n")) {
|
||||
ret = -EINVAL;
|
||||
goto out_free_trans;
|
||||
/* the trans_cfg should never change, so set it now */
|
||||
iwl_trans->trans_cfg = trans;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(iwl_dev_info_table); i++) {
|
||||
const struct iwl_dev_info *dev_info = &iwl_dev_info_table[i];
|
||||
|
||||
if ((dev_info->device == IWL_CFG_ANY ||
|
||||
dev_info->device == pdev->device) &&
|
||||
(dev_info->subdevice == IWL_CFG_ANY ||
|
||||
dev_info->subdevice == pdev->subsystem_device)) {
|
||||
iwl_trans->cfg = dev_info->cfg;
|
||||
iwl_trans->name = dev_info->name;
|
||||
goto found;
|
||||
}
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_IWLMVM)
|
||||
@ -1027,22 +1057,22 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
cfg_7265d = &iwl7265d_n_cfg;
|
||||
if (cfg_7265d &&
|
||||
(iwl_trans->hw_rev & CSR_HW_REV_TYPE_MSK) == CSR_HW_REV_TYPE_7265D)
|
||||
cfg = cfg_7265d;
|
||||
iwl_trans->cfg = cfg_7265d;
|
||||
|
||||
iwl_trans->hw_rf_id = iwl_read32(iwl_trans, CSR_HW_RF_ID);
|
||||
|
||||
if (cfg == &iwlax210_2ax_cfg_so_hr_a0) {
|
||||
if (iwl_trans->hw_rev == CSR_HW_REV_TYPE_TY) {
|
||||
cfg = &iwlax210_2ax_cfg_ty_gf_a0;
|
||||
iwl_trans->cfg = &iwlax210_2ax_cfg_ty_gf_a0;
|
||||
} else if (CSR_HW_RF_ID_TYPE_CHIP_ID(iwl_trans->hw_rf_id) ==
|
||||
CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_JF)) {
|
||||
cfg = &iwlax210_2ax_cfg_so_jf_a0;
|
||||
iwl_trans->cfg = &iwlax210_2ax_cfg_so_jf_a0;
|
||||
} else if (CSR_HW_RF_ID_TYPE_CHIP_ID(iwl_trans->hw_rf_id) ==
|
||||
CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_GF)) {
|
||||
cfg = &iwlax211_2ax_cfg_so_gf_a0;
|
||||
iwl_trans->cfg = &iwlax211_2ax_cfg_so_gf_a0;
|
||||
} else if (CSR_HW_RF_ID_TYPE_CHIP_ID(iwl_trans->hw_rf_id) ==
|
||||
CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_GF4)) {
|
||||
cfg = &iwlax411_2ax_cfg_so_gf4_a0;
|
||||
iwl_trans->cfg = &iwlax411_2ax_cfg_so_gf4_a0;
|
||||
}
|
||||
} else if (cfg == &iwl_ax101_cfg_qu_hr) {
|
||||
if ((CSR_HW_RF_ID_TYPE_CHIP_ID(iwl_trans->hw_rf_id) ==
|
||||
@ -1050,13 +1080,17 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
iwl_trans->hw_rev == CSR_HW_REV_TYPE_QNJ_B0) ||
|
||||
(CSR_HW_RF_ID_TYPE_CHIP_ID(iwl_trans->hw_rf_id) ==
|
||||
CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_HR1))) {
|
||||
cfg = &iwl22000_2ax_cfg_qnj_hr_b0;
|
||||
iwl_trans->cfg = &iwl22000_2ax_cfg_qnj_hr_b0;
|
||||
} else if (CSR_HW_RF_ID_TYPE_CHIP_ID(iwl_trans->hw_rf_id) ==
|
||||
CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_HR) &&
|
||||
iwl_trans->hw_rev == CSR_HW_REV_TYPE_QUZ) {
|
||||
iwl_trans->cfg = &iwl_ax101_cfg_quz_hr;
|
||||
} else if (CSR_HW_RF_ID_TYPE_CHIP_ID(iwl_trans->hw_rf_id) ==
|
||||
CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_HR)) {
|
||||
cfg = &iwl_ax101_cfg_qu_hr;
|
||||
iwl_trans->cfg = &iwl_ax101_cfg_qu_hr;
|
||||
} else if (CSR_HW_RF_ID_TYPE_CHIP_ID(iwl_trans->hw_rf_id) ==
|
||||
CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_JF)) {
|
||||
cfg = &iwl22000_2ax_cfg_jf;
|
||||
iwl_trans->cfg = &iwl22000_2ax_cfg_jf;
|
||||
} else if (CSR_HW_RF_ID_TYPE_CHIP_ID(iwl_trans->hw_rf_id) ==
|
||||
CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_HRCDB)) {
|
||||
IWL_ERR(iwl_trans, "RF ID HRCDB is not supported\n");
|
||||
@ -1073,19 +1107,11 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
|
||||
hw_status = iwl_read_prph(iwl_trans, UMAG_GEN_HW_STATUS);
|
||||
if (CSR_HW_RF_STEP(iwl_trans->hw_rf_id) == SILICON_B_STEP)
|
||||
/*
|
||||
* b step fw is the same for physical card and fpga
|
||||
*/
|
||||
cfg = &iwl22000_2ax_cfg_qnj_hr_b0;
|
||||
iwl_trans->cfg = &iwl22000_2ax_cfg_qnj_hr_b0;
|
||||
else if ((hw_status & UMAG_GEN_HW_IS_FPGA) &&
|
||||
CSR_HW_RF_STEP(iwl_trans->hw_rf_id) == SILICON_A_STEP) {
|
||||
cfg = &iwl22000_2ax_cfg_qnj_hr_a0_f0;
|
||||
} else {
|
||||
/*
|
||||
* a step no FPGA
|
||||
*/
|
||||
cfg = &iwl22000_2ac_cfg_hr;
|
||||
}
|
||||
CSR_HW_RF_STEP(iwl_trans->hw_rf_id) ==
|
||||
SILICON_A_STEP)
|
||||
iwl_trans->cfg = &iwl22000_2ax_cfg_qnj_hr_a0_f0;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1096,17 +1122,21 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
*/
|
||||
if (iwl_trans->hw_rev == CSR_HW_REV_TYPE_QU_C0) {
|
||||
if (cfg == &iwl_ax101_cfg_qu_hr)
|
||||
cfg = &iwl_ax101_cfg_qu_c0_hr_b0;
|
||||
iwl_trans->cfg = &iwl_ax101_cfg_qu_c0_hr_b0;
|
||||
else if (cfg == &iwl_ax201_cfg_qu_hr)
|
||||
cfg = &iwl_ax201_cfg_qu_c0_hr_b0;
|
||||
iwl_trans->cfg = &iwl_ax201_cfg_qu_c0_hr_b0;
|
||||
else if (cfg == &iwl9461_2ac_cfg_qu_b0_jf_b0)
|
||||
cfg = &iwl9461_2ac_cfg_qu_c0_jf_b0;
|
||||
iwl_trans->cfg = &iwl9461_2ac_cfg_qu_c0_jf_b0;
|
||||
else if (cfg == &iwl9462_2ac_cfg_qu_b0_jf_b0)
|
||||
cfg = &iwl9462_2ac_cfg_qu_c0_jf_b0;
|
||||
iwl_trans->cfg = &iwl9462_2ac_cfg_qu_c0_jf_b0;
|
||||
else if (cfg == &iwl9560_2ac_cfg_qu_b0_jf_b0)
|
||||
cfg = &iwl9560_2ac_cfg_qu_c0_jf_b0;
|
||||
iwl_trans->cfg = &iwl9560_2ac_cfg_qu_c0_jf_b0;
|
||||
else if (cfg == &iwl9560_2ac_160_cfg_qu_b0_jf_b0)
|
||||
cfg = &iwl9560_2ac_160_cfg_qu_c0_jf_b0;
|
||||
iwl_trans->cfg = &iwl9560_2ac_160_cfg_qu_c0_jf_b0;
|
||||
else if (cfg == &killer1650s_2ax_cfg_qu_b0_hr_b0)
|
||||
iwl_trans->cfg = &killer1650s_2ax_cfg_qu_c0_hr_b0;
|
||||
else if (cfg == &killer1650i_2ax_cfg_qu_b0_hr_b0)
|
||||
iwl_trans->cfg = &killer1650i_2ax_cfg_qu_c0_hr_b0;
|
||||
}
|
||||
|
||||
/* same thing for QuZ... */
|
||||
@ -1126,8 +1156,27 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
}
|
||||
|
||||
#endif
|
||||
/* now set the real cfg we decided to use */
|
||||
iwl_trans->cfg = cfg;
|
||||
/*
|
||||
* If we didn't set the cfg yet, assume the trans is actually
|
||||
* a full cfg from the old tables.
|
||||
*/
|
||||
if (!iwl_trans->cfg)
|
||||
iwl_trans->cfg = cfg;
|
||||
|
||||
found:
|
||||
/* if we don't have a name yet, copy name from the old cfg */
|
||||
if (!iwl_trans->name)
|
||||
iwl_trans->name = iwl_trans->cfg->name;
|
||||
|
||||
if (iwl_trans->trans_cfg->mq_rx_supported) {
|
||||
if (WARN_ON(!iwl_trans->cfg->num_rbds)) {
|
||||
ret = -EINVAL;
|
||||
goto out_free_trans;
|
||||
}
|
||||
trans_pcie->num_rx_bufs = iwl_trans->cfg->num_rbds;
|
||||
} else {
|
||||
trans_pcie->num_rx_bufs = RX_QUEUE_SIZE;
|
||||
}
|
||||
|
||||
if (iwl_trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_8000 &&
|
||||
iwl_trans_grab_nic_access(iwl_trans, &flags)) {
|
||||
|
@ -106,6 +106,8 @@ struct iwl_host_cmd;
|
||||
* @page: driver's pointer to the rxb page
|
||||
* @invalid: rxb is in driver ownership - not owned by HW
|
||||
* @vid: index of this rxb in the global table
|
||||
* @offset: indicates which offset of the page (in bytes)
|
||||
* this buffer uses (if multiple RBs fit into one page)
|
||||
*/
|
||||
struct iwl_rx_mem_buffer {
|
||||
dma_addr_t page_dma;
|
||||
@ -113,6 +115,7 @@ struct iwl_rx_mem_buffer {
|
||||
u16 vid;
|
||||
bool invalid;
|
||||
struct list_head list;
|
||||
u32 offset;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -491,6 +494,7 @@ struct cont_rec {
|
||||
* @sw_csum_tx: if true, then the transport will compute the csum of the TXed
|
||||
* frame.
|
||||
* @rx_page_order: page order for receive buffer size
|
||||
* @rx_buf_bytes: RX buffer (RB) size in bytes
|
||||
* @reg_lock: protect hw register access
|
||||
* @mutex: to protect stop_device / start_fw / start_hw
|
||||
* @cmd_in_flight: true when we have a host command in flight
|
||||
@ -510,11 +514,16 @@ struct cont_rec {
|
||||
* @in_rescan: true if we have triggered a device rescan
|
||||
* @base_rb_stts: base virtual address of receive buffer status for all queues
|
||||
* @base_rb_stts_dma: base physical address of receive buffer status
|
||||
* @supported_dma_mask: DMA mask to validate the actual address against,
|
||||
* will be DMA_BIT_MASK(11) or DMA_BIT_MASK(12) depending on the device
|
||||
* @alloc_page_lock: spinlock for the page allocator
|
||||
* @alloc_page: allocated page to still use parts of
|
||||
* @alloc_page_used: how much of the allocated page was already used (bytes)
|
||||
*/
|
||||
struct iwl_trans_pcie {
|
||||
struct iwl_rxq *rxq;
|
||||
struct iwl_rx_mem_buffer rx_pool[RX_POOL_SIZE];
|
||||
struct iwl_rx_mem_buffer *global_table[RX_POOL_SIZE];
|
||||
struct iwl_rx_mem_buffer *rx_pool;
|
||||
struct iwl_rx_mem_buffer **global_table;
|
||||
struct iwl_rb_allocator rba;
|
||||
union {
|
||||
struct iwl_context_info *ctxt_info;
|
||||
@ -573,6 +582,7 @@ struct iwl_trans_pcie {
|
||||
u8 no_reclaim_cmds[MAX_NO_RECLAIM_CMDS];
|
||||
u8 max_tbs;
|
||||
u16 tfd_size;
|
||||
u16 num_rx_bufs;
|
||||
|
||||
enum iwl_amsdu_size rx_buf_size;
|
||||
bool bc_table_dword;
|
||||
@ -580,6 +590,13 @@ struct iwl_trans_pcie {
|
||||
bool sw_csum_tx;
|
||||
bool pcie_dbg_dumped_once;
|
||||
u32 rx_page_order;
|
||||
u32 rx_buf_bytes;
|
||||
u32 supported_dma_mask;
|
||||
|
||||
/* allocator lock for the two values below */
|
||||
spinlock_t alloc_page_lock;
|
||||
struct page *alloc_page;
|
||||
u32 alloc_page_used;
|
||||
|
||||
/*protect hw register */
|
||||
spinlock_t reg_lock;
|
||||
|
@ -240,7 +240,7 @@ static void iwl_pcie_rxq_inc_wr_ptr(struct iwl_trans *trans,
|
||||
IWL_DEBUG_INFO(trans, "Rx queue requesting wakeup, GP1 = 0x%x\n",
|
||||
reg);
|
||||
iwl_set_bit(trans, CSR_GP_CNTRL,
|
||||
BIT(trans->trans_cfg->csr->flag_mac_access_req));
|
||||
CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
|
||||
rxq->need_update = true;
|
||||
return;
|
||||
}
|
||||
@ -298,6 +298,7 @@ static void iwl_pcie_restock_bd(struct iwl_trans *trans,
|
||||
static void iwl_pcie_rxmq_restock(struct iwl_trans *trans,
|
||||
struct iwl_rxq *rxq)
|
||||
{
|
||||
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
|
||||
struct iwl_rx_mem_buffer *rxb;
|
||||
|
||||
/*
|
||||
@ -318,8 +319,8 @@ static void iwl_pcie_rxmq_restock(struct iwl_trans *trans,
|
||||
list);
|
||||
list_del(&rxb->list);
|
||||
rxb->invalid = false;
|
||||
/* 12 first bits are expected to be empty */
|
||||
WARN_ON(rxb->page_dma & DMA_BIT_MASK(12));
|
||||
/* some low bits are expected to be unset (depending on hw) */
|
||||
WARN_ON(rxb->page_dma & trans_pcie->supported_dma_mask);
|
||||
/* Point to Rx buffer via next RBD in circular buffer */
|
||||
iwl_pcie_restock_bd(trans, rxq, rxb);
|
||||
rxq->write = (rxq->write + 1) & (rxq->queue_size - 1);
|
||||
@ -412,15 +413,34 @@ void iwl_pcie_rxq_restock(struct iwl_trans *trans, struct iwl_rxq *rxq)
|
||||
*
|
||||
*/
|
||||
static struct page *iwl_pcie_rx_alloc_page(struct iwl_trans *trans,
|
||||
gfp_t priority)
|
||||
u32 *offset, gfp_t priority)
|
||||
{
|
||||
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
|
||||
unsigned int rbsize = iwl_trans_get_rb_size(trans_pcie->rx_buf_size);
|
||||
unsigned int allocsize = PAGE_SIZE << trans_pcie->rx_page_order;
|
||||
struct page *page;
|
||||
gfp_t gfp_mask = priority;
|
||||
|
||||
if (trans_pcie->rx_page_order > 0)
|
||||
gfp_mask |= __GFP_COMP;
|
||||
|
||||
if (trans_pcie->alloc_page) {
|
||||
spin_lock_bh(&trans_pcie->alloc_page_lock);
|
||||
/* recheck */
|
||||
if (trans_pcie->alloc_page) {
|
||||
*offset = trans_pcie->alloc_page_used;
|
||||
page = trans_pcie->alloc_page;
|
||||
trans_pcie->alloc_page_used += rbsize;
|
||||
if (trans_pcie->alloc_page_used >= allocsize)
|
||||
trans_pcie->alloc_page = NULL;
|
||||
else
|
||||
get_page(page);
|
||||
spin_unlock_bh(&trans_pcie->alloc_page_lock);
|
||||
return page;
|
||||
}
|
||||
spin_unlock_bh(&trans_pcie->alloc_page_lock);
|
||||
}
|
||||
|
||||
/* Alloc a new receive buffer */
|
||||
page = alloc_pages(gfp_mask, trans_pcie->rx_page_order);
|
||||
if (!page) {
|
||||
@ -436,6 +456,18 @@ static struct page *iwl_pcie_rx_alloc_page(struct iwl_trans *trans,
|
||||
"Failed to alloc_pages\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (2 * rbsize <= allocsize) {
|
||||
spin_lock_bh(&trans_pcie->alloc_page_lock);
|
||||
if (!trans_pcie->alloc_page) {
|
||||
get_page(page);
|
||||
trans_pcie->alloc_page = page;
|
||||
trans_pcie->alloc_page_used = rbsize;
|
||||
}
|
||||
spin_unlock_bh(&trans_pcie->alloc_page_lock);
|
||||
}
|
||||
|
||||
*offset = 0;
|
||||
return page;
|
||||
}
|
||||
|
||||
@ -456,6 +488,8 @@ void iwl_pcie_rxq_alloc_rbs(struct iwl_trans *trans, gfp_t priority,
|
||||
struct page *page;
|
||||
|
||||
while (1) {
|
||||
unsigned int offset;
|
||||
|
||||
spin_lock(&rxq->lock);
|
||||
if (list_empty(&rxq->rx_used)) {
|
||||
spin_unlock(&rxq->lock);
|
||||
@ -463,8 +497,7 @@ void iwl_pcie_rxq_alloc_rbs(struct iwl_trans *trans, gfp_t priority,
|
||||
}
|
||||
spin_unlock(&rxq->lock);
|
||||
|
||||
/* Alloc a new receive buffer */
|
||||
page = iwl_pcie_rx_alloc_page(trans, priority);
|
||||
page = iwl_pcie_rx_alloc_page(trans, &offset, priority);
|
||||
if (!page)
|
||||
return;
|
||||
|
||||
@ -482,10 +515,11 @@ void iwl_pcie_rxq_alloc_rbs(struct iwl_trans *trans, gfp_t priority,
|
||||
|
||||
BUG_ON(rxb->page);
|
||||
rxb->page = page;
|
||||
rxb->offset = offset;
|
||||
/* Get physical address of the RB */
|
||||
rxb->page_dma =
|
||||
dma_map_page(trans->dev, page, 0,
|
||||
PAGE_SIZE << trans_pcie->rx_page_order,
|
||||
dma_map_page(trans->dev, page, rxb->offset,
|
||||
trans_pcie->rx_buf_bytes,
|
||||
DMA_FROM_DEVICE);
|
||||
if (dma_mapping_error(trans->dev, rxb->page_dma)) {
|
||||
rxb->page = NULL;
|
||||
@ -510,12 +544,11 @@ void iwl_pcie_free_rbs_pool(struct iwl_trans *trans)
|
||||
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < RX_POOL_SIZE; i++) {
|
||||
for (i = 0; i < RX_POOL_SIZE(trans_pcie->num_rx_bufs); i++) {
|
||||
if (!trans_pcie->rx_pool[i].page)
|
||||
continue;
|
||||
dma_unmap_page(trans->dev, trans_pcie->rx_pool[i].page_dma,
|
||||
PAGE_SIZE << trans_pcie->rx_page_order,
|
||||
DMA_FROM_DEVICE);
|
||||
trans_pcie->rx_buf_bytes, DMA_FROM_DEVICE);
|
||||
__free_pages(trans_pcie->rx_pool[i].page,
|
||||
trans_pcie->rx_page_order);
|
||||
trans_pcie->rx_pool[i].page = NULL;
|
||||
@ -568,15 +601,17 @@ static void iwl_pcie_rx_allocator(struct iwl_trans *trans)
|
||||
BUG_ON(rxb->page);
|
||||
|
||||
/* Alloc a new receive buffer */
|
||||
page = iwl_pcie_rx_alloc_page(trans, gfp_mask);
|
||||
page = iwl_pcie_rx_alloc_page(trans, &rxb->offset,
|
||||
gfp_mask);
|
||||
if (!page)
|
||||
continue;
|
||||
rxb->page = page;
|
||||
|
||||
/* Get physical address of the RB */
|
||||
rxb->page_dma = dma_map_page(trans->dev, page, 0,
|
||||
PAGE_SIZE << trans_pcie->rx_page_order,
|
||||
DMA_FROM_DEVICE);
|
||||
rxb->page_dma = dma_map_page(trans->dev, page,
|
||||
rxb->offset,
|
||||
trans_pcie->rx_buf_bytes,
|
||||
DMA_FROM_DEVICE);
|
||||
if (dma_mapping_error(trans->dev, rxb->page_dma)) {
|
||||
rxb->page = NULL;
|
||||
__free_pages(page, trans_pcie->rx_page_order);
|
||||
@ -738,7 +773,7 @@ static int iwl_pcie_alloc_rxq_dma(struct iwl_trans *trans,
|
||||
|
||||
spin_lock_init(&rxq->lock);
|
||||
if (trans->trans_cfg->mq_rx_supported)
|
||||
rxq->queue_size = MQ_RX_TABLE_SIZE;
|
||||
rxq->queue_size = trans->cfg->num_rbds;
|
||||
else
|
||||
rxq->queue_size = RX_QUEUE_SIZE;
|
||||
|
||||
@ -807,8 +842,18 @@ static int iwl_pcie_rx_alloc(struct iwl_trans *trans)
|
||||
|
||||
trans_pcie->rxq = kcalloc(trans->num_rx_queues, sizeof(struct iwl_rxq),
|
||||
GFP_KERNEL);
|
||||
if (!trans_pcie->rxq)
|
||||
return -ENOMEM;
|
||||
trans_pcie->rx_pool = kcalloc(RX_POOL_SIZE(trans_pcie->num_rx_bufs),
|
||||
sizeof(trans_pcie->rx_pool[0]),
|
||||
GFP_KERNEL);
|
||||
trans_pcie->global_table =
|
||||
kcalloc(RX_POOL_SIZE(trans_pcie->num_rx_bufs),
|
||||
sizeof(trans_pcie->global_table[0]),
|
||||
GFP_KERNEL);
|
||||
if (!trans_pcie->rxq || !trans_pcie->rx_pool ||
|
||||
!trans_pcie->global_table) {
|
||||
ret = -ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
|
||||
spin_lock_init(&rba->lock);
|
||||
|
||||
@ -845,6 +890,8 @@ static int iwl_pcie_rx_alloc(struct iwl_trans *trans)
|
||||
trans_pcie->base_rb_stts = NULL;
|
||||
trans_pcie->base_rb_stts_dma = 0;
|
||||
}
|
||||
kfree(trans_pcie->rx_pool);
|
||||
kfree(trans_pcie->global_table);
|
||||
kfree(trans_pcie->rxq);
|
||||
|
||||
return ret;
|
||||
@ -1081,12 +1128,11 @@ static int _iwl_pcie_rx_init(struct iwl_trans *trans)
|
||||
|
||||
/* move the pool to the default queue and allocator ownerships */
|
||||
queue_size = trans->trans_cfg->mq_rx_supported ?
|
||||
MQ_RX_NUM_RBDS : RX_QUEUE_SIZE;
|
||||
trans_pcie->num_rx_bufs - 1 : RX_QUEUE_SIZE;
|
||||
allocator_pool_size = trans->num_rx_queues *
|
||||
(RX_CLAIM_REQ_ALLOC - RX_POST_REQ_ALLOC);
|
||||
num_alloc = queue_size + allocator_pool_size;
|
||||
BUILD_BUG_ON(ARRAY_SIZE(trans_pcie->global_table) !=
|
||||
ARRAY_SIZE(trans_pcie->rx_pool));
|
||||
|
||||
for (i = 0; i < num_alloc; i++) {
|
||||
struct iwl_rx_mem_buffer *rxb = &trans_pcie->rx_pool[i];
|
||||
|
||||
@ -1177,7 +1223,12 @@ void iwl_pcie_rx_free(struct iwl_trans *trans)
|
||||
if (rxq->napi.poll)
|
||||
netif_napi_del(&rxq->napi);
|
||||
}
|
||||
kfree(trans_pcie->rx_pool);
|
||||
kfree(trans_pcie->global_table);
|
||||
kfree(trans_pcie->rxq);
|
||||
|
||||
if (trans_pcie->alloc_page)
|
||||
__free_pages(trans_pcie->alloc_page, trans_pcie->rx_page_order);
|
||||
}
|
||||
|
||||
static void iwl_pcie_rx_move_to_allocator(struct iwl_rxq *rxq,
|
||||
@ -1235,7 +1286,7 @@ static void iwl_pcie_rx_handle_rb(struct iwl_trans *trans,
|
||||
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
|
||||
struct iwl_txq *txq = trans_pcie->txq[trans_pcie->cmd_queue];
|
||||
bool page_stolen = false;
|
||||
int max_len = PAGE_SIZE << trans_pcie->rx_page_order;
|
||||
int max_len = trans_pcie->rx_buf_bytes;
|
||||
u32 offset = 0;
|
||||
|
||||
if (WARN_ON(!rxb))
|
||||
@ -1249,7 +1300,7 @@ static void iwl_pcie_rx_handle_rb(struct iwl_trans *trans,
|
||||
bool reclaim;
|
||||
int index, cmd_index, len;
|
||||
struct iwl_rx_cmd_buffer rxcb = {
|
||||
._offset = offset,
|
||||
._offset = rxb->offset + offset,
|
||||
._rx_page_order = trans_pcie->rx_page_order,
|
||||
._page = rxb->page,
|
||||
._page_stolen = false,
|
||||
@ -1355,8 +1406,8 @@ static void iwl_pcie_rx_handle_rb(struct iwl_trans *trans,
|
||||
* rx_free list for reuse later. */
|
||||
if (rxb->page != NULL) {
|
||||
rxb->page_dma =
|
||||
dma_map_page(trans->dev, rxb->page, 0,
|
||||
PAGE_SIZE << trans_pcie->rx_page_order,
|
||||
dma_map_page(trans->dev, rxb->page, rxb->offset,
|
||||
trans_pcie->rx_buf_bytes,
|
||||
DMA_FROM_DEVICE);
|
||||
if (dma_mapping_error(trans->dev, rxb->page_dma)) {
|
||||
/*
|
||||
@ -1390,13 +1441,12 @@ static struct iwl_rx_mem_buffer *iwl_pcie_get_rxb(struct iwl_trans *trans,
|
||||
return rxb;
|
||||
}
|
||||
|
||||
/* used_bd is a 32/16 bit but only 12 are used to retrieve the vid */
|
||||
if (trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_AX210)
|
||||
vid = le16_to_cpu(rxq->cd[i].rbid) & 0x0FFF;
|
||||
vid = le16_to_cpu(rxq->cd[i].rbid);
|
||||
else
|
||||
vid = le32_to_cpu(rxq->bd_32[i]) & 0x0FFF;
|
||||
vid = le32_to_cpu(rxq->bd_32[i]) & 0x0FFF; /* 12-bit VID */
|
||||
|
||||
if (!vid || vid > ARRAY_SIZE(trans_pcie->global_table))
|
||||
if (!vid || vid > RX_POOL_SIZE(trans_pcie->num_rx_bufs))
|
||||
goto out_err;
|
||||
|
||||
rxb = trans_pcie->global_table[vid - 1];
|
||||
|
@ -132,8 +132,7 @@ static void iwl_pcie_gen2_apm_stop(struct iwl_trans *trans, bool op_mode_leave)
|
||||
* Clear "initialization complete" bit to move adapter from
|
||||
* D0A* (powered-up Active) --> D0U* (Uninitialized) state.
|
||||
*/
|
||||
iwl_clear_bit(trans, CSR_GP_CNTRL,
|
||||
BIT(trans->trans_cfg->csr->flag_init_done));
|
||||
iwl_clear_bit(trans, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE);
|
||||
}
|
||||
|
||||
void _iwl_trans_pcie_gen2_stop_device(struct iwl_trans *trans)
|
||||
@ -175,7 +174,7 @@ void _iwl_trans_pcie_gen2_stop_device(struct iwl_trans *trans)
|
||||
|
||||
/* Make sure (redundant) we've released our request to stay awake */
|
||||
iwl_clear_bit(trans, CSR_GP_CNTRL,
|
||||
BIT(trans->trans_cfg->csr->flag_mac_access_req));
|
||||
CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
|
||||
|
||||
/* Stop the device, and put it in low power state */
|
||||
iwl_pcie_gen2_apm_stop(trans, false);
|
||||
|
@ -184,8 +184,7 @@ void iwl_trans_pcie_dump_regs(struct iwl_trans *trans)
|
||||
static void iwl_trans_pcie_sw_reset(struct iwl_trans *trans)
|
||||
{
|
||||
/* Reset entire device - do controller reset (results in SHRD_HW_RST) */
|
||||
iwl_set_bit(trans, trans->trans_cfg->csr->addr_sw_reset,
|
||||
BIT(trans->trans_cfg->csr->flag_sw_reset));
|
||||
iwl_set_bit(trans, CSR_RESET, CSR_RESET_REG_FLAG_SW_RESET);
|
||||
usleep_range(5000, 6000);
|
||||
}
|
||||
|
||||
@ -483,8 +482,7 @@ static void iwl_pcie_apm_lp_xtal_enable(struct iwl_trans *trans)
|
||||
* Clear "initialization complete" bit to move adapter from
|
||||
* D0A* (powered-up Active) --> D0U* (Uninitialized) state.
|
||||
*/
|
||||
iwl_clear_bit(trans, CSR_GP_CNTRL,
|
||||
BIT(trans->trans_cfg->csr->flag_init_done));
|
||||
iwl_clear_bit(trans, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE);
|
||||
|
||||
/* Activates XTAL resources monitor */
|
||||
__iwl_trans_pcie_set_bit(trans, CSR_MONITOR_CFG_REG,
|
||||
@ -506,12 +504,11 @@ void iwl_pcie_apm_stop_master(struct iwl_trans *trans)
|
||||
int ret;
|
||||
|
||||
/* stop device's busmaster DMA activity */
|
||||
iwl_set_bit(trans, trans->trans_cfg->csr->addr_sw_reset,
|
||||
BIT(trans->trans_cfg->csr->flag_stop_master));
|
||||
iwl_set_bit(trans, CSR_RESET, CSR_RESET_REG_FLAG_STOP_MASTER);
|
||||
|
||||
ret = iwl_poll_bit(trans, trans->trans_cfg->csr->addr_sw_reset,
|
||||
BIT(trans->trans_cfg->csr->flag_master_dis),
|
||||
BIT(trans->trans_cfg->csr->flag_master_dis), 100);
|
||||
ret = iwl_poll_bit(trans, CSR_RESET,
|
||||
CSR_RESET_REG_FLAG_MASTER_DISABLED,
|
||||
CSR_RESET_REG_FLAG_MASTER_DISABLED, 100);
|
||||
if (ret < 0)
|
||||
IWL_WARN(trans, "Master Disable Timed Out, 100 usec\n");
|
||||
|
||||
@ -560,8 +557,7 @@ static void iwl_pcie_apm_stop(struct iwl_trans *trans, bool op_mode_leave)
|
||||
* Clear "initialization complete" bit to move adapter from
|
||||
* D0A* (powered-up Active) --> D0U* (Uninitialized) state.
|
||||
*/
|
||||
iwl_clear_bit(trans, CSR_GP_CNTRL,
|
||||
BIT(trans->trans_cfg->csr->flag_init_done));
|
||||
iwl_clear_bit(trans, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE);
|
||||
}
|
||||
|
||||
static int iwl_pcie_nic_init(struct iwl_trans *trans)
|
||||
@ -1266,7 +1262,7 @@ static void _iwl_trans_pcie_stop_device(struct iwl_trans *trans)
|
||||
|
||||
/* Make sure (redundant) we've released our request to stay awake */
|
||||
iwl_clear_bit(trans, CSR_GP_CNTRL,
|
||||
BIT(trans->trans_cfg->csr->flag_mac_access_req));
|
||||
CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
|
||||
|
||||
/* Stop the device, and put it in low power state */
|
||||
iwl_pcie_apm_stop(trans, false);
|
||||
@ -1490,9 +1486,8 @@ void iwl_pcie_d3_complete_suspend(struct iwl_trans *trans,
|
||||
iwl_pcie_synchronize_irqs(trans);
|
||||
|
||||
iwl_clear_bit(trans, CSR_GP_CNTRL,
|
||||
BIT(trans->trans_cfg->csr->flag_mac_access_req));
|
||||
iwl_clear_bit(trans, CSR_GP_CNTRL,
|
||||
BIT(trans->trans_cfg->csr->flag_init_done));
|
||||
CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
|
||||
iwl_clear_bit(trans, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE);
|
||||
|
||||
if (reset) {
|
||||
/*
|
||||
@ -1557,7 +1552,7 @@ static int iwl_trans_pcie_d3_resume(struct iwl_trans *trans,
|
||||
}
|
||||
|
||||
iwl_set_bit(trans, CSR_GP_CNTRL,
|
||||
BIT(trans->trans_cfg->csr->flag_mac_access_req));
|
||||
CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
|
||||
|
||||
ret = iwl_finish_nic_init(trans, trans->trans_cfg);
|
||||
if (ret)
|
||||
@ -1579,7 +1574,7 @@ static int iwl_trans_pcie_d3_resume(struct iwl_trans *trans,
|
||||
|
||||
if (!reset) {
|
||||
iwl_clear_bit(trans, CSR_GP_CNTRL,
|
||||
BIT(trans->trans_cfg->csr->flag_mac_access_req));
|
||||
CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
|
||||
} else {
|
||||
iwl_trans_pcie_tx_reset(trans);
|
||||
|
||||
@ -1941,6 +1936,11 @@ static void iwl_trans_pcie_configure(struct iwl_trans *trans,
|
||||
trans_pcie->rx_buf_size = trans_cfg->rx_buf_size;
|
||||
trans_pcie->rx_page_order =
|
||||
iwl_trans_get_rb_size_order(trans_pcie->rx_buf_size);
|
||||
trans_pcie->rx_buf_bytes =
|
||||
iwl_trans_get_rb_size(trans_pcie->rx_buf_size);
|
||||
trans_pcie->supported_dma_mask = DMA_BIT_MASK(12);
|
||||
if (trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_AX210)
|
||||
trans_pcie->supported_dma_mask = DMA_BIT_MASK(11);
|
||||
|
||||
trans_pcie->bc_table_dword = trans_cfg->bc_table_dword;
|
||||
trans_pcie->scd_set_active = trans_cfg->scd_set_active;
|
||||
@ -2050,7 +2050,7 @@ static bool iwl_trans_pcie_grab_nic_access(struct iwl_trans *trans,
|
||||
|
||||
/* this bit wakes up the NIC */
|
||||
__iwl_trans_pcie_set_bit(trans, CSR_GP_CNTRL,
|
||||
BIT(trans->trans_cfg->csr->flag_mac_access_req));
|
||||
CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
|
||||
if (trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_8000)
|
||||
udelay(2);
|
||||
|
||||
@ -2075,8 +2075,8 @@ static bool iwl_trans_pcie_grab_nic_access(struct iwl_trans *trans,
|
||||
* and do not save/restore SRAM when power cycling.
|
||||
*/
|
||||
ret = iwl_poll_bit(trans, CSR_GP_CNTRL,
|
||||
BIT(trans->trans_cfg->csr->flag_val_mac_access_en),
|
||||
(BIT(trans->trans_cfg->csr->flag_mac_clock_ready) |
|
||||
CSR_GP_CNTRL_REG_VAL_MAC_ACCESS_EN,
|
||||
(CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY |
|
||||
CSR_GP_CNTRL_REG_FLAG_GOING_TO_SLEEP), 15000);
|
||||
if (unlikely(ret < 0)) {
|
||||
u32 cntrl = iwl_read32(trans, CSR_GP_CNTRL);
|
||||
@ -2158,7 +2158,7 @@ static void iwl_trans_pcie_release_nic_access(struct iwl_trans *trans,
|
||||
goto out;
|
||||
|
||||
__iwl_trans_pcie_clear_bit(trans, CSR_GP_CNTRL,
|
||||
BIT(trans->trans_cfg->csr->flag_mac_access_req));
|
||||
CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
|
||||
/*
|
||||
* Above we read the CSR_GP_CNTRL register, which will flush
|
||||
* any previous writes, but we need the write that clears the
|
||||
@ -2959,7 +2959,7 @@ static u32 iwl_trans_pcie_dump_rbs(struct iwl_trans *trans,
|
||||
int allocated_rb_nums)
|
||||
{
|
||||
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
|
||||
int max_len = PAGE_SIZE << trans_pcie->rx_page_order;
|
||||
int max_len = trans_pcie->rx_buf_bytes;
|
||||
/* Dump RBs is supported only for pre-9000 devices (1 queue) */
|
||||
struct iwl_rxq *rxq = &trans_pcie->rxq[0];
|
||||
u32 i, r, j, rb_len = 0;
|
||||
@ -2985,9 +2985,9 @@ static u32 iwl_trans_pcie_dump_rbs(struct iwl_trans *trans,
|
||||
rb->index = cpu_to_le32(i);
|
||||
memcpy(rb->data, page_address(rxb->page), max_len);
|
||||
/* remap the page for the free benefit */
|
||||
rxb->page_dma = dma_map_page(trans->dev, rxb->page, 0,
|
||||
max_len,
|
||||
DMA_FROM_DEVICE);
|
||||
rxb->page_dma = dma_map_page(trans->dev, rxb->page,
|
||||
rxb->offset, max_len,
|
||||
DMA_FROM_DEVICE);
|
||||
|
||||
*data = iwl_fw_error_next_data(*data);
|
||||
}
|
||||
@ -3493,6 +3493,7 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
|
||||
trans_pcie->opmode_down = true;
|
||||
spin_lock_init(&trans_pcie->irq_lock);
|
||||
spin_lock_init(&trans_pcie->reg_lock);
|
||||
spin_lock_init(&trans_pcie->alloc_page_lock);
|
||||
mutex_init(&trans_pcie->mutex);
|
||||
init_waitqueue_head(&trans_pcie->ucode_write_waitq);
|
||||
|
||||
|
@ -719,6 +719,10 @@ int iwl_trans_pcie_gen2_tx(struct iwl_trans *trans, struct sk_buff *skb,
|
||||
int idx;
|
||||
void *tfd;
|
||||
|
||||
if (WARN_ONCE(txq_id >= IWL_MAX_TVQM_QUEUES,
|
||||
"queue %d out of range", txq_id))
|
||||
return -EINVAL;
|
||||
|
||||
if (WARN_ONCE(!test_bit(txq_id, trans_pcie->queue_used),
|
||||
"TX on unused queue %d\n", txq_id))
|
||||
return -EINVAL;
|
||||
@ -1233,9 +1237,15 @@ void iwl_pcie_gen2_txq_free_memory(struct iwl_trans *trans,
|
||||
static void iwl_pcie_gen2_txq_free(struct iwl_trans *trans, int txq_id)
|
||||
{
|
||||
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
|
||||
struct iwl_txq *txq = trans_pcie->txq[txq_id];
|
||||
struct iwl_txq *txq;
|
||||
int i;
|
||||
|
||||
if (WARN_ONCE(txq_id >= IWL_MAX_TVQM_QUEUES,
|
||||
"queue %d out of range", txq_id))
|
||||
return;
|
||||
|
||||
txq = trans_pcie->txq[txq_id];
|
||||
|
||||
if (WARN_ON(!txq))
|
||||
return;
|
||||
|
||||
@ -1390,6 +1400,10 @@ void iwl_trans_pcie_dyn_txq_free(struct iwl_trans *trans, int queue)
|
||||
{
|
||||
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
|
||||
|
||||
if (WARN(queue >= IWL_MAX_TVQM_QUEUES,
|
||||
"queue %d out of range", queue))
|
||||
return;
|
||||
|
||||
/*
|
||||
* Upon HW Rfkill - we stop the device, and then stop the queues
|
||||
* in the op_mode. Just for the sake of the simplicity of the op_mode,
|
||||
|
@ -306,7 +306,7 @@ static void iwl_pcie_txq_inc_wr_ptr(struct iwl_trans *trans,
|
||||
IWL_DEBUG_INFO(trans, "Tx queue %d requesting wakeup, GP1 = 0x%x\n",
|
||||
txq_id, reg);
|
||||
iwl_set_bit(trans, CSR_GP_CNTRL,
|
||||
BIT(trans->trans_cfg->csr->flag_mac_access_req));
|
||||
CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
|
||||
txq->need_update = true;
|
||||
return;
|
||||
}
|
||||
@ -652,7 +652,7 @@ static void iwl_pcie_clear_cmd_in_flight(struct iwl_trans *trans)
|
||||
|
||||
trans_pcie->cmd_hold_nic_awake = false;
|
||||
__iwl_trans_pcie_clear_bit(trans, CSR_GP_CNTRL,
|
||||
BIT(trans->trans_cfg->csr->flag_mac_access_req));
|
||||
CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1261,16 +1261,16 @@ static int iwl_pcie_set_cmd_in_flight(struct iwl_trans *trans,
|
||||
if (trans->trans_cfg->base_params->apmg_wake_up_wa &&
|
||||
!trans_pcie->cmd_hold_nic_awake) {
|
||||
__iwl_trans_pcie_set_bit(trans, CSR_GP_CNTRL,
|
||||
BIT(trans->trans_cfg->csr->flag_mac_access_req));
|
||||
CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
|
||||
|
||||
ret = iwl_poll_bit(trans, CSR_GP_CNTRL,
|
||||
BIT(trans->trans_cfg->csr->flag_val_mac_access_en),
|
||||
(BIT(trans->trans_cfg->csr->flag_mac_clock_ready) |
|
||||
CSR_GP_CNTRL_REG_VAL_MAC_ACCESS_EN,
|
||||
(CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY |
|
||||
CSR_GP_CNTRL_REG_FLAG_GOING_TO_SLEEP),
|
||||
15000);
|
||||
if (ret < 0) {
|
||||
__iwl_trans_pcie_clear_bit(trans, CSR_GP_CNTRL,
|
||||
BIT(trans->trans_cfg->csr->flag_mac_access_req));
|
||||
CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
|
||||
IWL_ERR(trans, "Failed to wake NIC for hcmd\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
@ -2508,7 +2508,7 @@ static int prism2_hostapd_add_sta(struct ap_data *ap,
|
||||
sta->supported_rates[0] = 2;
|
||||
if (sta->tx_supp_rates & WLAN_RATE_2M)
|
||||
sta->supported_rates[1] = 4;
|
||||
if (sta->tx_supp_rates & WLAN_RATE_5M5)
|
||||
if (sta->tx_supp_rates & WLAN_RATE_5M5)
|
||||
sta->supported_rates[2] = 11;
|
||||
if (sta->tx_supp_rates & WLAN_RATE_11M)
|
||||
sta->supported_rates[3] = 22;
|
||||
|
@ -894,7 +894,7 @@ void mwifiex_process_tdls_action_frame(struct mwifiex_private *priv,
|
||||
u8 *peer, *pos, *end;
|
||||
u8 i, action, basic;
|
||||
u16 cap = 0;
|
||||
int ie_len = 0;
|
||||
int ies_len = 0;
|
||||
|
||||
if (len < (sizeof(struct ethhdr) + 3))
|
||||
return;
|
||||
@ -916,7 +916,7 @@ void mwifiex_process_tdls_action_frame(struct mwifiex_private *priv,
|
||||
pos = buf + sizeof(struct ethhdr) + 4;
|
||||
/* payload 1+ category 1 + action 1 + dialog 1 */
|
||||
cap = get_unaligned_le16(pos);
|
||||
ie_len = len - sizeof(struct ethhdr) - TDLS_REQ_FIX_LEN;
|
||||
ies_len = len - sizeof(struct ethhdr) - TDLS_REQ_FIX_LEN;
|
||||
pos += 2;
|
||||
break;
|
||||
|
||||
@ -926,7 +926,7 @@ void mwifiex_process_tdls_action_frame(struct mwifiex_private *priv,
|
||||
/* payload 1+ category 1 + action 1 + dialog 1 + status code 2*/
|
||||
pos = buf + sizeof(struct ethhdr) + 6;
|
||||
cap = get_unaligned_le16(pos);
|
||||
ie_len = len - sizeof(struct ethhdr) - TDLS_RESP_FIX_LEN;
|
||||
ies_len = len - sizeof(struct ethhdr) - TDLS_RESP_FIX_LEN;
|
||||
pos += 2;
|
||||
break;
|
||||
|
||||
@ -934,7 +934,7 @@ void mwifiex_process_tdls_action_frame(struct mwifiex_private *priv,
|
||||
if (len < (sizeof(struct ethhdr) + TDLS_CONFIRM_FIX_LEN))
|
||||
return;
|
||||
pos = buf + sizeof(struct ethhdr) + TDLS_CONFIRM_FIX_LEN;
|
||||
ie_len = len - sizeof(struct ethhdr) - TDLS_CONFIRM_FIX_LEN;
|
||||
ies_len = len - sizeof(struct ethhdr) - TDLS_CONFIRM_FIX_LEN;
|
||||
break;
|
||||
default:
|
||||
mwifiex_dbg(priv->adapter, ERROR, "Unknown TDLS frame type.\n");
|
||||
@ -947,33 +947,33 @@ void mwifiex_process_tdls_action_frame(struct mwifiex_private *priv,
|
||||
|
||||
sta_ptr->tdls_cap.capab = cpu_to_le16(cap);
|
||||
|
||||
for (end = pos + ie_len; pos + 1 < end; pos += 2 + pos[1]) {
|
||||
if (pos + 2 + pos[1] > end)
|
||||
for (end = pos + ies_len; pos + 1 < end; pos += 2 + pos[1]) {
|
||||
u8 ie_len = pos[1];
|
||||
|
||||
if (pos + 2 + ie_len > end)
|
||||
break;
|
||||
|
||||
switch (*pos) {
|
||||
case WLAN_EID_SUPP_RATES:
|
||||
if (pos[1] > 32)
|
||||
if (ie_len > sizeof(sta_ptr->tdls_cap.rates))
|
||||
return;
|
||||
sta_ptr->tdls_cap.rates_len = pos[1];
|
||||
for (i = 0; i < pos[1]; i++)
|
||||
sta_ptr->tdls_cap.rates_len = ie_len;
|
||||
for (i = 0; i < ie_len; i++)
|
||||
sta_ptr->tdls_cap.rates[i] = pos[i + 2];
|
||||
break;
|
||||
|
||||
case WLAN_EID_EXT_SUPP_RATES:
|
||||
if (pos[1] > 32)
|
||||
if (ie_len > sizeof(sta_ptr->tdls_cap.rates))
|
||||
return;
|
||||
basic = sta_ptr->tdls_cap.rates_len;
|
||||
if (pos[1] > 32 - basic)
|
||||
if (ie_len > sizeof(sta_ptr->tdls_cap.rates) - basic)
|
||||
return;
|
||||
for (i = 0; i < pos[1]; i++)
|
||||
for (i = 0; i < ie_len; i++)
|
||||
sta_ptr->tdls_cap.rates[basic + i] = pos[i + 2];
|
||||
sta_ptr->tdls_cap.rates_len += pos[1];
|
||||
sta_ptr->tdls_cap.rates_len += ie_len;
|
||||
break;
|
||||
case WLAN_EID_HT_CAPABILITY:
|
||||
if (pos > end - sizeof(struct ieee80211_ht_cap) - 2)
|
||||
return;
|
||||
if (pos[1] != sizeof(struct ieee80211_ht_cap))
|
||||
if (ie_len != sizeof(struct ieee80211_ht_cap))
|
||||
return;
|
||||
/* copy the ie's value into ht_capb*/
|
||||
memcpy((u8 *)&sta_ptr->tdls_cap.ht_capb, pos + 2,
|
||||
@ -981,59 +981,45 @@ void mwifiex_process_tdls_action_frame(struct mwifiex_private *priv,
|
||||
sta_ptr->is_11n_enabled = 1;
|
||||
break;
|
||||
case WLAN_EID_HT_OPERATION:
|
||||
if (pos > end -
|
||||
sizeof(struct ieee80211_ht_operation) - 2)
|
||||
return;
|
||||
if (pos[1] != sizeof(struct ieee80211_ht_operation))
|
||||
if (ie_len != sizeof(struct ieee80211_ht_operation))
|
||||
return;
|
||||
/* copy the ie's value into ht_oper*/
|
||||
memcpy(&sta_ptr->tdls_cap.ht_oper, pos + 2,
|
||||
sizeof(struct ieee80211_ht_operation));
|
||||
break;
|
||||
case WLAN_EID_BSS_COEX_2040:
|
||||
if (pos > end - 3)
|
||||
return;
|
||||
if (pos[1] != 1)
|
||||
if (ie_len != sizeof(pos[2]))
|
||||
return;
|
||||
sta_ptr->tdls_cap.coex_2040 = pos[2];
|
||||
break;
|
||||
case WLAN_EID_EXT_CAPABILITY:
|
||||
if (pos > end - sizeof(struct ieee_types_header))
|
||||
if (ie_len < sizeof(struct ieee_types_header))
|
||||
return;
|
||||
if (pos[1] < sizeof(struct ieee_types_header))
|
||||
return;
|
||||
if (pos[1] > 8)
|
||||
if (ie_len > 8)
|
||||
return;
|
||||
memcpy((u8 *)&sta_ptr->tdls_cap.extcap, pos,
|
||||
sizeof(struct ieee_types_header) +
|
||||
min_t(u8, pos[1], 8));
|
||||
min_t(u8, ie_len, 8));
|
||||
break;
|
||||
case WLAN_EID_RSN:
|
||||
if (pos > end - sizeof(struct ieee_types_header))
|
||||
if (ie_len < sizeof(struct ieee_types_header))
|
||||
return;
|
||||
if (pos[1] < sizeof(struct ieee_types_header))
|
||||
return;
|
||||
if (pos[1] > IEEE_MAX_IE_SIZE -
|
||||
if (ie_len > IEEE_MAX_IE_SIZE -
|
||||
sizeof(struct ieee_types_header))
|
||||
return;
|
||||
memcpy((u8 *)&sta_ptr->tdls_cap.rsn_ie, pos,
|
||||
sizeof(struct ieee_types_header) +
|
||||
min_t(u8, pos[1], IEEE_MAX_IE_SIZE -
|
||||
min_t(u8, ie_len, IEEE_MAX_IE_SIZE -
|
||||
sizeof(struct ieee_types_header)));
|
||||
break;
|
||||
case WLAN_EID_QOS_CAPA:
|
||||
if (pos > end - 3)
|
||||
return;
|
||||
if (pos[1] != 1)
|
||||
if (ie_len != sizeof(pos[2]))
|
||||
return;
|
||||
sta_ptr->tdls_cap.qos_info = pos[2];
|
||||
break;
|
||||
case WLAN_EID_VHT_OPERATION:
|
||||
if (priv->adapter->is_hw_11ac_capable) {
|
||||
if (pos > end -
|
||||
sizeof(struct ieee80211_vht_operation) - 2)
|
||||
return;
|
||||
if (pos[1] !=
|
||||
if (ie_len !=
|
||||
sizeof(struct ieee80211_vht_operation))
|
||||
return;
|
||||
/* copy the ie's value into vhtoper*/
|
||||
@ -1043,10 +1029,7 @@ void mwifiex_process_tdls_action_frame(struct mwifiex_private *priv,
|
||||
break;
|
||||
case WLAN_EID_VHT_CAPABILITY:
|
||||
if (priv->adapter->is_hw_11ac_capable) {
|
||||
if (pos > end -
|
||||
sizeof(struct ieee80211_vht_cap) - 2)
|
||||
return;
|
||||
if (pos[1] != sizeof(struct ieee80211_vht_cap))
|
||||
if (ie_len != sizeof(struct ieee80211_vht_cap))
|
||||
return;
|
||||
/* copy the ie's value into vhtcap*/
|
||||
memcpy((u8 *)&sta_ptr->tdls_cap.vhtcap, pos + 2,
|
||||
@ -1056,9 +1039,7 @@ void mwifiex_process_tdls_action_frame(struct mwifiex_private *priv,
|
||||
break;
|
||||
case WLAN_EID_AID:
|
||||
if (priv->adapter->is_hw_11ac_capable) {
|
||||
if (pos > end - 4)
|
||||
return;
|
||||
if (pos[1] != 2)
|
||||
if (ie_len != sizeof(u16))
|
||||
return;
|
||||
sta_ptr->tdls_cap.aid =
|
||||
get_unaligned_le16((pos + 2));
|
||||
|
@ -1056,7 +1056,8 @@ static void qtnf_cfg80211_reg_notifier(struct wiphy *wiphy,
|
||||
pr_debug("MAC%u: initiator=%d alpha=%c%c\n", mac->macid, req->initiator,
|
||||
req->alpha2[0], req->alpha2[1]);
|
||||
|
||||
ret = qtnf_cmd_reg_notify(mac, req, qtnf_mac_slave_radar_get(wiphy));
|
||||
ret = qtnf_cmd_reg_notify(mac, req, qtnf_slave_radar_get(),
|
||||
qtnf_dfs_offload_get());
|
||||
if (ret) {
|
||||
pr_err("MAC%u: failed to update region to %c%c: %d\n",
|
||||
mac->macid, req->alpha2[0], req->alpha2[1], ret);
|
||||
@ -1078,7 +1079,8 @@ struct wiphy *qtnf_wiphy_allocate(struct qtnf_bus *bus)
|
||||
{
|
||||
struct wiphy *wiphy;
|
||||
|
||||
if (bus->hw_info.hw_capab & QLINK_HW_CAPAB_DFS_OFFLOAD)
|
||||
if (qtnf_dfs_offload_get() &&
|
||||
(bus->hw_info.hw_capab & QLINK_HW_CAPAB_DFS_OFFLOAD))
|
||||
qtn_cfg80211_ops.start_radar_detection = NULL;
|
||||
|
||||
if (!(bus->hw_info.hw_capab & QLINK_HW_CAPAB_PWR_MGMT))
|
||||
@ -1163,7 +1165,8 @@ int qtnf_wiphy_register(struct qtnf_hw_info *hw_info, struct qtnf_wmac *mac)
|
||||
WIPHY_FLAG_NETNS_OK;
|
||||
wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT;
|
||||
|
||||
if (hw_info->hw_capab & QLINK_HW_CAPAB_DFS_OFFLOAD)
|
||||
if (qtnf_dfs_offload_get() &&
|
||||
(hw_info->hw_capab & QLINK_HW_CAPAB_DFS_OFFLOAD))
|
||||
wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_DFS_OFFLOAD);
|
||||
|
||||
if (hw_info->hw_capab & QLINK_HW_CAPAB_SCAN_DWELL)
|
||||
|
@ -257,6 +257,14 @@ int qtnf_cmd_send_start_ap(struct qtnf_vif *vif,
|
||||
cmd->pbss = s->pbss;
|
||||
cmd->ht_required = s->ht_required;
|
||||
cmd->vht_required = s->vht_required;
|
||||
cmd->twt_responder = s->twt_responder;
|
||||
if (s->he_obss_pd.enable) {
|
||||
cmd->sr_params.sr_control |= QLINK_SR_SRG_INFORMATION_PRESENT;
|
||||
cmd->sr_params.srg_obss_pd_min_offset =
|
||||
s->he_obss_pd.min_offset;
|
||||
cmd->sr_params.srg_obss_pd_max_offset =
|
||||
s->he_obss_pd.max_offset;
|
||||
}
|
||||
|
||||
aen = &cmd->aen;
|
||||
aen->auth_type = s->auth_type;
|
||||
@ -510,6 +518,8 @@ qtnf_sta_info_parse_rate(struct rate_info *rate_dst,
|
||||
rate_dst->flags |= RATE_INFO_FLAGS_MCS;
|
||||
else if (rate_src->flags & QLINK_STA_INFO_RATE_FLAG_VHT_MCS)
|
||||
rate_dst->flags |= RATE_INFO_FLAGS_VHT_MCS;
|
||||
else if (rate_src->flags & QLINK_STA_INFO_RATE_FLAG_HE_MCS)
|
||||
rate_dst->flags |= RATE_INFO_FLAGS_HE_MCS;
|
||||
|
||||
if (rate_src->flags & QLINK_STA_INFO_RATE_FLAG_SHORT_GI)
|
||||
rate_dst->flags |= RATE_INFO_FLAGS_SHORT_GI;
|
||||
@ -2454,7 +2464,7 @@ int qtnf_cmd_send_updown_intf(struct qtnf_vif *vif, bool up)
|
||||
}
|
||||
|
||||
int qtnf_cmd_reg_notify(struct qtnf_wmac *mac, struct regulatory_request *req,
|
||||
bool slave_radar)
|
||||
bool slave_radar, bool dfs_offload)
|
||||
{
|
||||
struct wiphy *wiphy = priv_to_wiphy(mac);
|
||||
struct qtnf_bus *bus = mac->bus;
|
||||
@ -2517,6 +2527,7 @@ int qtnf_cmd_reg_notify(struct qtnf_wmac *mac, struct regulatory_request *req,
|
||||
}
|
||||
|
||||
cmd->slave_radar = slave_radar;
|
||||
cmd->dfs_offload = dfs_offload;
|
||||
cmd->num_channels = 0;
|
||||
|
||||
for (band = 0; band < NUM_NL80211_BANDS; band++) {
|
||||
|
@ -58,7 +58,7 @@ int qtnf_cmd_send_disconnect(struct qtnf_vif *vif,
|
||||
int qtnf_cmd_send_updown_intf(struct qtnf_vif *vif,
|
||||
bool up);
|
||||
int qtnf_cmd_reg_notify(struct qtnf_wmac *mac, struct regulatory_request *req,
|
||||
bool slave_radar);
|
||||
bool slave_radar, bool dfs_offload);
|
||||
int qtnf_cmd_get_chan_stats(struct qtnf_wmac *mac, u16 channel,
|
||||
struct qtnf_chan_stats *stats);
|
||||
int qtnf_cmd_send_chan_switch(struct qtnf_vif *vif,
|
||||
|
@ -21,8 +21,22 @@ static bool slave_radar = true;
|
||||
module_param(slave_radar, bool, 0644);
|
||||
MODULE_PARM_DESC(slave_radar, "set 0 to disable radar detection in slave mode");
|
||||
|
||||
static bool dfs_offload;
|
||||
module_param(dfs_offload, bool, 0644);
|
||||
MODULE_PARM_DESC(dfs_offload, "set 1 to enable DFS offload to firmware");
|
||||
|
||||
static struct dentry *qtnf_debugfs_dir;
|
||||
|
||||
bool qtnf_slave_radar_get(void)
|
||||
{
|
||||
return slave_radar;
|
||||
}
|
||||
|
||||
bool qtnf_dfs_offload_get(void)
|
||||
{
|
||||
return dfs_offload;
|
||||
}
|
||||
|
||||
struct qtnf_wmac *qtnf_core_get_mac(const struct qtnf_bus *bus, u8 macid)
|
||||
{
|
||||
struct qtnf_wmac *mac = NULL;
|
||||
@ -211,9 +225,6 @@ static int qtnf_netdev_port_parent_id(struct net_device *ndev,
|
||||
const struct qtnf_vif *vif = qtnf_netdev_get_priv(ndev);
|
||||
const struct qtnf_bus *bus = vif->mac->bus;
|
||||
|
||||
if (!(bus->hw_info.hw_capab & QLINK_HW_CAPAB_HW_BRIDGE))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
ppid->id_len = sizeof(bus->hw_id);
|
||||
memcpy(&ppid->id, bus->hw_id, ppid->id_len);
|
||||
|
||||
@ -456,11 +467,6 @@ static struct qtnf_wmac *qtnf_core_mac_alloc(struct qtnf_bus *bus,
|
||||
return mac;
|
||||
}
|
||||
|
||||
bool qtnf_mac_slave_radar_get(struct wiphy *wiphy)
|
||||
{
|
||||
return slave_radar;
|
||||
}
|
||||
|
||||
static const struct ethtool_ops qtnf_ethtool_ops = {
|
||||
.get_drvinfo = cfg80211_get_drvinfo,
|
||||
};
|
||||
@ -656,12 +662,24 @@ bool qtnf_netdev_is_qtn(const struct net_device *ndev)
|
||||
return ndev->netdev_ops == &qtnf_netdev_ops;
|
||||
}
|
||||
|
||||
static int qtnf_check_br_ports(struct net_device *dev, void *data)
|
||||
{
|
||||
struct net_device *ndev = data;
|
||||
|
||||
if (dev != ndev && netdev_port_same_parent_id(dev, ndev))
|
||||
return -ENOTSUPP;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qtnf_core_netdevice_event(struct notifier_block *nb,
|
||||
unsigned long event, void *ptr)
|
||||
{
|
||||
struct net_device *ndev = netdev_notifier_info_to_dev(ptr);
|
||||
const struct netdev_notifier_changeupper_info *info;
|
||||
struct net_device *brdev;
|
||||
struct qtnf_vif *vif;
|
||||
struct qtnf_bus *bus;
|
||||
int br_domain;
|
||||
int ret = 0;
|
||||
|
||||
@ -672,25 +690,34 @@ static int qtnf_core_netdevice_event(struct notifier_block *nb,
|
||||
return NOTIFY_OK;
|
||||
|
||||
vif = qtnf_netdev_get_priv(ndev);
|
||||
bus = vif->mac->bus;
|
||||
|
||||
switch (event) {
|
||||
case NETDEV_CHANGEUPPER:
|
||||
info = ptr;
|
||||
brdev = info->upper_dev;
|
||||
|
||||
if (!netif_is_bridge_master(info->upper_dev))
|
||||
if (!netif_is_bridge_master(brdev))
|
||||
break;
|
||||
|
||||
pr_debug("[VIF%u.%u] change bridge: %s %s\n",
|
||||
vif->mac->macid, vif->vifid,
|
||||
netdev_name(info->upper_dev),
|
||||
vif->mac->macid, vif->vifid, netdev_name(brdev),
|
||||
info->linking ? "add" : "del");
|
||||
|
||||
if (info->linking)
|
||||
br_domain = info->upper_dev->ifindex;
|
||||
else
|
||||
br_domain = ndev->ifindex;
|
||||
if (IS_ENABLED(CONFIG_NET_SWITCHDEV) &&
|
||||
(bus->hw_info.hw_capab & QLINK_HW_CAPAB_HW_BRIDGE)) {
|
||||
if (info->linking)
|
||||
br_domain = brdev->ifindex;
|
||||
else
|
||||
br_domain = ndev->ifindex;
|
||||
|
||||
ret = qtnf_cmd_netdev_changeupper(vif, br_domain);
|
||||
} else {
|
||||
ret = netdev_walk_all_lower_dev(brdev,
|
||||
qtnf_check_br_ports,
|
||||
ndev);
|
||||
}
|
||||
|
||||
ret = qtnf_cmd_netdev_changeupper(vif, br_domain);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -763,13 +790,11 @@ int qtnf_core_attach(struct qtnf_bus *bus)
|
||||
}
|
||||
}
|
||||
|
||||
if (bus->hw_info.hw_capab & QLINK_HW_CAPAB_HW_BRIDGE) {
|
||||
bus->netdev_nb.notifier_call = qtnf_core_netdevice_event;
|
||||
ret = register_netdevice_notifier(&bus->netdev_nb);
|
||||
if (ret) {
|
||||
pr_err("failed to register netdev notifier: %d\n", ret);
|
||||
goto error;
|
||||
}
|
||||
bus->netdev_nb.notifier_call = qtnf_core_netdevice_event;
|
||||
ret = register_netdevice_notifier(&bus->netdev_nb);
|
||||
if (ret) {
|
||||
pr_err("failed to register netdev notifier: %d\n", ret);
|
||||
goto error;
|
||||
}
|
||||
|
||||
bus->fw_state = QTNF_FW_STATE_RUNNING;
|
||||
|
@ -133,7 +133,8 @@ struct qtnf_vif *qtnf_mac_get_free_vif(struct qtnf_wmac *mac);
|
||||
struct qtnf_vif *qtnf_mac_get_base_vif(struct qtnf_wmac *mac);
|
||||
void qtnf_mac_iface_comb_free(struct qtnf_wmac *mac);
|
||||
void qtnf_mac_ext_caps_free(struct qtnf_wmac *mac);
|
||||
bool qtnf_mac_slave_radar_get(struct wiphy *wiphy);
|
||||
bool qtnf_slave_radar_get(void);
|
||||
bool qtnf_dfs_offload_get(void);
|
||||
struct wiphy *qtnf_wiphy_allocate(struct qtnf_bus *bus);
|
||||
int qtnf_core_net_attach(struct qtnf_wmac *mac, struct qtnf_vif *priv,
|
||||
const char *name, unsigned char name_assign_type);
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
#include <linux/ieee80211.h>
|
||||
|
||||
#define QLINK_PROTO_VER 15
|
||||
#define QLINK_PROTO_VER 16
|
||||
|
||||
#define QLINK_MACID_RSVD 0xFF
|
||||
#define QLINK_VIFID_RSVD 0xFF
|
||||
@ -196,6 +196,45 @@ struct qlink_sta_info_state {
|
||||
__le32 value;
|
||||
} __packed;
|
||||
|
||||
/**
|
||||
* enum qlink_sr_ctrl_flags - control flags for spatial reuse parameter set
|
||||
*
|
||||
* @QLINK_SR_PSR_DISALLOWED: indicates whether or not PSR-based spatial reuse
|
||||
* transmissions are allowed for STAs associated with the AP
|
||||
* @QLINK_SR_NON_SRG_OBSS_PD_SR_DISALLOWED: indicates whether or not
|
||||
* Non-SRG OBSS PD spatial reuse transmissions are allowed for STAs associated
|
||||
* with the AP
|
||||
* @NON_SRG_OFFSET_PRESENT: indicates whether or not Non-SRG OBSS PD Max offset
|
||||
* field is valid in the element
|
||||
* @QLINK_SR_SRG_INFORMATION_PRESENT: indicates whether or not SRG OBSS PD
|
||||
* Min/Max offset fields ore valid in the element
|
||||
*/
|
||||
enum qlink_sr_ctrl_flags {
|
||||
QLINK_SR_PSR_DISALLOWED = BIT(0),
|
||||
QLINK_SR_NON_SRG_OBSS_PD_SR_DISALLOWED = BIT(1),
|
||||
QLINK_SR_NON_SRG_OFFSET_PRESENT = BIT(2),
|
||||
QLINK_SR_SRG_INFORMATION_PRESENT = BIT(3),
|
||||
};
|
||||
|
||||
/**
|
||||
* struct qlink_sr_params - spatial reuse parameters
|
||||
*
|
||||
* @sr_control: spatial reuse control field; flags contained in this field are
|
||||
* defined in @qlink_sr_ctrl_flags
|
||||
* @non_srg_obss_pd_max: added to -82 dBm to generate the value of the
|
||||
* Non-SRG OBSS PD Max parameter
|
||||
* @srg_obss_pd_min_offset: added to -82 dBm to generate the value of the
|
||||
* SRG OBSS PD Min parameter
|
||||
* @srg_obss_pd_max_offset: added to -82 dBm to generate the value of the
|
||||
* SRG PBSS PD Max parameter
|
||||
*/
|
||||
struct qlink_sr_params {
|
||||
u8 sr_control;
|
||||
u8 non_srg_obss_pd_max;
|
||||
u8 srg_obss_pd_min_offset;
|
||||
u8 srg_obss_pd_max_offset;
|
||||
} __packed;
|
||||
|
||||
/* QLINK Command messages related definitions
|
||||
*/
|
||||
|
||||
@ -596,8 +635,9 @@ enum qlink_user_reg_hint_type {
|
||||
* of &enum qlink_user_reg_hint_type.
|
||||
* @num_channels: number of &struct qlink_tlv_channel in a variable portion of a
|
||||
* payload.
|
||||
* @slave_radar: whether slave device should enable radar detection.
|
||||
* @dfs_region: one of &enum qlink_dfs_regions.
|
||||
* @slave_radar: whether slave device should enable radar detection.
|
||||
* @dfs_offload: enable or disable DFS offload to firmware.
|
||||
* @info: variable portion of regulatory notifier callback.
|
||||
*/
|
||||
struct qlink_cmd_reg_notify {
|
||||
@ -608,7 +648,7 @@ struct qlink_cmd_reg_notify {
|
||||
u8 num_channels;
|
||||
u8 dfs_region;
|
||||
u8 slave_radar;
|
||||
u8 rsvd[1];
|
||||
u8 dfs_offload;
|
||||
u8 info[0];
|
||||
} __packed;
|
||||
|
||||
@ -650,6 +690,8 @@ enum qlink_hidden_ssid {
|
||||
* @ht_required: stations must support HT
|
||||
* @vht_required: stations must support VHT
|
||||
* @aen: encryption info
|
||||
* @sr_params: spatial reuse parameters
|
||||
* @twt_responder: enable Target Wake Time
|
||||
* @info: variable configurations
|
||||
*/
|
||||
struct qlink_cmd_start_ap {
|
||||
@ -665,6 +707,9 @@ struct qlink_cmd_start_ap {
|
||||
u8 ht_required;
|
||||
u8 vht_required;
|
||||
struct qlink_auth_encr aen;
|
||||
struct qlink_sr_params sr_params;
|
||||
u8 twt_responder;
|
||||
u8 rsvd[3];
|
||||
u8 info[0];
|
||||
} __packed;
|
||||
|
||||
@ -948,6 +993,7 @@ enum qlink_sta_info_rate_flags {
|
||||
QLINK_STA_INFO_RATE_FLAG_VHT_MCS = BIT(1),
|
||||
QLINK_STA_INFO_RATE_FLAG_SHORT_GI = BIT(2),
|
||||
QLINK_STA_INFO_RATE_FLAG_60G = BIT(3),
|
||||
QLINK_STA_INFO_RATE_FLAG_HE_MCS = BIT(4),
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -862,7 +862,7 @@ static void btc8192e2ant_set_sw_rf_rx_lpf_corner(struct btc_coexist *btcoexist,
|
||||
/* Resume RF Rx LPF corner
|
||||
* After initialized, we can use coex_dm->btRf0x1eBackup
|
||||
*/
|
||||
if (btcoexist->initilized) {
|
||||
if (btcoexist->initialized) {
|
||||
RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
|
||||
"[BTCoex], Resume RF Rx LPF corner!!\n");
|
||||
btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1e,
|
||||
|
@ -1461,7 +1461,7 @@ void exhalbtc_init_coex_dm(struct btc_coexist *btcoexist)
|
||||
ex_btc8192e2ant_init_coex_dm(btcoexist);
|
||||
}
|
||||
|
||||
btcoexist->initilized = true;
|
||||
btcoexist->initialized = true;
|
||||
}
|
||||
|
||||
void exhalbtc_ips_notify(struct btc_coexist *btcoexist, u8 type)
|
||||
|
@ -679,7 +679,7 @@ struct btc_coexist {
|
||||
bool auto_report_2ant;
|
||||
bool dbg_mode_1ant;
|
||||
bool dbg_mode_2ant;
|
||||
bool initilized;
|
||||
bool initialized;
|
||||
bool stop_coex_dm;
|
||||
bool manual_control;
|
||||
struct btc_statistics statistics;
|
||||
|
@ -264,7 +264,7 @@ static bool _rtl88e_check_condition(struct ieee80211_hw *hw,
|
||||
u32 _board = rtlefuse->board_type; /*need efuse define*/
|
||||
u32 _interface = rtlhal->interface;
|
||||
u32 _platform = 0x08;/*SupportPlatform */
|
||||
u32 cond = condition;
|
||||
u32 cond;
|
||||
|
||||
if (condition == 0xCDCDCDCD)
|
||||
return true;
|
||||
|
@ -9,7 +9,6 @@
|
||||
#include "phy.h"
|
||||
#include "dm.h"
|
||||
#include "hw.h"
|
||||
#include "sw.h"
|
||||
#include "trx.h"
|
||||
#include "led.h"
|
||||
#include "table.h"
|
||||
@ -59,7 +58,7 @@ static void rtl88e_init_aspm_vars(struct ieee80211_hw *hw)
|
||||
rtlpci->const_support_pciaspm = rtlpriv->cfg->mod_params->aspm_support;
|
||||
}
|
||||
|
||||
int rtl88e_init_sw_vars(struct ieee80211_hw *hw)
|
||||
static int rtl88e_init_sw_vars(struct ieee80211_hw *hw)
|
||||
{
|
||||
int err = 0;
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
@ -173,7 +172,7 @@ int rtl88e_init_sw_vars(struct ieee80211_hw *hw)
|
||||
return err;
|
||||
}
|
||||
|
||||
void rtl88e_deinit_sw_vars(struct ieee80211_hw *hw)
|
||||
static void rtl88e_deinit_sw_vars(struct ieee80211_hw *hw)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
|
||||
@ -189,7 +188,7 @@ void rtl88e_deinit_sw_vars(struct ieee80211_hw *hw)
|
||||
}
|
||||
|
||||
/* get bt coexist status */
|
||||
bool rtl88e_get_btc_status(void)
|
||||
static bool rtl88e_get_btc_status(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -1,12 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/* Copyright(c) 2009-2013 Realtek Corporation.*/
|
||||
|
||||
#ifndef __RTL92CE_SW_H__
|
||||
#define __RTL92CE_SW_H__
|
||||
|
||||
int rtl88e_init_sw_vars(struct ieee80211_hw *hw);
|
||||
void rtl88e_deinit_sw_vars(struct ieee80211_hw *hw);
|
||||
bool rtl88e_get_btc_status(void);
|
||||
|
||||
|
||||
#endif
|
@ -14,7 +14,6 @@
|
||||
#include "../rtl8192c/phy_common.h"
|
||||
#include "hw.h"
|
||||
#include "rf.h"
|
||||
#include "sw.h"
|
||||
#include "trx.h"
|
||||
#include "led.h"
|
||||
|
||||
@ -65,7 +64,7 @@ static void rtl92c_init_aspm_vars(struct ieee80211_hw *hw)
|
||||
rtlpci->const_support_pciaspm = rtlpriv->cfg->mod_params->aspm_support;
|
||||
}
|
||||
|
||||
int rtl92c_init_sw_vars(struct ieee80211_hw *hw)
|
||||
static int rtl92c_init_sw_vars(struct ieee80211_hw *hw)
|
||||
{
|
||||
int err;
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
@ -161,7 +160,7 @@ int rtl92c_init_sw_vars(struct ieee80211_hw *hw)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void rtl92c_deinit_sw_vars(struct ieee80211_hw *hw)
|
||||
static void rtl92c_deinit_sw_vars(struct ieee80211_hw *hw)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
|
||||
|
@ -1,15 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/* Copyright(c) 2009-2012 Realtek Corporation.*/
|
||||
|
||||
#ifndef __RTL92CE_SW_H__
|
||||
#define __RTL92CE_SW_H__
|
||||
|
||||
int rtl92c_init_sw_vars(struct ieee80211_hw *hw);
|
||||
void rtl92c_deinit_sw_vars(struct ieee80211_hw *hw);
|
||||
void rtl92c_init_var_map(struct ieee80211_hw *hw);
|
||||
bool _rtl92ce_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
|
||||
u8 configtype);
|
||||
bool _rtl92ce_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
|
||||
u8 configtype);
|
||||
|
||||
#endif
|
@ -12,7 +12,6 @@
|
||||
#include "mac.h"
|
||||
#include "dm.h"
|
||||
#include "rf.h"
|
||||
#include "sw.h"
|
||||
#include "trx.h"
|
||||
#include "led.h"
|
||||
#include "hw.h"
|
||||
@ -252,45 +251,45 @@ static struct rtl_hal_cfg rtl92cu_hal_cfg = {
|
||||
.maps[RTL_RC_HT_RATEMCS15] = DESC_RATEMCS15,
|
||||
};
|
||||
|
||||
#define USB_VENDER_ID_REALTEK 0x0bda
|
||||
#define USB_VENDOR_ID_REALTEK 0x0bda
|
||||
|
||||
/* 2010-10-19 DID_USB_V3.4 */
|
||||
static const struct usb_device_id rtl8192c_usb_ids[] = {
|
||||
|
||||
/*=== Realtek demoboard ===*/
|
||||
/* Default ID */
|
||||
{RTL_USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8191, rtl92cu_hal_cfg)},
|
||||
{RTL_USB_DEVICE(USB_VENDOR_ID_REALTEK, 0x8191, rtl92cu_hal_cfg)},
|
||||
|
||||
/****** 8188CU ********/
|
||||
/* RTL8188CTV */
|
||||
{RTL_USB_DEVICE(USB_VENDER_ID_REALTEK, 0x018a, rtl92cu_hal_cfg)},
|
||||
{RTL_USB_DEVICE(USB_VENDOR_ID_REALTEK, 0x018a, rtl92cu_hal_cfg)},
|
||||
/* 8188CE-VAU USB minCard */
|
||||
{RTL_USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8170, rtl92cu_hal_cfg)},
|
||||
{RTL_USB_DEVICE(USB_VENDOR_ID_REALTEK, 0x8170, rtl92cu_hal_cfg)},
|
||||
/* 8188cu 1*1 dongle */
|
||||
{RTL_USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8176, rtl92cu_hal_cfg)},
|
||||
{RTL_USB_DEVICE(USB_VENDOR_ID_REALTEK, 0x8176, rtl92cu_hal_cfg)},
|
||||
/* 8188cu 1*1 dongle, (b/g mode only) */
|
||||
{RTL_USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8177, rtl92cu_hal_cfg)},
|
||||
{RTL_USB_DEVICE(USB_VENDOR_ID_REALTEK, 0x8177, rtl92cu_hal_cfg)},
|
||||
/* 8188cu Slim Solo */
|
||||
{RTL_USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817a, rtl92cu_hal_cfg)},
|
||||
{RTL_USB_DEVICE(USB_VENDOR_ID_REALTEK, 0x817a, rtl92cu_hal_cfg)},
|
||||
/* 8188cu Slim Combo */
|
||||
{RTL_USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817b, rtl92cu_hal_cfg)},
|
||||
{RTL_USB_DEVICE(USB_VENDOR_ID_REALTEK, 0x817b, rtl92cu_hal_cfg)},
|
||||
/* 8188RU High-power USB Dongle */
|
||||
{RTL_USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817d, rtl92cu_hal_cfg)},
|
||||
{RTL_USB_DEVICE(USB_VENDOR_ID_REALTEK, 0x817d, rtl92cu_hal_cfg)},
|
||||
/* 8188CE-VAU USB minCard (b/g mode only) */
|
||||
{RTL_USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817e, rtl92cu_hal_cfg)},
|
||||
{RTL_USB_DEVICE(USB_VENDOR_ID_REALTEK, 0x817e, rtl92cu_hal_cfg)},
|
||||
/* 8188RU in Alfa AWUS036NHR */
|
||||
{RTL_USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817f, rtl92cu_hal_cfg)},
|
||||
{RTL_USB_DEVICE(USB_VENDOR_ID_REALTEK, 0x817f, rtl92cu_hal_cfg)},
|
||||
/* RTL8188CUS-VL */
|
||||
{RTL_USB_DEVICE(USB_VENDER_ID_REALTEK, 0x818a, rtl92cu_hal_cfg)},
|
||||
{RTL_USB_DEVICE(USB_VENDER_ID_REALTEK, 0x819a, rtl92cu_hal_cfg)},
|
||||
{RTL_USB_DEVICE(USB_VENDOR_ID_REALTEK, 0x818a, rtl92cu_hal_cfg)},
|
||||
{RTL_USB_DEVICE(USB_VENDOR_ID_REALTEK, 0x819a, rtl92cu_hal_cfg)},
|
||||
/* 8188 Combo for BC4 */
|
||||
{RTL_USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8754, rtl92cu_hal_cfg)},
|
||||
{RTL_USB_DEVICE(USB_VENDOR_ID_REALTEK, 0x8754, rtl92cu_hal_cfg)},
|
||||
|
||||
/****** 8192CU ********/
|
||||
/* 8192cu 2*2 */
|
||||
{RTL_USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8178, rtl92cu_hal_cfg)},
|
||||
{RTL_USB_DEVICE(USB_VENDOR_ID_REALTEK, 0x8178, rtl92cu_hal_cfg)},
|
||||
/* 8192CE-VAU USB minCard */
|
||||
{RTL_USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817c, rtl92cu_hal_cfg)},
|
||||
{RTL_USB_DEVICE(USB_VENDOR_ID_REALTEK, 0x817c, rtl92cu_hal_cfg)},
|
||||
|
||||
/*=== Customer ID ===*/
|
||||
/****** 8188CU ********/
|
||||
@ -329,7 +328,7 @@ static const struct usb_device_id rtl8192c_usb_ids[] = {
|
||||
|
||||
/****** 8188 RU ********/
|
||||
/* Netcore */
|
||||
{RTL_USB_DEVICE(USB_VENDER_ID_REALTEK, 0x317f, rtl92cu_hal_cfg)},
|
||||
{RTL_USB_DEVICE(USB_VENDOR_ID_REALTEK, 0x317f, rtl92cu_hal_cfg)},
|
||||
|
||||
/****** 8188CUS Slim Solo********/
|
||||
{RTL_USB_DEVICE(0x04f2, 0xaff7, rtl92cu_hal_cfg)}, /*Xavi*/
|
||||
|
@ -1,27 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/* Copyright(c) 2009-2012 Realtek Corporation.*/
|
||||
|
||||
#ifndef __RTL92CU_SW_H__
|
||||
#define __RTL92CU_SW_H__
|
||||
|
||||
#define EFUSE_MAX_SECTION 16
|
||||
|
||||
void rtl92cu_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,
|
||||
u8 *powerlevel);
|
||||
void rtl92cu_phy_rf6052_set_ofdm_txpower(struct ieee80211_hw *hw,
|
||||
u8 *ppowerlevel, u8 channel);
|
||||
bool _rtl92cu_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
|
||||
u8 configtype);
|
||||
bool _rtl92cu_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
|
||||
u8 configtype);
|
||||
void _rtl92cu_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t);
|
||||
void rtl92cu_phy_set_rf_reg(struct ieee80211_hw *hw,
|
||||
enum radio_path rfpath,
|
||||
u32 regaddr, u32 bitmask, u32 data);
|
||||
bool rtl92cu_phy_set_rf_power_state(struct ieee80211_hw *hw,
|
||||
enum rf_pwrstate rfpwr_state);
|
||||
u32 rtl92cu_phy_query_rf_reg(struct ieee80211_hw *hw,
|
||||
enum radio_path rfpath, u32 regaddr, u32 bitmask);
|
||||
void rtl92cu_phy_set_bw_mode_callback(struct ieee80211_hw *hw);
|
||||
|
||||
#endif
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user