forked from Minki/linux
wireless-drivers-next patches for v5.7
Third set of patches for v5.7. Nothing really special this time, business as usual. When pulling this to net-next there's again a conflict in: drivers/net/wireless/intel/iwlwifi/pcie/drv.c To solve this drop these three lines from the conflict (the first hunk from "HEAD") as the whole AX200 block was moved above in the same file: IWL_DEV_INFO(0x2723, 0x1653, iwl_ax200_cfg_cc, iwl_ax200_killer_1650w_name), IWL_DEV_INFO(0x2723, 0x1654, iwl_ax200_cfg_cc, iwl_ax200_killer_1650x_name), IWL_DEV_INFO(0x2723, IWL_CFG_ANY, iwl_ax200_cfg_cc, iwl_ax200_name), And keep all the __IWL_DEV_INFO() entries (the second hunk). In other words, take everything from wireless-drivers-next. When running 'git diff' after the resolution the output should be empty. Major changes: brcmfmac * add USB autosuspend support ath11k * handle RX fragments * enable PN offload * add support for HE BSS color iwlwifi * support new FW API version * support for EDCA measurements * new scan API features * enable new firmware debugging code -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJefdsZAAoJEG4XJFUm622blekH/2fIoUtl8Kdih38hNjz63PLD x+LCPjZdRjrmFGTSxnS1rZiIM7v2yXyLGiyq+yr2ltzkpTi8xWOkKL6US8RCew9R otRtZyLrhgMLG2ExDna1fI5ZJAtLnxV31TCy6yrSUDZ8t4VxMNIB4si3WRzKvAfU c+cQcsnWr+pCDnbxh53BcYIyiEqKlttw/fGuIKchKuYMQy7DV6nxMdTaAym5Szzi Nlb8fhXWFaPrPQ6NtHb5WWm4Er3wtMzN/AG8aFVxjrik07vTxQKWamdT9CeK2tDT iDbx2HaNCWFMulXeZMrc9+inoAzj3UjbPqH3OTUk9iHbVA0unc3CdEBFD9h928Q= =D/FA -----END PGP SIGNATURE----- Merge tag 'wireless-drivers-next-2020-03-27' of git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers-next Kalle Valo says: ==================== wireless-drivers-next patches for v5.7 Third set of patches for v5.7. Nothing really special this time, business as usual. When pulling this to net-next there's again a conflict in: drivers/net/wireless/intel/iwlwifi/pcie/drv.c To solve this drop these three lines from the conflict (the first hunk from "HEAD") as the whole AX200 block was moved above in the same file: IWL_DEV_INFO(0x2723, 0x1653, iwl_ax200_cfg_cc, iwl_ax200_killer_1650w_name), IWL_DEV_INFO(0x2723, 0x1654, iwl_ax200_cfg_cc, iwl_ax200_killer_1650x_name), IWL_DEV_INFO(0x2723, IWL_CFG_ANY, iwl_ax200_cfg_cc, iwl_ax200_name), And keep all the __IWL_DEV_INFO() entries (the second hunk). In other words, take everything from wireless-drivers-next. When running 'git diff' after the resolution the output should be empty. Major changes: brcmfmac * add USB autosuspend support ath11k * handle RX fragments * enable PN offload * add support for HE BSS color iwlwifi * support new FW API version * support for EDCA measurements * new scan API features * enable new firmware debugging code ==================== Kalle gave me directions on how to resolve the iwlwifi conflict as follows: ==================== When pulling this to net-next there's again a conflict in: drivers/net/wireless/intel/iwlwifi/pcie/drv.c To solve this drop these three lines from the conflict (the first hunk from "HEAD") as the whole AX200 block was moved above in the same file: IWL_DEV_INFO(0x2723, 0x1653, iwl_ax200_cfg_cc, iwl_ax200_killer_1650w_name), IWL_DEV_INFO(0x2723, 0x1654, iwl_ax200_cfg_cc, iwl_ax200_killer_1650x_name), IWL_DEV_INFO(0x2723, IWL_CFG_ANY, iwl_ax200_cfg_cc, iwl_ax200_name), And keep all the __IWL_DEV_INFO() entries (the second hunk). In other words, take everything from wireless-drivers-next. When running 'git diff' after the resolution the output should be empty. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
22f33971aa
@ -119,6 +119,7 @@ struct ath10k_skb_cb {
|
||||
u16 airtime_est;
|
||||
struct ieee80211_vif *vif;
|
||||
struct ieee80211_txq *txq;
|
||||
u32 ucast_cipher;
|
||||
} __packed;
|
||||
|
||||
struct ath10k_skb_rxcb {
|
||||
@ -504,6 +505,7 @@ struct ath10k_sta {
|
||||
struct work_struct update_wk;
|
||||
u64 rx_duration;
|
||||
struct ath10k_htt_tx_stats *tx_stats;
|
||||
u32 ucast_cipher;
|
||||
|
||||
#ifdef CONFIG_MAC80211_DEBUGFS
|
||||
/* protected by conf_mutex */
|
||||
|
@ -1163,6 +1163,7 @@ int ath10k_htt_mgmt_tx(struct ath10k_htt *htt, struct sk_buff *msdu)
|
||||
int len = 0;
|
||||
int msdu_id = -1;
|
||||
int res;
|
||||
const u8 *peer_addr;
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)msdu->data;
|
||||
|
||||
len += sizeof(cmd->hdr);
|
||||
@ -1178,7 +1179,16 @@ int ath10k_htt_mgmt_tx(struct ath10k_htt *htt, struct sk_buff *msdu)
|
||||
ieee80211_is_deauth(hdr->frame_control) ||
|
||||
ieee80211_is_disassoc(hdr->frame_control)) &&
|
||||
ieee80211_has_protected(hdr->frame_control)) {
|
||||
skb_put(msdu, IEEE80211_CCMP_MIC_LEN);
|
||||
peer_addr = hdr->addr1;
|
||||
if (is_multicast_ether_addr(peer_addr)) {
|
||||
skb_put(msdu, sizeof(struct ieee80211_mmie_16));
|
||||
} else {
|
||||
if (skb_cb->ucast_cipher == WLAN_CIPHER_SUITE_GCMP ||
|
||||
skb_cb->ucast_cipher == WLAN_CIPHER_SUITE_GCMP_256)
|
||||
skb_put(msdu, IEEE80211_GCMP_MIC_LEN);
|
||||
else
|
||||
skb_put(msdu, IEEE80211_CCMP_MIC_LEN);
|
||||
}
|
||||
}
|
||||
|
||||
txdesc = ath10k_htc_alloc_skb(ar, len);
|
||||
|
@ -258,6 +258,7 @@ static int ath10k_send_key(struct ath10k_vif *arvif,
|
||||
case WLAN_CIPHER_SUITE_GCMP:
|
||||
case WLAN_CIPHER_SUITE_GCMP_256:
|
||||
arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_AES_GCM];
|
||||
key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_128:
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_256:
|
||||
@ -3576,6 +3577,7 @@ static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar,
|
||||
static void ath10k_mac_tx_h_fill_cb(struct ath10k *ar,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_txq *txq,
|
||||
struct ieee80211_sta *sta,
|
||||
struct sk_buff *skb, u16 airtime)
|
||||
{
|
||||
struct ieee80211_hdr *hdr = (void *)skb->data;
|
||||
@ -3583,6 +3585,7 @@ static void ath10k_mac_tx_h_fill_cb(struct ath10k *ar,
|
||||
const struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||
bool is_data = ieee80211_is_data(hdr->frame_control) ||
|
||||
ieee80211_is_data_qos(hdr->frame_control);
|
||||
struct ath10k_sta *arsta;
|
||||
|
||||
cb->flags = 0;
|
||||
if (!ath10k_tx_h_use_hwcrypto(vif, skb))
|
||||
@ -3607,6 +3610,12 @@ static void ath10k_mac_tx_h_fill_cb(struct ath10k *ar,
|
||||
cb->vif = vif;
|
||||
cb->txq = txq;
|
||||
cb->airtime_est = airtime;
|
||||
if (sta) {
|
||||
arsta = (struct ath10k_sta *)sta->drv_priv;
|
||||
spin_lock_bh(&ar->data_lock);
|
||||
cb->ucast_cipher = arsta->ucast_cipher;
|
||||
spin_unlock_bh(&ar->data_lock);
|
||||
}
|
||||
}
|
||||
|
||||
bool ath10k_mac_tx_frm_has_freq(struct ath10k *ar)
|
||||
@ -4078,7 +4087,7 @@ int ath10k_mac_tx_push_txq(struct ieee80211_hw *hw,
|
||||
}
|
||||
|
||||
airtime = ath10k_mac_update_airtime(ar, txq, skb);
|
||||
ath10k_mac_tx_h_fill_cb(ar, vif, txq, skb, airtime);
|
||||
ath10k_mac_tx_h_fill_cb(ar, vif, txq, sta, skb, airtime);
|
||||
|
||||
skb_len = skb->len;
|
||||
txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb);
|
||||
@ -4348,7 +4357,7 @@ static void ath10k_mac_op_tx(struct ieee80211_hw *hw,
|
||||
u16 airtime;
|
||||
|
||||
airtime = ath10k_mac_update_airtime(ar, txq, skb);
|
||||
ath10k_mac_tx_h_fill_cb(ar, vif, txq, skb, airtime);
|
||||
ath10k_mac_tx_h_fill_cb(ar, vif, txq, sta, skb, airtime);
|
||||
|
||||
txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb);
|
||||
txpath = ath10k_mac_tx_h_get_txpath(ar, skb, txmode);
|
||||
@ -6197,6 +6206,7 @@ static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
{
|
||||
struct ath10k *ar = hw->priv;
|
||||
struct ath10k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath10k_sta *arsta;
|
||||
struct ath10k_peer *peer;
|
||||
const u8 *peer_addr;
|
||||
bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
|
||||
@ -6221,12 +6231,17 @@ static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
|
||||
mutex_lock(&ar->conf_mutex);
|
||||
|
||||
if (sta)
|
||||
if (sta) {
|
||||
arsta = (struct ath10k_sta *)sta->drv_priv;
|
||||
peer_addr = sta->addr;
|
||||
else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
|
||||
spin_lock_bh(&ar->data_lock);
|
||||
arsta->ucast_cipher = key->cipher;
|
||||
spin_unlock_bh(&ar->data_lock);
|
||||
} else if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
|
||||
peer_addr = vif->bss_conf.bssid;
|
||||
else
|
||||
} else {
|
||||
peer_addr = vif->addr;
|
||||
}
|
||||
|
||||
key->hw_key_idx = key->keyidx;
|
||||
|
||||
|
@ -1926,6 +1926,7 @@ ath10k_wmi_op_gen_mgmt_tx(struct ath10k *ar, struct sk_buff *msdu)
|
||||
u32 vdev_id;
|
||||
u32 buf_len = msdu->len;
|
||||
u16 fc;
|
||||
const u8 *peer_addr;
|
||||
|
||||
hdr = (struct ieee80211_hdr *)msdu->data;
|
||||
fc = le16_to_cpu(hdr->frame_control);
|
||||
@ -1946,8 +1947,20 @@ ath10k_wmi_op_gen_mgmt_tx(struct ath10k *ar, struct sk_buff *msdu)
|
||||
ieee80211_is_deauth(hdr->frame_control) ||
|
||||
ieee80211_is_disassoc(hdr->frame_control)) &&
|
||||
ieee80211_has_protected(hdr->frame_control)) {
|
||||
len += IEEE80211_CCMP_MIC_LEN;
|
||||
buf_len += IEEE80211_CCMP_MIC_LEN;
|
||||
peer_addr = hdr->addr1;
|
||||
if (is_multicast_ether_addr(peer_addr)) {
|
||||
len += sizeof(struct ieee80211_mmie_16);
|
||||
buf_len += sizeof(struct ieee80211_mmie_16);
|
||||
} else {
|
||||
if (cb->ucast_cipher == WLAN_CIPHER_SUITE_GCMP ||
|
||||
cb->ucast_cipher == WLAN_CIPHER_SUITE_GCMP_256) {
|
||||
len += IEEE80211_GCMP_MIC_LEN;
|
||||
buf_len += IEEE80211_GCMP_MIC_LEN;
|
||||
} else {
|
||||
len += IEEE80211_CCMP_MIC_LEN;
|
||||
buf_len += IEEE80211_CCMP_MIC_LEN;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
len = round_up(len, 4);
|
||||
|
@ -3,6 +3,7 @@ config ATH11K
|
||||
tristate "Qualcomm Technologies 802.11ax chipset support"
|
||||
depends on MAC80211 && HAS_DMA
|
||||
depends on REMOTEPROC
|
||||
depends on CRYPTO_MICHAEL_MIC
|
||||
depends on ARCH_QCOM || COMPILE_TEST
|
||||
select ATH_COMMON
|
||||
select QCOM_QMI_HELPERS
|
||||
|
@ -458,7 +458,6 @@ static void ath11k_ahb_ext_grp_disable(struct ath11k_ext_irq_grp *irq_grp)
|
||||
|
||||
static void __ath11k_ahb_ext_irq_disable(struct ath11k_base *ab)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ATH11K_EXT_IRQ_GRP_NUM_MAX; i++) {
|
||||
@ -468,9 +467,6 @@ static void __ath11k_ahb_ext_irq_disable(struct ath11k_base *ab)
|
||||
|
||||
napi_synchronize(&irq_grp->napi);
|
||||
napi_disable(&irq_grp->napi);
|
||||
|
||||
while ((skb = __skb_dequeue(&irq_grp->pending_q)))
|
||||
dev_kfree_skb_any(skb);
|
||||
}
|
||||
}
|
||||
|
||||
@ -681,6 +677,9 @@ static irqreturn_t ath11k_ahb_ce_interrupt_handler(int irq, void *arg)
|
||||
{
|
||||
struct ath11k_ce_pipe *ce_pipe = arg;
|
||||
|
||||
/* last interrupt received for this CE */
|
||||
ce_pipe->timestamp = jiffies;
|
||||
|
||||
ath11k_ahb_ce_irq_disable(ce_pipe->ab, ce_pipe->pipe_num);
|
||||
|
||||
tasklet_schedule(&ce_pipe->intr_tq);
|
||||
@ -712,6 +711,9 @@ static irqreturn_t ath11k_ahb_ext_interrupt_handler(int irq, void *arg)
|
||||
{
|
||||
struct ath11k_ext_irq_grp *irq_grp = arg;
|
||||
|
||||
/* last interrupt received for this group */
|
||||
irq_grp->timestamp = jiffies;
|
||||
|
||||
ath11k_ahb_ext_grp_disable(irq_grp);
|
||||
|
||||
napi_schedule(&irq_grp->napi);
|
||||
@ -734,7 +736,6 @@ static int ath11k_ahb_ext_irq_config(struct ath11k_base *ab)
|
||||
init_dummy_netdev(&irq_grp->napi_ndev);
|
||||
netif_napi_add(&irq_grp->napi_ndev, &irq_grp->napi,
|
||||
ath11k_ahb_ext_grp_napi_poll, NAPI_POLL_WEIGHT);
|
||||
__skb_queue_head_init(&irq_grp->pending_q);
|
||||
|
||||
for (j = 0; j < ATH11K_EXT_IRQ_NUM_MAX; j++) {
|
||||
if (ath11k_tx_ring_mask[i] & BIT(j)) {
|
||||
|
@ -161,6 +161,7 @@ struct ath11k_ce_pipe {
|
||||
struct ath11k_ce_ring *src_ring;
|
||||
struct ath11k_ce_ring *dest_ring;
|
||||
struct ath11k_ce_ring *status_ring;
|
||||
u64 timestamp;
|
||||
};
|
||||
|
||||
struct ath11k_ce {
|
||||
|
@ -77,6 +77,8 @@ struct ath11k_skb_rxcb {
|
||||
u8 err_code;
|
||||
u8 mac_id;
|
||||
u8 unmapped;
|
||||
u8 is_frag;
|
||||
u8 tid;
|
||||
};
|
||||
|
||||
enum ath11k_hw_rev {
|
||||
@ -109,12 +111,9 @@ struct ath11k_ext_irq_grp {
|
||||
u32 irqs[ATH11K_EXT_IRQ_NUM_MAX];
|
||||
u32 num_irq;
|
||||
u32 grp_id;
|
||||
u64 timestamp;
|
||||
struct napi_struct napi;
|
||||
struct net_device napi_ndev;
|
||||
/* Queue of pending packets, not expected to be accessed concurrently
|
||||
* to avoid locking overhead.
|
||||
*/
|
||||
struct sk_buff_head pending_q;
|
||||
};
|
||||
|
||||
#define HEHANDLE_CAP_PHYINFO_SIZE 3
|
||||
@ -332,6 +331,7 @@ struct ath11k_sta {
|
||||
u32 bw;
|
||||
u32 nss;
|
||||
u32 smps;
|
||||
enum hal_pn_type pn_type;
|
||||
|
||||
struct work_struct update_wk;
|
||||
struct rate_info txrate;
|
||||
|
@ -53,6 +53,8 @@ enum ath11k_dbg_htt_ext_stats_type {
|
||||
ATH11K_DBG_HTT_EXT_STATS_TWT_SESSIONS = 20,
|
||||
ATH11K_DBG_HTT_EXT_STATS_REO_RESOURCE_STATS = 21,
|
||||
ATH11K_DBG_HTT_EXT_STATS_TX_SOUNDING_INFO = 22,
|
||||
ATH11K_DBG_HTT_EXT_STATS_PDEV_OBSS_PD_STATS = 23,
|
||||
ATH11K_DBG_HTT_EXT_STATS_RING_BACKPRESSURE_STATS = 24,
|
||||
|
||||
/* keep this last */
|
||||
ATH11K_DBG_HTT_NUM_EXT_STATS,
|
||||
|
@ -3854,6 +3854,47 @@ htt_print_pdev_obss_pd_stats_tlv_v(const void *tag_buf,
|
||||
stats_req->buf_len = len;
|
||||
}
|
||||
|
||||
static inline void htt_print_backpressure_stats_tlv_v(const u32 *tag_buf,
|
||||
u8 *data)
|
||||
{
|
||||
struct debug_htt_stats_req *stats_req =
|
||||
(struct debug_htt_stats_req *)data;
|
||||
struct htt_ring_backpressure_stats_tlv *htt_stats_buf =
|
||||
(struct htt_ring_backpressure_stats_tlv *)tag_buf;
|
||||
int i;
|
||||
u8 *buf = stats_req->buf;
|
||||
u32 len = stats_req->buf_len;
|
||||
u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE;
|
||||
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "pdev_id = %u",
|
||||
htt_stats_buf->pdev_id);
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "current_head_idx = %u",
|
||||
htt_stats_buf->current_head_idx);
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "current_tail_idx = %u",
|
||||
htt_stats_buf->current_tail_idx);
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len, "num_htt_msgs_sent = %u",
|
||||
htt_stats_buf->num_htt_msgs_sent);
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len,
|
||||
"backpressure_time_ms = %u",
|
||||
htt_stats_buf->backpressure_time_ms);
|
||||
|
||||
for (i = 0; i < 5; i++)
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len,
|
||||
"backpressure_hist_%u = %u",
|
||||
i + 1, htt_stats_buf->backpressure_hist[i]);
|
||||
|
||||
len += HTT_DBG_OUT(buf + len, buf_len - len,
|
||||
"============================");
|
||||
|
||||
if (len >= buf_len) {
|
||||
buf[buf_len - 1] = 0;
|
||||
stats_req->buf_len = buf_len - 1;
|
||||
} else {
|
||||
buf[len] = 0;
|
||||
stats_req->buf_len = len;
|
||||
}
|
||||
}
|
||||
|
||||
static inline void htt_htt_stats_debug_dump(const u32 *tag_buf,
|
||||
struct debug_htt_stats_req *stats_req)
|
||||
{
|
||||
@ -4246,6 +4287,9 @@ static int ath11k_dbg_htt_ext_stats_parse(struct ath11k_base *ab,
|
||||
case HTT_STATS_PDEV_OBSS_PD_TAG:
|
||||
htt_print_pdev_obss_pd_stats_tlv_v(tag_buf, stats_req);
|
||||
break;
|
||||
case HTT_STATS_RING_BACKPRESSURE_STATS_TAG:
|
||||
htt_print_backpressure_stats_tlv_v(tag_buf, user_data);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -100,6 +100,8 @@ enum htt_tlv_tag_t {
|
||||
HTT_STATS_SCHED_TXQ_SCHED_ORDER_SU_TAG = 86,
|
||||
HTT_STATS_SCHED_TXQ_SCHED_INELIGIBILITY_TAG = 87,
|
||||
HTT_STATS_PDEV_OBSS_PD_TAG = 88,
|
||||
HTT_STATS_HW_WAR_TAG = 89,
|
||||
HTT_STATS_RING_BACKPRESSURE_STATS_TAG = 90,
|
||||
|
||||
HTT_STATS_MAX_TAG,
|
||||
};
|
||||
@ -1659,4 +1661,30 @@ struct htt_pdev_obss_pd_stats_tlv {
|
||||
};
|
||||
|
||||
void ath11k_debug_htt_stats_init(struct ath11k *ar);
|
||||
|
||||
struct htt_ring_backpressure_stats_tlv {
|
||||
u32 pdev_id;
|
||||
u32 current_head_idx;
|
||||
u32 current_tail_idx;
|
||||
u32 num_htt_msgs_sent;
|
||||
/* Time in milliseconds for which the ring has been in
|
||||
* its current backpressure condition
|
||||
*/
|
||||
u32 backpressure_time_ms;
|
||||
/* backpressure_hist - histogram showing how many times
|
||||
* different degrees of backpressure duration occurred:
|
||||
* Index 0 indicates the number of times ring was
|
||||
* continuously in backpressure state for 100 - 200ms.
|
||||
* Index 1 indicates the number of times ring was
|
||||
* continuously in backpressure state for 200 - 300ms.
|
||||
* Index 2 indicates the number of times ring was
|
||||
* continuously in backpressure state for 300 - 400ms.
|
||||
* Index 3 indicates the number of times ring was
|
||||
* continuously in backpressure state for 400 - 500ms.
|
||||
* Index 4 indicates the number of times ring was
|
||||
* continuously in backpressure state beyond 500ms.
|
||||
*/
|
||||
u32 backpressure_hist[5];
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -219,6 +219,9 @@ static ssize_t ath11k_dbg_sta_dump_tx_stats(struct file *file,
|
||||
const int size = 2 * 4096;
|
||||
char *buf;
|
||||
|
||||
if (!arsta->tx_stats)
|
||||
return -ENOENT;
|
||||
|
||||
buf = kzalloc(size, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
@ -3,6 +3,7 @@
|
||||
* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <crypto/hash.h>
|
||||
#include "core.h"
|
||||
#include "dp_tx.h"
|
||||
#include "hal_tx.h"
|
||||
@ -33,6 +34,7 @@ void ath11k_dp_peer_cleanup(struct ath11k *ar, int vdev_id, const u8 *addr)
|
||||
}
|
||||
|
||||
ath11k_peer_rx_tid_cleanup(ar, peer);
|
||||
crypto_free_shash(peer->tfm_mmic);
|
||||
spin_unlock_bh(&ab->base_lock);
|
||||
}
|
||||
|
||||
@ -56,8 +58,8 @@ int ath11k_dp_peer_setup(struct ath11k *ar, int vdev_id, const u8 *addr)
|
||||
}
|
||||
|
||||
for (tid = 0; tid <= IEEE80211_NUM_TIDS; tid++) {
|
||||
ret = ath11k_peer_rx_tid_setup(ar, addr, vdev_id,
|
||||
tid, 1, 0);
|
||||
ret = ath11k_peer_rx_tid_setup(ar, addr, vdev_id, tid, 1, 0,
|
||||
HAL_PN_TYPE_NONE);
|
||||
if (ret) {
|
||||
ath11k_warn(ab, "failed to setup rxd tid queue for tid %d: %d\n",
|
||||
tid, ret);
|
||||
@ -65,6 +67,12 @@ int ath11k_dp_peer_setup(struct ath11k *ar, int vdev_id, const u8 *addr)
|
||||
}
|
||||
}
|
||||
|
||||
ret = ath11k_peer_rx_frag_setup(ar, addr, vdev_id);
|
||||
if (ret) {
|
||||
ath11k_warn(ab, "failed to setup rx defrag context\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* TODO: Setup other peer specific resource used in data path */
|
||||
|
||||
return 0;
|
||||
@ -210,6 +218,7 @@ static int ath11k_dp_srng_common_setup(struct ath11k_base *ab)
|
||||
struct ath11k_dp *dp = &ab->dp;
|
||||
struct hal_srng *srng;
|
||||
int i, ret;
|
||||
u32 ring_hash_map;
|
||||
|
||||
ret = ath11k_dp_srng_setup(ab, &dp->wbm_desc_rel_ring,
|
||||
HAL_SW2WBM_RELEASE, 0, 0,
|
||||
@ -297,7 +306,21 @@ static int ath11k_dp_srng_common_setup(struct ath11k_base *ab)
|
||||
goto err;
|
||||
}
|
||||
|
||||
ath11k_hal_reo_hw_setup(ab);
|
||||
/* When hash based routing of rx packet is enabled, 32 entries to map
|
||||
* the hash values to the ring will be configured. Each hash entry uses
|
||||
* three bits to map to a particular ring. The ring mapping will be
|
||||
* 0:TCL, 1:SW1, 2:SW2, 3:SW3, 4:SW4, 5:Release, 6:FW and 7:Not used.
|
||||
*/
|
||||
ring_hash_map = HAL_HASH_ROUTING_RING_SW1 << 0 |
|
||||
HAL_HASH_ROUTING_RING_SW2 << 3 |
|
||||
HAL_HASH_ROUTING_RING_SW3 << 6 |
|
||||
HAL_HASH_ROUTING_RING_SW4 << 9 |
|
||||
HAL_HASH_ROUTING_RING_SW1 << 12 |
|
||||
HAL_HASH_ROUTING_RING_SW2 << 15 |
|
||||
HAL_HASH_ROUTING_RING_SW3 << 18 |
|
||||
HAL_HASH_ROUTING_RING_SW4 << 21;
|
||||
|
||||
ath11k_hal_reo_hw_setup(ab, ring_hash_map);
|
||||
|
||||
return 0;
|
||||
|
||||
@ -627,17 +650,13 @@ int ath11k_dp_service_srng(struct ath11k_base *ab,
|
||||
}
|
||||
|
||||
if (ath11k_rx_ring_mask[grp_id]) {
|
||||
for (i = 0; i < ab->num_radios; i++) {
|
||||
if (ath11k_rx_ring_mask[grp_id] & BIT(i)) {
|
||||
work_done = ath11k_dp_process_rx(ab, i, napi,
|
||||
&irq_grp->pending_q,
|
||||
budget);
|
||||
budget -= work_done;
|
||||
tot_work_done += work_done;
|
||||
}
|
||||
if (budget <= 0)
|
||||
goto done;
|
||||
}
|
||||
i = fls(ath11k_rx_ring_mask[grp_id]) - 1;
|
||||
work_done = ath11k_dp_process_rx(ab, i, napi,
|
||||
budget);
|
||||
budget -= work_done;
|
||||
tot_work_done += work_done;
|
||||
if (budget <= 0)
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (rx_mon_status_ring_mask[grp_id]) {
|
||||
|
@ -22,6 +22,18 @@ struct dp_rx_tid {
|
||||
u32 size;
|
||||
u32 ba_win_sz;
|
||||
bool active;
|
||||
|
||||
/* Info related to rx fragments */
|
||||
u32 cur_sn;
|
||||
u16 last_frag_no;
|
||||
u16 rx_frag_bitmap;
|
||||
|
||||
struct sk_buff_head rx_frags;
|
||||
struct hal_reo_dest_ring *dst_ring_desc;
|
||||
|
||||
/* Timer info related to fragments */
|
||||
struct timer_list frag_timer;
|
||||
struct ath11k_base *ab;
|
||||
};
|
||||
|
||||
#define DP_REO_DESC_FREE_TIMEOUT_MS 1000
|
||||
@ -128,7 +140,6 @@ struct ath11k_pdev_dp {
|
||||
u32 mac_id;
|
||||
atomic_t num_tx_pending;
|
||||
wait_queue_head_t tx_empty_waitq;
|
||||
struct dp_srng reo_dst_ring;
|
||||
struct dp_rxdma_ring rx_refill_buf_ring;
|
||||
struct dp_srng rxdma_err_dst_ring;
|
||||
struct dp_srng rxdma_mon_dst_ring;
|
||||
@ -148,7 +159,7 @@ struct ath11k_pdev_dp {
|
||||
#define DP_AVG_MPDUS_PER_TID_MAX 128
|
||||
#define DP_AVG_MSDUS_PER_MPDU 4
|
||||
|
||||
#define DP_RX_HASH_ENABLE 0 /* Disable hash based Rx steering */
|
||||
#define DP_RX_HASH_ENABLE 1 /* Enable hash based Rx steering */
|
||||
|
||||
#define DP_BA_WIN_SZ_MAX 256
|
||||
|
||||
@ -206,6 +217,7 @@ struct ath11k_dp {
|
||||
struct dp_srng reo_except_ring;
|
||||
struct dp_srng reo_cmd_ring;
|
||||
struct dp_srng reo_status_ring;
|
||||
struct dp_srng reo_dst_ring[DP_REO_DST_RING_MAX];
|
||||
struct dp_tx_ring tx_ring[DP_TCL_NUM_RING_MAX];
|
||||
struct hal_wbm_idle_scatter_list scatter_list[DP_IDLE_SCATTER_BUFS_MAX];
|
||||
struct list_head reo_cmd_list;
|
||||
@ -924,6 +936,7 @@ enum htt_t2h_msg_type {
|
||||
HTT_T2H_MSG_TYPE_PEER_UNMAP = 0x1f,
|
||||
HTT_T2H_MSG_TYPE_PPDU_STATS_IND = 0x1d,
|
||||
HTT_T2H_MSG_TYPE_EXT_STATS_CONF = 0x1c,
|
||||
HTT_T2H_MSG_TYPE_BKPRESSURE_EVENT_IND = 0x24,
|
||||
};
|
||||
|
||||
#define HTT_TARGET_VERSION_MAJOR 3
|
||||
@ -972,6 +985,13 @@ struct htt_resp_msg {
|
||||
};
|
||||
} __packed;
|
||||
|
||||
#define HTT_BACKPRESSURE_EVENT_PDEV_ID_M GENMASK(15, 8)
|
||||
#define HTT_BACKPRESSURE_EVENT_RING_TYPE_M GENMASK(23, 16)
|
||||
#define HTT_BACKPRESSURE_EVENT_RING_ID_M GENMASK(31, 24)
|
||||
|
||||
#define HTT_BACKPRESSURE_EVENT_HP_M GENMASK(15, 0)
|
||||
#define HTT_BACKPRESSURE_EVENT_TP_M GENMASK(31, 16)
|
||||
|
||||
/* ppdu stats
|
||||
*
|
||||
* @details
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -9,6 +9,8 @@
|
||||
#include "rx_desc.h"
|
||||
#include "debug.h"
|
||||
|
||||
#define DP_MAX_NWIFI_HDR_LEN 30
|
||||
|
||||
#define DP_RX_MPDU_ERR_FCS BIT(0)
|
||||
#define DP_RX_MPDU_ERR_DECRYPT BIT(1)
|
||||
#define DP_RX_MPDU_ERR_TKIP_MIC BIT(2)
|
||||
@ -43,11 +45,16 @@ int ath11k_dp_rx_ampdu_start(struct ath11k *ar,
|
||||
struct ieee80211_ampdu_params *params);
|
||||
int ath11k_dp_rx_ampdu_stop(struct ath11k *ar,
|
||||
struct ieee80211_ampdu_params *params);
|
||||
int ath11k_dp_peer_rx_pn_replay_config(struct ath11k_vif *arvif,
|
||||
const u8 *peer_addr,
|
||||
enum set_key_cmd key_cmd,
|
||||
struct ieee80211_key_conf *key);
|
||||
void ath11k_peer_rx_tid_cleanup(struct ath11k *ar, struct ath11k_peer *peer);
|
||||
void ath11k_peer_rx_tid_delete(struct ath11k *ar,
|
||||
struct ath11k_peer *peer, u8 tid);
|
||||
int ath11k_peer_rx_tid_setup(struct ath11k *ar, const u8 *peer_mac, int vdev_id,
|
||||
u8 tid, u32 ba_win_sz, u16 ssn);
|
||||
u8 tid, u32 ba_win_sz, u16 ssn,
|
||||
enum hal_pn_type pn_type);
|
||||
void ath11k_dp_htt_htc_t2h_msg_handler(struct ath11k_base *ab,
|
||||
struct sk_buff *skb);
|
||||
int ath11k_dp_pdev_reo_setup(struct ath11k_base *ab);
|
||||
@ -62,7 +69,7 @@ int ath11k_dp_rx_process_wbm_err(struct ath11k_base *ab,
|
||||
int ath11k_dp_process_rx_err(struct ath11k_base *ab, struct napi_struct *napi,
|
||||
int budget);
|
||||
int ath11k_dp_process_rx(struct ath11k_base *ab, int mac_id,
|
||||
struct napi_struct *napi, struct sk_buff_head *pending_q,
|
||||
struct napi_struct *napi,
|
||||
int budget);
|
||||
int ath11k_dp_rxbufs_replenish(struct ath11k_base *ab, int mac_id,
|
||||
struct dp_rxdma_ring *rx_ring,
|
||||
@ -84,5 +91,6 @@ int ath11k_dp_rx_mon_status_bufs_replenish(struct ath11k_base *ab, int mac_id,
|
||||
gfp_t gfp);
|
||||
int ath11k_dp_rx_pdev_mon_detach(struct ath11k *ar);
|
||||
int ath11k_dp_rx_pdev_mon_attach(struct ath11k *ar);
|
||||
int ath11k_peer_rx_frag_setup(struct ath11k *ar, const u8 *peer_mac, int vdev_id);
|
||||
|
||||
#endif /* ATH11K_DP_RX_H */
|
||||
|
@ -47,7 +47,7 @@ static u8 ath11k_dp_tx_get_tid(struct sk_buff *skb)
|
||||
return skb->priority & IEEE80211_QOS_CTL_TID_MASK;
|
||||
}
|
||||
|
||||
static enum hal_encrypt_type ath11k_dp_tx_get_encrypt_type(u32 cipher)
|
||||
enum hal_encrypt_type ath11k_dp_tx_get_encrypt_type(u32 cipher)
|
||||
{
|
||||
switch (cipher) {
|
||||
case WLAN_CIPHER_SUITE_WEP40:
|
||||
|
@ -877,23 +877,32 @@ void ath11k_hal_srng_access_end(struct ath11k_base *ab, struct hal_srng *srng)
|
||||
/* For LMAC rings, ring pointer updates are done through FW and
|
||||
* hence written to a shared memory location that is read by FW
|
||||
*/
|
||||
if (srng->ring_dir == HAL_SRNG_DIR_SRC)
|
||||
if (srng->ring_dir == HAL_SRNG_DIR_SRC) {
|
||||
srng->u.src_ring.last_tp =
|
||||
*(volatile u32 *)srng->u.src_ring.tp_addr;
|
||||
*srng->u.src_ring.hp_addr = srng->u.src_ring.hp;
|
||||
else
|
||||
} else {
|
||||
srng->u.dst_ring.last_hp = *srng->u.dst_ring.hp_addr;
|
||||
*srng->u.dst_ring.tp_addr = srng->u.dst_ring.tp;
|
||||
}
|
||||
} else {
|
||||
if (srng->ring_dir == HAL_SRNG_DIR_SRC) {
|
||||
srng->u.src_ring.last_tp =
|
||||
*(volatile u32 *)srng->u.src_ring.tp_addr;
|
||||
ath11k_ahb_write32(ab,
|
||||
(unsigned long)srng->u.src_ring.hp_addr -
|
||||
(unsigned long)ab->mem,
|
||||
srng->u.src_ring.hp);
|
||||
} else {
|
||||
srng->u.dst_ring.last_hp = *srng->u.dst_ring.hp_addr;
|
||||
ath11k_ahb_write32(ab,
|
||||
(unsigned long)srng->u.dst_ring.tp_addr -
|
||||
(unsigned long)ab->mem,
|
||||
srng->u.dst_ring.tp);
|
||||
}
|
||||
}
|
||||
|
||||
srng->timestamp = jiffies;
|
||||
}
|
||||
|
||||
void ath11k_hal_setup_link_idle_list(struct ath11k_base *ab,
|
||||
@ -1017,6 +1026,7 @@ int ath11k_hal_srng_setup(struct ath11k_base *ab, enum hal_ring_type type,
|
||||
params->intr_batch_cntr_thres_entries;
|
||||
srng->intr_timer_thres_us = params->intr_timer_thres_us;
|
||||
srng->flags = params->flags;
|
||||
srng->initialized = 1;
|
||||
spin_lock_init(&srng->lock);
|
||||
|
||||
for (i = 0; i < HAL_SRNG_NUM_REG_GRP; i++) {
|
||||
@ -1122,3 +1132,55 @@ void ath11k_hal_srng_deinit(struct ath11k_base *ab)
|
||||
ath11k_hal_free_cont_rdp(ab);
|
||||
ath11k_hal_free_cont_wrp(ab);
|
||||
}
|
||||
|
||||
void ath11k_hal_dump_srng_stats(struct ath11k_base *ab)
|
||||
{
|
||||
struct hal_srng *srng;
|
||||
struct ath11k_ext_irq_grp *irq_grp;
|
||||
struct ath11k_ce_pipe *ce_pipe;
|
||||
int i;
|
||||
|
||||
ath11k_err(ab, "Last interrupt received for each CE:\n");
|
||||
for (i = 0; i < CE_COUNT; i++) {
|
||||
ce_pipe = &ab->ce.ce_pipe[i];
|
||||
|
||||
if (ath11k_ce_get_attr_flags(i) & CE_ATTR_DIS_INTR)
|
||||
continue;
|
||||
|
||||
ath11k_err(ab, "CE_id %d pipe_num %d %ums before\n",
|
||||
i, ce_pipe->pipe_num,
|
||||
jiffies_to_msecs(jiffies - ce_pipe->timestamp));
|
||||
}
|
||||
|
||||
ath11k_err(ab, "\nLast interrupt received for each group:\n");
|
||||
for (i = 0; i < ATH11K_EXT_IRQ_GRP_NUM_MAX; i++) {
|
||||
irq_grp = &ab->ext_irq_grp[i];
|
||||
ath11k_err(ab, "group_id %d %ums before\n",
|
||||
irq_grp->grp_id,
|
||||
jiffies_to_msecs(jiffies - irq_grp->timestamp));
|
||||
}
|
||||
|
||||
for (i = 0; i < HAL_SRNG_RING_ID_MAX; i++) {
|
||||
srng = &ab->hal.srng_list[i];
|
||||
|
||||
if (!srng->initialized)
|
||||
continue;
|
||||
|
||||
if (srng->ring_dir == HAL_SRNG_DIR_SRC)
|
||||
ath11k_err(ab,
|
||||
"src srng id %u hp %u, reap_hp %u, cur tp %u, cached tp %u last tp %u napi processed before %ums\n",
|
||||
srng->ring_id, srng->u.src_ring.hp,
|
||||
srng->u.src_ring.reap_hp,
|
||||
*srng->u.src_ring.tp_addr, srng->u.src_ring.cached_tp,
|
||||
srng->u.src_ring.last_tp,
|
||||
jiffies_to_msecs(jiffies - srng->timestamp));
|
||||
else if (srng->ring_dir == HAL_SRNG_DIR_DST)
|
||||
ath11k_err(ab,
|
||||
"dst srng id %u tp %u, cur hp %u, cached hp %u last hp %u napi processed before %ums\n",
|
||||
srng->ring_id, srng->u.dst_ring.tp,
|
||||
*srng->u.dst_ring.hp_addr,
|
||||
srng->u.dst_ring.cached_hp,
|
||||
srng->u.dst_ring.last_hp,
|
||||
jiffies_to_msecs(jiffies - srng->timestamp));
|
||||
}
|
||||
}
|
||||
|
@ -96,6 +96,8 @@ struct ath11k_base;
|
||||
|
||||
/* REO2SW(x) R0 ring configuration address */
|
||||
#define HAL_REO1_GEN_ENABLE 0x00000000
|
||||
#define HAL_REO1_DEST_RING_CTRL_IX_0 0x00000004
|
||||
#define HAL_REO1_DEST_RING_CTRL_IX_1 0x00000008
|
||||
#define HAL_REO1_DEST_RING_CTRL_IX_2 0x0000000c
|
||||
#define HAL_REO1_DEST_RING_CTRL_IX_3 0x00000010
|
||||
#define HAL_REO1_RING_BASE_LSB 0x0000029c
|
||||
@ -529,6 +531,8 @@ struct hal_srng {
|
||||
*/
|
||||
u32 hwreg_base[HAL_SRNG_NUM_REG_GRP];
|
||||
|
||||
u64 timestamp;
|
||||
|
||||
/* Source or Destination ring */
|
||||
enum hal_srng_dir ring_dir;
|
||||
|
||||
@ -554,6 +558,9 @@ struct hal_srng {
|
||||
|
||||
/* max transfer size */
|
||||
u16 max_buffer_length;
|
||||
|
||||
/* head pointer at access end */
|
||||
u32 last_hp;
|
||||
} dst_ring;
|
||||
|
||||
struct {
|
||||
@ -577,6 +584,9 @@ struct hal_srng {
|
||||
|
||||
/* Low threshold - in number of ring entries */
|
||||
u32 low_threshold;
|
||||
|
||||
/* tail pointer at access end */
|
||||
u32 last_tp;
|
||||
} src_ring;
|
||||
} u;
|
||||
};
|
||||
@ -717,6 +727,14 @@ enum hal_ce_desc {
|
||||
HAL_CE_DESC_DST_STATUS,
|
||||
};
|
||||
|
||||
#define HAL_HASH_ROUTING_RING_TCL 0
|
||||
#define HAL_HASH_ROUTING_RING_SW1 1
|
||||
#define HAL_HASH_ROUTING_RING_SW2 2
|
||||
#define HAL_HASH_ROUTING_RING_SW3 3
|
||||
#define HAL_HASH_ROUTING_RING_SW4 4
|
||||
#define HAL_HASH_ROUTING_RING_REL 5
|
||||
#define HAL_HASH_ROUTING_RING_FW 6
|
||||
|
||||
struct hal_reo_status_header {
|
||||
u16 cmd_num;
|
||||
enum hal_reo_cmd_status cmd_status;
|
||||
@ -847,10 +865,10 @@ struct ath11k_hal {
|
||||
|
||||
u32 ath11k_hal_reo_qdesc_size(u32 ba_window_size, u8 tid);
|
||||
void ath11k_hal_reo_qdesc_setup(void *vaddr, int tid, u32 ba_window_size,
|
||||
u32 start_seqtype);
|
||||
u32 start_seq, enum hal_pn_type type);
|
||||
void ath11k_hal_reo_init_cmd_ring(struct ath11k_base *ab,
|
||||
struct hal_srng *srng);
|
||||
void ath11k_hal_reo_hw_setup(struct ath11k_base *ab);
|
||||
void ath11k_hal_reo_hw_setup(struct ath11k_base *ab, u32 ring_hash_map);
|
||||
void ath11k_hal_setup_link_idle_list(struct ath11k_base *ab,
|
||||
struct hal_wbm_idle_scatter_list *sbuf,
|
||||
u32 nsbufs, u32 tot_link_desc,
|
||||
@ -893,5 +911,6 @@ int ath11k_hal_srng_setup(struct ath11k_base *ab, enum hal_ring_type type,
|
||||
struct hal_srng_params *params);
|
||||
int ath11k_hal_srng_init(struct ath11k_base *ath11k);
|
||||
void ath11k_hal_srng_deinit(struct ath11k_base *ath11k);
|
||||
void ath11k_hal_dump_srng_stats(struct ath11k_base *ab);
|
||||
|
||||
#endif
|
||||
|
@ -694,7 +694,7 @@ u32 ath11k_hal_reo_qdesc_size(u32 ba_window_size, u8 tid)
|
||||
}
|
||||
|
||||
void ath11k_hal_reo_qdesc_setup(void *vaddr, int tid, u32 ba_window_size,
|
||||
u32 start_seq)
|
||||
u32 start_seq, enum hal_pn_type type)
|
||||
{
|
||||
struct hal_rx_reo_queue *qdesc = (struct hal_rx_reo_queue *)vaddr;
|
||||
struct hal_rx_reo_queue_ext *ext_desc;
|
||||
@ -723,6 +723,18 @@ void ath11k_hal_reo_qdesc_setup(void *vaddr, int tid, u32 ba_window_size,
|
||||
|
||||
qdesc->info0 |= FIELD_PREP(HAL_RX_REO_QUEUE_INFO0_BA_WINDOW_SIZE,
|
||||
ba_window_size - 1);
|
||||
switch (type) {
|
||||
case HAL_PN_TYPE_NONE:
|
||||
case HAL_PN_TYPE_WAPI_EVEN:
|
||||
case HAL_PN_TYPE_WAPI_UNEVEN:
|
||||
break;
|
||||
case HAL_PN_TYPE_WPA:
|
||||
qdesc->info0 |=
|
||||
FIELD_PREP(HAL_RX_REO_QUEUE_INFO0_PN_CHECK, 1) |
|
||||
FIELD_PREP(HAL_RX_REO_QUEUE_INFO0_PN_SIZE,
|
||||
HAL_RX_REO_QUEUE_PN_SIZE_48);
|
||||
break;
|
||||
}
|
||||
|
||||
/* TODO: Set Ignore ampdu flags based on BA window size and/or
|
||||
* AMPDU capabilities
|
||||
@ -787,7 +799,7 @@ void ath11k_hal_reo_init_cmd_ring(struct ath11k_base *ab,
|
||||
}
|
||||
}
|
||||
|
||||
void ath11k_hal_reo_hw_setup(struct ath11k_base *ab)
|
||||
void ath11k_hal_reo_hw_setup(struct ath11k_base *ab, u32 ring_hash_map)
|
||||
{
|
||||
u32 reo_base = HAL_SEQ_WCSS_UMAC_REO_REG;
|
||||
u32 val;
|
||||
@ -809,6 +821,19 @@ void ath11k_hal_reo_hw_setup(struct ath11k_base *ab)
|
||||
HAL_DEFAULT_REO_TIMEOUT_USEC);
|
||||
ath11k_ahb_write32(ab, reo_base + HAL_REO1_AGING_THRESH_IX_3,
|
||||
HAL_DEFAULT_REO_TIMEOUT_USEC);
|
||||
|
||||
ath11k_ahb_write32(ab, reo_base + HAL_REO1_DEST_RING_CTRL_IX_0,
|
||||
FIELD_PREP(HAL_REO_DEST_RING_CTRL_HASH_RING_MAP,
|
||||
ring_hash_map));
|
||||
ath11k_ahb_write32(ab, reo_base + HAL_REO1_DEST_RING_CTRL_IX_1,
|
||||
FIELD_PREP(HAL_REO_DEST_RING_CTRL_HASH_RING_MAP,
|
||||
ring_hash_map));
|
||||
ath11k_ahb_write32(ab, reo_base + HAL_REO1_DEST_RING_CTRL_IX_2,
|
||||
FIELD_PREP(HAL_REO_DEST_RING_CTRL_HASH_RING_MAP,
|
||||
ring_hash_map));
|
||||
ath11k_ahb_write32(ab, reo_base + HAL_REO1_DEST_RING_CTRL_IX_3,
|
||||
FIELD_PREP(HAL_REO_DEST_RING_CTRL_HASH_RING_MAP,
|
||||
ring_hash_map));
|
||||
}
|
||||
|
||||
static enum hal_rx_mon_status
|
||||
|
@ -62,6 +62,7 @@
|
||||
#define TARGET_RX_BATCHMODE 1
|
||||
|
||||
#define ATH11K_HW_MAX_QUEUES 4
|
||||
#define ATH11K_QUEUE_LEN 4096
|
||||
|
||||
#define ATH11k_HW_RATECODE_CCK_SHORT_PREAM_MASK 0x4
|
||||
|
||||
|
@ -1956,6 +1956,31 @@ static void ath11k_mac_op_bss_info_changed(struct ieee80211_hw *hw,
|
||||
ath11k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id,
|
||||
&info->he_obss_pd);
|
||||
|
||||
if (changed & BSS_CHANGED_HE_BSS_COLOR) {
|
||||
if (vif->type == NL80211_IFTYPE_AP) {
|
||||
ret = ath11k_wmi_send_obss_color_collision_cfg_cmd(
|
||||
ar, arvif->vdev_id, info->he_bss_color.color,
|
||||
ATH11K_BSS_COLOR_COLLISION_DETECTION_AP_PERIOD_MS,
|
||||
!info->he_bss_color.disabled);
|
||||
if (ret)
|
||||
ath11k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
|
||||
arvif->vdev_id, ret);
|
||||
} else if (vif->type == NL80211_IFTYPE_STATION) {
|
||||
ret = ath11k_wmi_send_bss_color_change_enable_cmd(ar,
|
||||
arvif->vdev_id,
|
||||
1);
|
||||
if (ret)
|
||||
ath11k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n",
|
||||
arvif->vdev_id, ret);
|
||||
ret = ath11k_wmi_send_obss_color_collision_cfg_cmd(
|
||||
ar, arvif->vdev_id, 0,
|
||||
ATH11K_BSS_COLOR_COLLISION_DETECTION_STA_PERIOD_MS, 1);
|
||||
if (ret)
|
||||
ath11k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
|
||||
arvif->vdev_id, ret);
|
||||
}
|
||||
}
|
||||
|
||||
mutex_unlock(&ar->conf_mutex);
|
||||
}
|
||||
|
||||
@ -2325,6 +2350,7 @@ static int ath11k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
struct ath11k_base *ab = ar->ab;
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
struct ath11k_peer *peer;
|
||||
struct ath11k_sta *arsta;
|
||||
const u8 *peer_addr;
|
||||
int ret = 0;
|
||||
u32 flags = 0;
|
||||
@ -2382,15 +2408,53 @@ static int ath11k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
goto exit;
|
||||
}
|
||||
|
||||
ret = ath11k_dp_peer_rx_pn_replay_config(arvif, peer_addr, cmd, key);
|
||||
if (ret) {
|
||||
ath11k_warn(ab, "failed to offload PN replay detection %d\n", ret);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
spin_lock_bh(&ab->base_lock);
|
||||
peer = ath11k_peer_find(ab, arvif->vdev_id, peer_addr);
|
||||
if (peer && cmd == SET_KEY)
|
||||
if (peer && cmd == SET_KEY) {
|
||||
peer->keys[key->keyidx] = key;
|
||||
else if (peer && cmd == DISABLE_KEY)
|
||||
if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
|
||||
peer->ucast_keyidx = key->keyidx;
|
||||
peer->sec_type = ath11k_dp_tx_get_encrypt_type(key->cipher);
|
||||
} else {
|
||||
peer->mcast_keyidx = key->keyidx;
|
||||
peer->sec_type_grp = ath11k_dp_tx_get_encrypt_type(key->cipher);
|
||||
}
|
||||
} else if (peer && cmd == DISABLE_KEY) {
|
||||
peer->keys[key->keyidx] = NULL;
|
||||
else if (!peer)
|
||||
if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
|
||||
peer->ucast_keyidx = 0;
|
||||
else
|
||||
peer->mcast_keyidx = 0;
|
||||
} else if (!peer)
|
||||
/* impossible unless FW goes crazy */
|
||||
ath11k_warn(ab, "peer %pM disappeared!\n", peer_addr);
|
||||
|
||||
if (sta) {
|
||||
arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
|
||||
switch (key->cipher) {
|
||||
case WLAN_CIPHER_SUITE_TKIP:
|
||||
case WLAN_CIPHER_SUITE_CCMP:
|
||||
case WLAN_CIPHER_SUITE_CCMP_256:
|
||||
case WLAN_CIPHER_SUITE_GCMP:
|
||||
case WLAN_CIPHER_SUITE_GCMP_256:
|
||||
if (cmd == SET_KEY)
|
||||
arsta->pn_type = HAL_PN_TYPE_WPA;
|
||||
else
|
||||
arsta->pn_type = HAL_PN_TYPE_NONE;
|
||||
break;
|
||||
default:
|
||||
arsta->pn_type = HAL_PN_TYPE_NONE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
spin_unlock_bh(&ab->base_lock);
|
||||
|
||||
exit:
|
||||
@ -3914,6 +3978,9 @@ static int ath11k_mac_op_start(struct ieee80211_hw *hw)
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* Configure the hash seed for hash based reo dest ring selection */
|
||||
ath11k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id);
|
||||
|
||||
mutex_unlock(&ar->conf_mutex);
|
||||
|
||||
rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx],
|
||||
@ -5731,6 +5798,7 @@ static int __ath11k_mac_register(struct ath11k *ar)
|
||||
ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW);
|
||||
ieee80211_hw_set(ar->hw, SUPPORTS_REORDERING_BUFFER);
|
||||
ieee80211_hw_set(ar->hw, SUPPORTS_AMSDU_IN_AMPDU);
|
||||
ieee80211_hw_set(ar->hw, USES_RSS);
|
||||
}
|
||||
|
||||
ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
|
||||
@ -5762,6 +5830,7 @@ static int __ath11k_mac_register(struct ath11k *ar)
|
||||
ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations;
|
||||
|
||||
ar->hw->queues = ATH11K_HW_MAX_QUEUES;
|
||||
ar->hw->wiphy->tx_queue_len = ATH11K_QUEUE_LEN;
|
||||
ar->hw->offchannel_tx_hw_queue = ATH11K_HW_MAX_QUEUES - 1;
|
||||
ar->hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF;
|
||||
|
||||
|
@ -145,4 +145,5 @@ void ath11k_mac_peer_cleanup_all(struct ath11k *ar);
|
||||
int ath11k_mac_tx_mgmt_pending_free(int buf_id, void *skb, void *ctx);
|
||||
u8 ath11k_mac_bw_to_mac80211_bw(u8 bw);
|
||||
enum ath11k_supported_bw ath11k_mac_mac80211_bw_to_ath11k_bw(enum rate_info_bw bw);
|
||||
enum hal_encrypt_type ath11k_dp_tx_get_encrypt_type(u32 cipher);
|
||||
#endif
|
||||
|
@ -228,6 +228,9 @@ int ath11k_peer_create(struct ath11k *ar, struct ath11k_vif *arvif,
|
||||
peer->sta = sta;
|
||||
arvif->ast_hash = peer->ast_hash;
|
||||
|
||||
peer->sec_type = HAL_ENCRYPT_TYPE_OPEN;
|
||||
peer->sec_type_grp = HAL_ENCRYPT_TYPE_OPEN;
|
||||
|
||||
ar->num_peers++;
|
||||
|
||||
spin_unlock_bh(&ar->ab->base_lock);
|
||||
|
@ -17,6 +17,15 @@ struct ath11k_peer {
|
||||
/* protected by ab->data_lock */
|
||||
struct ieee80211_key_conf *keys[WMI_MAX_KEY_INDEX + 1];
|
||||
struct dp_rx_tid rx_tid[IEEE80211_NUM_TIDS + 1];
|
||||
|
||||
/* Info used in MMIC verification of
|
||||
* RX fragments
|
||||
*/
|
||||
struct crypto_shash *tfm_mmic;
|
||||
u8 mcast_keyidx;
|
||||
u8 ucast_keyidx;
|
||||
u16 sec_type;
|
||||
u16 sec_type_grp;
|
||||
};
|
||||
|
||||
void ath11k_peer_unmap_event(struct ath11k_base *ab, u16 peer_id);
|
||||
|
@ -2365,6 +2365,7 @@ static void ath11k_qmi_driver_event_work(struct work_struct *work)
|
||||
break;
|
||||
case ATH11K_QMI_EVENT_FW_READY:
|
||||
if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags)) {
|
||||
ath11k_hal_dump_srng_stats(ab);
|
||||
queue_work(ab->workqueue, &ab->restart_work);
|
||||
break;
|
||||
}
|
||||
|
@ -342,7 +342,7 @@ struct rx_attention {
|
||||
#define RX_MPDU_START_INFO0_PROTO_VER_ERR BIT(12)
|
||||
#define RX_MPDU_START_INFO0_AST_LOOKUP_VALID BIT(13)
|
||||
|
||||
#define RX_MPDU_START_INFO1_MPDU_CTRL_VALID BIT(0)
|
||||
#define RX_MPDU_START_INFO1_MPDU_FCTRL_VALID BIT(0)
|
||||
#define RX_MPDU_START_INFO1_MPDU_DUR_VALID BIT(1)
|
||||
#define RX_MPDU_START_INFO1_MAC_ADDR1_VALID BIT(2)
|
||||
#define RX_MPDU_START_INFO1_MAC_ADDR2_VALID BIT(3)
|
||||
|
@ -2707,6 +2707,84 @@ ath11k_wmi_send_obss_spr_cmd(struct ath11k *ar, u32 vdev_id,
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
ath11k_wmi_send_obss_color_collision_cfg_cmd(struct ath11k *ar, u32 vdev_id,
|
||||
u8 bss_color, u32 period,
|
||||
bool enable)
|
||||
{
|
||||
struct ath11k_pdev_wmi *wmi = ar->wmi;
|
||||
struct ath11k_base *ab = wmi->wmi_ab->ab;
|
||||
struct wmi_obss_color_collision_cfg_params_cmd *cmd;
|
||||
struct sk_buff *skb;
|
||||
int ret, len;
|
||||
|
||||
len = sizeof(*cmd);
|
||||
|
||||
skb = ath11k_wmi_alloc_skb(wmi->wmi_ab, len);
|
||||
if (!skb)
|
||||
return -ENOMEM;
|
||||
|
||||
cmd = (struct wmi_obss_color_collision_cfg_params_cmd *)skb->data;
|
||||
cmd->tlv_header = FIELD_PREP(WMI_TLV_TAG,
|
||||
WMI_TAG_OBSS_COLOR_COLLISION_DET_CONFIG) |
|
||||
FIELD_PREP(WMI_TLV_LEN, len - TLV_HDR_SIZE);
|
||||
cmd->vdev_id = vdev_id;
|
||||
cmd->evt_type = enable ? ATH11K_OBSS_COLOR_COLLISION_DETECTION :
|
||||
ATH11K_OBSS_COLOR_COLLISION_DETECTION_DISABLE;
|
||||
cmd->current_bss_color = bss_color;
|
||||
cmd->detection_period_ms = period;
|
||||
cmd->scan_period_ms = ATH11K_BSS_COLOR_COLLISION_SCAN_PERIOD_MS;
|
||||
cmd->free_slot_expiry_time_ms = 0;
|
||||
cmd->flags = 0;
|
||||
|
||||
ath11k_dbg(ar->ab, ATH11K_DBG_WMI,
|
||||
"wmi_send_obss_color_collision_cfg id %d type %d bss_color %d detect_period %d scan_period %d\n",
|
||||
cmd->vdev_id, cmd->evt_type, cmd->current_bss_color,
|
||||
cmd->detection_period_ms, cmd->scan_period_ms);
|
||||
|
||||
ret = ath11k_wmi_cmd_send(wmi, skb,
|
||||
WMI_OBSS_COLOR_COLLISION_DET_CONFIG_CMDID);
|
||||
if (ret) {
|
||||
ath11k_warn(ab, "Failed to send WMI_OBSS_COLOR_COLLISION_DET_CONFIG_CMDID");
|
||||
dev_kfree_skb(skb);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ath11k_wmi_send_bss_color_change_enable_cmd(struct ath11k *ar, u32 vdev_id,
|
||||
bool enable)
|
||||
{
|
||||
struct ath11k_pdev_wmi *wmi = ar->wmi;
|
||||
struct ath11k_base *ab = wmi->wmi_ab->ab;
|
||||
struct wmi_bss_color_change_enable_params_cmd *cmd;
|
||||
struct sk_buff *skb;
|
||||
int ret, len;
|
||||
|
||||
len = sizeof(*cmd);
|
||||
|
||||
skb = ath11k_wmi_alloc_skb(wmi->wmi_ab, len);
|
||||
if (!skb)
|
||||
return -ENOMEM;
|
||||
|
||||
cmd = (struct wmi_bss_color_change_enable_params_cmd *)skb->data;
|
||||
cmd->tlv_header = FIELD_PREP(WMI_TLV_TAG, WMI_TAG_BSS_COLOR_CHANGE_ENABLE) |
|
||||
FIELD_PREP(WMI_TLV_LEN, len - TLV_HDR_SIZE);
|
||||
cmd->vdev_id = vdev_id;
|
||||
cmd->enable = enable ? 1 : 0;
|
||||
|
||||
ath11k_dbg(ar->ab, ATH11K_DBG_WMI,
|
||||
"wmi_send_bss_color_change_enable id %d enable %d\n",
|
||||
cmd->vdev_id, cmd->enable);
|
||||
|
||||
ret = ath11k_wmi_cmd_send(wmi, skb,
|
||||
WMI_BSS_COLOR_CHANGE_ENABLE_CMDID);
|
||||
if (ret) {
|
||||
ath11k_warn(ab, "Failed to send WMI_TWT_DIeABLE_CMDID");
|
||||
dev_kfree_skb(skb);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
ath11k_fill_band_to_mac_param(struct ath11k_base *soc,
|
||||
struct wmi_host_pdev_band_to_mac *band_to_mac)
|
||||
@ -2917,6 +2995,41 @@ static int ath11k_init_cmd_send(struct ath11k_pdev_wmi *wmi,
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ath11k_wmi_pdev_lro_cfg(struct ath11k *ar,
|
||||
int pdev_id)
|
||||
{
|
||||
struct ath11k_wmi_pdev_lro_config_cmd *cmd;
|
||||
struct sk_buff *skb;
|
||||
int ret;
|
||||
|
||||
skb = ath11k_wmi_alloc_skb(ar->wmi->wmi_ab, sizeof(*cmd));
|
||||
if (!skb)
|
||||
return -ENOMEM;
|
||||
|
||||
cmd = (struct ath11k_wmi_pdev_lro_config_cmd *)skb->data;
|
||||
cmd->tlv_header = FIELD_PREP(WMI_TLV_TAG, WMI_TAG_LRO_INFO_CMD) |
|
||||
FIELD_PREP(WMI_TLV_LEN, sizeof(*cmd) - TLV_HDR_SIZE);
|
||||
|
||||
get_random_bytes(cmd->th_4, sizeof(uint32_t) * ATH11K_IPV4_TH_SEED_SIZE);
|
||||
get_random_bytes(cmd->th_6, sizeof(uint32_t) * ATH11K_IPV6_TH_SEED_SIZE);
|
||||
|
||||
cmd->pdev_id = pdev_id;
|
||||
|
||||
ret = ath11k_wmi_cmd_send(ar->wmi, skb, WMI_LRO_CONFIG_CMDID);
|
||||
if (ret) {
|
||||
ath11k_warn(ar->ab,
|
||||
"failed to send lro cfg req wmi cmd\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
ath11k_dbg(ar->ab, ATH11K_DBG_WMI,
|
||||
"WMI lro cfg cmd pdev_id 0x%x\n", pdev_id);
|
||||
return 0;
|
||||
err:
|
||||
dev_kfree_skb(skb);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ath11k_wmi_wait_for_service_ready(struct ath11k_base *ab)
|
||||
{
|
||||
unsigned long time_left;
|
||||
|
@ -488,6 +488,7 @@ enum wmi_tlv_cmd_id {
|
||||
WMI_SAR_LIMITS_CMDID,
|
||||
WMI_OBSS_SCAN_ENABLE_CMDID = WMI_TLV_CMD(WMI_GRP_OBSS_OFL),
|
||||
WMI_OBSS_SCAN_DISABLE_CMDID,
|
||||
WMI_OBSS_COLOR_COLLISION_DET_CONFIG_CMDID,
|
||||
WMI_LPI_MGMT_SNOOPING_CONFIG_CMDID = WMI_TLV_CMD(WMI_GRP_LPI),
|
||||
WMI_LPI_START_SCAN_CMDID,
|
||||
WMI_LPI_STOP_SCAN_CMDID,
|
||||
@ -4620,6 +4621,42 @@ struct wmi_obss_spatial_reuse_params_cmd {
|
||||
u32 vdev_id;
|
||||
} __packed;
|
||||
|
||||
#define ATH11K_BSS_COLOR_COLLISION_SCAN_PERIOD_MS 200
|
||||
#define ATH11K_OBSS_COLOR_COLLISION_DETECTION_DISABLE 0
|
||||
#define ATH11K_OBSS_COLOR_COLLISION_DETECTION 1
|
||||
|
||||
#define ATH11K_BSS_COLOR_COLLISION_DETECTION_STA_PERIOD_MS 10000
|
||||
#define ATH11K_BSS_COLOR_COLLISION_DETECTION_AP_PERIOD_MS 5000
|
||||
|
||||
struct wmi_obss_color_collision_cfg_params_cmd {
|
||||
u32 tlv_header;
|
||||
u32 vdev_id;
|
||||
u32 flags;
|
||||
u32 evt_type;
|
||||
u32 current_bss_color;
|
||||
u32 detection_period_ms;
|
||||
u32 scan_period_ms;
|
||||
u32 free_slot_expiry_time_ms;
|
||||
} __packed;
|
||||
|
||||
struct wmi_bss_color_change_enable_params_cmd {
|
||||
u32 tlv_header;
|
||||
u32 vdev_id;
|
||||
u32 enable;
|
||||
} __packed;
|
||||
|
||||
#define ATH11K_IPV4_TH_SEED_SIZE 5
|
||||
#define ATH11K_IPV6_TH_SEED_SIZE 11
|
||||
|
||||
struct ath11k_wmi_pdev_lro_config_cmd {
|
||||
u32 tlv_header;
|
||||
u32 lro_enable;
|
||||
u32 res;
|
||||
u32 th_4[ATH11K_IPV4_TH_SEED_SIZE];
|
||||
u32 th_6[ATH11K_IPV6_TH_SEED_SIZE];
|
||||
u32 pdev_id;
|
||||
} __packed;
|
||||
|
||||
struct target_resource_config {
|
||||
u32 num_vdevs;
|
||||
u32 num_peers;
|
||||
@ -4814,4 +4851,10 @@ int ath11k_wmi_send_twt_enable_cmd(struct ath11k *ar, u32 pdev_id);
|
||||
int ath11k_wmi_send_twt_disable_cmd(struct ath11k *ar, u32 pdev_id);
|
||||
int ath11k_wmi_send_obss_spr_cmd(struct ath11k *ar, u32 vdev_id,
|
||||
struct ieee80211_he_obss_pd *he_obss_pd);
|
||||
int ath11k_wmi_send_obss_color_collision_cfg_cmd(struct ath11k *ar, u32 vdev_id,
|
||||
u8 bss_color, u32 period,
|
||||
bool enable);
|
||||
int ath11k_wmi_send_bss_color_change_enable_cmd(struct ath11k *ar, u32 vdev_id,
|
||||
bool enable);
|
||||
int ath11k_wmi_pdev_lro_cfg(struct ath11k *ar, int pdev_id);
|
||||
#endif
|
||||
|
@ -2953,7 +2953,7 @@ static s32 brcmf_inform_single_bss(struct brcmf_cfg80211_info *cfg,
|
||||
|
||||
if (le32_to_cpu(bi->length) > WL_BSS_INFO_MAX) {
|
||||
bphy_err(drvr, "Bss info is larger than buffer. Discarding\n");
|
||||
return 0;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!bi->ctl_ch) {
|
||||
|
@ -404,7 +404,7 @@ struct brcmf_fws_mac_descriptor {
|
||||
u8 traffic_lastreported_bmp;
|
||||
};
|
||||
|
||||
#define BRCMF_FWS_HANGER_MAXITEMS 1024
|
||||
#define BRCMF_FWS_HANGER_MAXITEMS 3072
|
||||
|
||||
/**
|
||||
* enum brcmf_fws_hanger_item_state - state of hanger item.
|
||||
@ -2145,8 +2145,7 @@ int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb)
|
||||
brcmf_fws_enq(fws, BRCMF_FWS_SKBSTATE_DELAYED, fifo, skb);
|
||||
brcmf_fws_schedule_deq(fws);
|
||||
} else {
|
||||
bphy_err(drvr, "drop skb: no hanger slot\n");
|
||||
brcmf_txfinalize(ifp, skb, false);
|
||||
bphy_err(drvr, "no hanger slot available\n");
|
||||
rc = -ENOMEM;
|
||||
}
|
||||
brcmf_fws_unlock(fws);
|
||||
|
@ -164,7 +164,6 @@ struct brcmf_usbdev_info {
|
||||
|
||||
struct urb *bulk_urb; /* used for FW download */
|
||||
|
||||
bool wowl_enabled;
|
||||
struct brcmf_mp_device *settings;
|
||||
};
|
||||
|
||||
@ -312,27 +311,43 @@ static int brcmf_usb_tx_ctlpkt(struct device *dev, u8 *buf, u32 len)
|
||||
int err = 0;
|
||||
int timeout = 0;
|
||||
struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
|
||||
struct usb_interface *intf = to_usb_interface(dev);
|
||||
|
||||
brcmf_dbg(USB, "Enter\n");
|
||||
if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP)
|
||||
return -EIO;
|
||||
|
||||
if (test_and_set_bit(0, &devinfo->ctl_op))
|
||||
return -EIO;
|
||||
err = usb_autopm_get_interface(intf);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP) {
|
||||
err = -EIO;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (test_and_set_bit(0, &devinfo->ctl_op)) {
|
||||
err = -EIO;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
devinfo->ctl_completed = false;
|
||||
err = brcmf_usb_send_ctl(devinfo, buf, len);
|
||||
if (err) {
|
||||
brcmf_err("fail %d bytes: %d\n", err, len);
|
||||
clear_bit(0, &devinfo->ctl_op);
|
||||
return err;
|
||||
goto fail;
|
||||
}
|
||||
timeout = brcmf_usb_ioctl_resp_wait(devinfo);
|
||||
clear_bit(0, &devinfo->ctl_op);
|
||||
if (!timeout) {
|
||||
brcmf_err("Txctl wait timed out\n");
|
||||
usb_kill_urb(devinfo->ctl_urb);
|
||||
err = -EIO;
|
||||
goto fail;
|
||||
}
|
||||
clear_bit(0, &devinfo->ctl_op);
|
||||
|
||||
fail:
|
||||
usb_autopm_put_interface(intf);
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -341,32 +356,46 @@ static int brcmf_usb_rx_ctlpkt(struct device *dev, u8 *buf, u32 len)
|
||||
int err = 0;
|
||||
int timeout = 0;
|
||||
struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
|
||||
struct usb_interface *intf = to_usb_interface(dev);
|
||||
|
||||
brcmf_dbg(USB, "Enter\n");
|
||||
if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP)
|
||||
return -EIO;
|
||||
|
||||
if (test_and_set_bit(0, &devinfo->ctl_op))
|
||||
return -EIO;
|
||||
err = usb_autopm_get_interface(intf);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP) {
|
||||
err = -EIO;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (test_and_set_bit(0, &devinfo->ctl_op)) {
|
||||
err = -EIO;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
devinfo->ctl_completed = false;
|
||||
err = brcmf_usb_recv_ctl(devinfo, buf, len);
|
||||
if (err) {
|
||||
brcmf_err("fail %d bytes: %d\n", err, len);
|
||||
clear_bit(0, &devinfo->ctl_op);
|
||||
return err;
|
||||
goto fail;
|
||||
}
|
||||
timeout = brcmf_usb_ioctl_resp_wait(devinfo);
|
||||
err = devinfo->ctl_urb_status;
|
||||
clear_bit(0, &devinfo->ctl_op);
|
||||
if (!timeout) {
|
||||
brcmf_err("rxctl wait timed out\n");
|
||||
usb_kill_urb(devinfo->ctl_urb);
|
||||
err = -EIO;
|
||||
goto fail;
|
||||
}
|
||||
clear_bit(0, &devinfo->ctl_op);
|
||||
fail:
|
||||
usb_autopm_put_interface(intf);
|
||||
if (!err)
|
||||
return devinfo->ctl_urb_actual_length;
|
||||
else
|
||||
return err;
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
||||
static struct brcmf_usbreq *brcmf_usb_deq(struct brcmf_usbdev_info *devinfo,
|
||||
@ -500,10 +529,12 @@ static void brcmf_usb_rx_complete(struct urb *urb)
|
||||
return;
|
||||
}
|
||||
|
||||
if (devinfo->bus_pub.state == BRCMFMAC_USB_STATE_UP) {
|
||||
if (devinfo->bus_pub.state == BRCMFMAC_USB_STATE_UP ||
|
||||
devinfo->bus_pub.state == BRCMFMAC_USB_STATE_SLEEP) {
|
||||
skb_put(skb, urb->actual_length);
|
||||
brcmf_rx_frame(devinfo->dev, skb, true);
|
||||
brcmf_usb_rx_refill(devinfo, req);
|
||||
usb_mark_last_busy(urb->dev);
|
||||
} else {
|
||||
brcmu_pkt_buf_free_skb(skb);
|
||||
brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req, NULL);
|
||||
@ -587,6 +618,11 @@ static int brcmf_usb_tx(struct device *dev, struct sk_buff *skb)
|
||||
struct brcmf_usbreq *req;
|
||||
int ret;
|
||||
unsigned long flags;
|
||||
struct usb_interface *intf = to_usb_interface(dev);
|
||||
|
||||
ret = usb_autopm_get_interface(intf);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
brcmf_dbg(USB, "Enter, skb=%p\n", skb);
|
||||
if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP) {
|
||||
@ -625,9 +661,10 @@ static int brcmf_usb_tx(struct device *dev, struct sk_buff *skb)
|
||||
devinfo->tx_flowblock = true;
|
||||
}
|
||||
spin_unlock_irqrestore(&devinfo->tx_flowblock_lock, flags);
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
usb_autopm_put_interface(intf);
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -991,20 +1028,32 @@ static int
|
||||
brcmf_usb_fw_download(struct brcmf_usbdev_info *devinfo)
|
||||
{
|
||||
int err;
|
||||
struct usb_interface *intf;
|
||||
|
||||
brcmf_dbg(USB, "Enter\n");
|
||||
if (devinfo == NULL)
|
||||
return -ENODEV;
|
||||
if (!devinfo) {
|
||||
err = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!devinfo->image) {
|
||||
brcmf_err("No firmware!\n");
|
||||
return -ENOENT;
|
||||
err = -ENOENT;
|
||||
goto out;
|
||||
}
|
||||
|
||||
intf = to_usb_interface(devinfo->dev);
|
||||
err = usb_autopm_get_interface(intf);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
err = brcmf_usb_dlstart(devinfo,
|
||||
(u8 *)devinfo->image, devinfo->image_len);
|
||||
if (err == 0)
|
||||
err = brcmf_usb_dlrun(devinfo);
|
||||
|
||||
usb_autopm_put_interface(intf);
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -1105,18 +1154,6 @@ error:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void brcmf_usb_wowl_config(struct device *dev, bool enabled)
|
||||
{
|
||||
struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
|
||||
|
||||
brcmf_dbg(USB, "Configuring WOWL, enabled=%d\n", enabled);
|
||||
devinfo->wowl_enabled = enabled;
|
||||
if (enabled)
|
||||
device_set_wakeup_enable(devinfo->dev, true);
|
||||
else
|
||||
device_set_wakeup_enable(devinfo->dev, false);
|
||||
}
|
||||
|
||||
static
|
||||
int brcmf_usb_get_fwname(struct device *dev, const char *ext, u8 *fw_name)
|
||||
{
|
||||
@ -1143,7 +1180,6 @@ static const struct brcmf_bus_ops brcmf_usb_bus_ops = {
|
||||
.txdata = brcmf_usb_tx,
|
||||
.txctl = brcmf_usb_tx_ctlpkt,
|
||||
.rxctl = brcmf_usb_rx_ctlpkt,
|
||||
.wowl_config = brcmf_usb_wowl_config,
|
||||
.get_fwname = brcmf_usb_get_fwname,
|
||||
};
|
||||
|
||||
@ -1332,6 +1368,8 @@ brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
|
||||
usb_set_intfdata(intf, devinfo);
|
||||
|
||||
intf->needs_remote_wakeup = 1;
|
||||
|
||||
/* Check that the device supports only one configuration */
|
||||
if (usb->descriptor.bNumConfigurations != 1) {
|
||||
brcmf_err("Number of configurations: %d not supported\n",
|
||||
@ -1445,12 +1483,8 @@ static int brcmf_usb_suspend(struct usb_interface *intf, pm_message_t state)
|
||||
|
||||
brcmf_dbg(USB, "Enter\n");
|
||||
devinfo->bus_pub.state = BRCMFMAC_USB_STATE_SLEEP;
|
||||
if (devinfo->wowl_enabled) {
|
||||
brcmf_cancel_all_urbs(devinfo);
|
||||
} else {
|
||||
brcmf_detach(&usb->dev);
|
||||
brcmf_free(&usb->dev);
|
||||
}
|
||||
brcmf_cancel_all_urbs(devinfo);
|
||||
device_set_wakeup_enable(devinfo->dev, true);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1463,22 +1497,10 @@ static int brcmf_usb_resume(struct usb_interface *intf)
|
||||
struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(&usb->dev);
|
||||
|
||||
brcmf_dbg(USB, "Enter\n");
|
||||
if (!devinfo->wowl_enabled) {
|
||||
int err;
|
||||
|
||||
err = brcmf_alloc(&usb->dev, devinfo->settings);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = brcmf_attach(devinfo->dev);
|
||||
if (err) {
|
||||
brcmf_free(devinfo->dev);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
devinfo->bus_pub.state = BRCMFMAC_USB_STATE_UP;
|
||||
brcmf_usb_rx_fill_all(devinfo);
|
||||
device_set_wakeup_enable(devinfo->dev, false);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1535,6 +1557,7 @@ static struct usb_driver brcmf_usbdrvr = {
|
||||
.suspend = brcmf_usb_suspend,
|
||||
.resume = brcmf_usb_resume,
|
||||
.reset_resume = brcmf_usb_reset_resume,
|
||||
.supports_autosuspend = true,
|
||||
.disable_hub_initiated_lpm = 1,
|
||||
};
|
||||
|
||||
|
@ -57,7 +57,7 @@
|
||||
#include "iwl-prph.h"
|
||||
|
||||
/* Highest firmware API version supported */
|
||||
#define IWL_22000_UCODE_API_MAX 52
|
||||
#define IWL_22000_UCODE_API_MAX 53
|
||||
|
||||
/* Lowest firmware API version supported */
|
||||
#define IWL_22000_UCODE_API_MIN 39
|
||||
@ -76,10 +76,8 @@
|
||||
#define IWL_22000_JF_FW_PRE "iwlwifi-Qu-a0-jf-b0-"
|
||||
#define IWL_22000_HR_FW_PRE "iwlwifi-Qu-a0-hr-a0-"
|
||||
#define IWL_22000_HR_CDB_FW_PRE "iwlwifi-QuIcp-z0-hrcdb-a0-"
|
||||
#define IWL_22000_HR_A_F0_FW_PRE "iwlwifi-QuQnj-f0-hr-a0-"
|
||||
#define IWL_22000_QU_B_HR_B_FW_PRE "iwlwifi-Qu-b0-hr-b0-"
|
||||
#define IWL_22000_HR_B_FW_PRE "iwlwifi-QuQnj-b0-hr-b0-"
|
||||
#define IWL_22000_HR_A0_FW_PRE "iwlwifi-QuQnj-a0-hr-a0-"
|
||||
#define IWL_QU_C_HR_B_FW_PRE "iwlwifi-Qu-c0-hr-b0-"
|
||||
#define IWL_QU_B_JF_B_FW_PRE "iwlwifi-Qu-b0-jf-b0-"
|
||||
#define IWL_QU_C_JF_B_FW_PRE "iwlwifi-Qu-c0-jf-b0-"
|
||||
@ -98,14 +96,10 @@
|
||||
IWL_22000_HR_FW_PRE __stringify(api) ".ucode"
|
||||
#define IWL_22000_JF_MODULE_FIRMWARE(api) \
|
||||
IWL_22000_JF_FW_PRE __stringify(api) ".ucode"
|
||||
#define IWL_22000_HR_A_F0_QNJ_MODULE_FIRMWARE(api) \
|
||||
IWL_22000_HR_A_F0_FW_PRE __stringify(api) ".ucode"
|
||||
#define IWL_22000_QU_B_HR_B_MODULE_FIRMWARE(api) \
|
||||
IWL_22000_QU_B_HR_B_FW_PRE __stringify(api) ".ucode"
|
||||
#define IWL_22000_HR_B_QNJ_MODULE_FIRMWARE(api) \
|
||||
IWL_22000_HR_B_FW_PRE __stringify(api) ".ucode"
|
||||
#define IWL_22000_HR_A0_QNJ_MODULE_FIRMWARE(api) \
|
||||
IWL_22000_HR_A0_FW_PRE __stringify(api) ".ucode"
|
||||
#define IWL_QUZ_A_HR_B_MODULE_FIRMWARE(api) \
|
||||
IWL_QUZ_A_HR_B_FW_PRE __stringify(api) ".ucode"
|
||||
#define IWL_QUZ_A_JF_B_MODULE_FIRMWARE(api) \
|
||||
@ -235,6 +229,38 @@ static const struct iwl_ht_params iwl_22000_ht_params = {
|
||||
}, \
|
||||
}
|
||||
|
||||
const struct iwl_cfg_trans_params iwl_qu_trans_cfg = {
|
||||
.mq_rx_supported = true,
|
||||
.use_tfh = true,
|
||||
.rf_id = true,
|
||||
.gen2 = true,
|
||||
.device_family = IWL_DEVICE_FAMILY_22000,
|
||||
.base_params = &iwl_22000_base_params,
|
||||
.integrated = true,
|
||||
.xtal_latency = 5000,
|
||||
};
|
||||
|
||||
const struct iwl_cfg_trans_params iwl_qu_long_latency_trans_cfg = {
|
||||
.mq_rx_supported = true,
|
||||
.use_tfh = true,
|
||||
.rf_id = true,
|
||||
.gen2 = true,
|
||||
.device_family = IWL_DEVICE_FAMILY_22000,
|
||||
.base_params = &iwl_22000_base_params,
|
||||
.integrated = true,
|
||||
.xtal_latency = 12000,
|
||||
.low_latency_xtal = true,
|
||||
};
|
||||
|
||||
const struct iwl_cfg_trans_params iwl_qnj_trans_cfg = {
|
||||
.mq_rx_supported = true,
|
||||
.use_tfh = true,
|
||||
.rf_id = true,
|
||||
.gen2 = true,
|
||||
.device_family = IWL_DEVICE_FAMILY_22000,
|
||||
.base_params = &iwl_22000_base_params,
|
||||
};
|
||||
|
||||
/*
|
||||
* 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
|
||||
@ -246,6 +272,47 @@ static const struct iwl_ht_params iwl_22000_ht_params = {
|
||||
#define IWL_NUM_RBDS_22000_HE 2048
|
||||
#define IWL_NUM_RBDS_AX210_HE 4096
|
||||
|
||||
/*
|
||||
* All JF radio modules are part of the 9000 series, but the MAC part
|
||||
* looks more like 22000. That's why this device is here, but called
|
||||
* 9560 nevertheless.
|
||||
*/
|
||||
const struct iwl_cfg iwl9560_qu_b0_jf_b0_cfg = {
|
||||
.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_qu_c0_jf_b0_cfg = {
|
||||
.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_quz_a0_jf_b0_cfg = {
|
||||
.fw_name_pre = IWL_QUZ_A_JF_B_FW_PRE,
|
||||
IWL_DEVICE_22500,
|
||||
/*
|
||||
* This device doesn't support receiving BlockAck with a large bitmap
|
||||
* so we need to restrict the size of transmitted aggregation to the
|
||||
* 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_qnj_b0_jf_b0_cfg = {
|
||||
.fw_name_pre = IWL_QNJ_B_JF_B_FW_PRE,
|
||||
IWL_DEVICE_22500,
|
||||
/*
|
||||
* This device doesn't support receiving BlockAck with a large bitmap
|
||||
* so we need to restrict the size of transmitted aggregation to the
|
||||
* 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_trans_params iwl_ax200_trans_cfg = {
|
||||
.device_family = IWL_DEVICE_FAMILY_22000,
|
||||
.base_params = &iwl_22000_base_params,
|
||||
@ -382,184 +449,6 @@ const struct iwl_cfg iwl_ax200_cfg_cc = {
|
||||
.num_rbds = IWL_NUM_RBDS_22000_HE,
|
||||
};
|
||||
|
||||
/*
|
||||
* All JF radio modules are part of the 9000 series, but the MAC part
|
||||
* looks more like 22000. That's why this device is here, but called
|
||||
* 9560 nevertheless.
|
||||
*/
|
||||
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 = {
|
||||
.name = "Intel(R) Wireless-AC 9560 160MHz",
|
||||
.fw_name_pre = IWL_QNJ_B_JF_B_FW_PRE,
|
||||
IWL_DEVICE_22500,
|
||||
/*
|
||||
* This device doesn't support receiving BlockAck with a large bitmap
|
||||
* so we need to restrict the size of transmitted aggregation to the
|
||||
* 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 = {
|
||||
.name = "Intel(R) Wireless-AC 9560 160MHz",
|
||||
.fw_name_pre = IWL_QUZ_A_JF_B_FW_PRE,
|
||||
IWL_DEVICE_22500,
|
||||
/*
|
||||
* This device doesn't support receiving BlockAck with a large bitmap
|
||||
* so we need to restrict the size of transmitted aggregation to the
|
||||
* HT size; mac80211 would otherwise pick the HE max (256) by default.
|
||||
*/
|
||||
.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 = {
|
||||
.name = "Intel(R) Wireless-AC 9560 160MHz",
|
||||
.fw_name_pre = IWL_QUZ_A_JF_B_FW_PRE,
|
||||
IWL_DEVICE_22500,
|
||||
/*
|
||||
* This device doesn't support receiving BlockAck with a large bitmap
|
||||
* so we need to restrict the size of transmitted aggregation to the
|
||||
* HT size; mac80211 would otherwise pick the HE max (256) by default.
|
||||
*/
|
||||
.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 = {
|
||||
.name = "Intel(R) Dual Band Wireless AC 9461",
|
||||
.fw_name_pre = IWL_QUZ_A_JF_B_FW_PRE,
|
||||
IWL_DEVICE_22500,
|
||||
/*
|
||||
* This device doesn't support receiving BlockAck with a large bitmap
|
||||
* so we need to restrict the size of transmitted aggregation to the
|
||||
* HT size; mac80211 would otherwise pick the HE max (256) by default.
|
||||
*/
|
||||
.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 = {
|
||||
.name = "Intel(R) Dual Band Wireless AC 9462",
|
||||
.fw_name_pre = IWL_QUZ_A_JF_B_FW_PRE,
|
||||
IWL_DEVICE_22500,
|
||||
/*
|
||||
* This device doesn't support receiving BlockAck with a large bitmap
|
||||
* so we need to restrict the size of transmitted aggregation to the
|
||||
* HT size; mac80211 would otherwise pick the HE max (256) by default.
|
||||
*/
|
||||
.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 = {
|
||||
.name = "Killer (R) Wireless-AC 1550s Wireless Network Adapter (9560NGW)",
|
||||
.fw_name_pre = IWL_QUZ_A_JF_B_FW_PRE,
|
||||
IWL_DEVICE_22500,
|
||||
/*
|
||||
* This device doesn't support receiving BlockAck with a large bitmap
|
||||
* so we need to restrict the size of transmitted aggregation to the
|
||||
* HT size; mac80211 would otherwise pick the HE max (256) by default.
|
||||
*/
|
||||
.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 = {
|
||||
.name = "Killer (R) Wireless-AC 1550i Wireless Network Adapter (9560NGW)",
|
||||
.fw_name_pre = IWL_QUZ_A_JF_B_FW_PRE,
|
||||
IWL_DEVICE_22500,
|
||||
/*
|
||||
* This device doesn't support receiving BlockAck with a large bitmap
|
||||
* so we need to restrict the size of transmitted aggregation to the
|
||||
* HT size; mac80211 would otherwise pick the HE max (256) by default.
|
||||
*/
|
||||
.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 = {
|
||||
.name = "Killer(R) Wi-Fi 6 AX1650i 160MHz Wireless Network Adapter (201NGW)",
|
||||
.fw_name_pre = IWL_22000_QU_B_HR_B_FW_PRE,
|
||||
@ -612,32 +501,6 @@ const struct iwl_cfg killer1650i_2ax_cfg_qu_c0_hr_b0 = {
|
||||
.num_rbds = IWL_NUM_RBDS_22000_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl22000_2ax_cfg_jf = {
|
||||
.name = "Intel(R) Dual Band Wireless AX 22000",
|
||||
.fw_name_pre = IWL_QU_B_JF_B_FW_PRE,
|
||||
IWL_DEVICE_22500,
|
||||
/*
|
||||
* This device doesn't support receiving BlockAck with a large bitmap
|
||||
* so we need to restrict the size of transmitted aggregation to the
|
||||
* 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 = {
|
||||
.name = "Intel(R) Dual Band Wireless AX 22000",
|
||||
.fw_name_pre = IWL_22000_HR_A_F0_FW_PRE,
|
||||
IWL_DEVICE_22500,
|
||||
/*
|
||||
* This device doesn't support receiving BlockAck with a large bitmap
|
||||
* so we need to restrict the size of transmitted aggregation to the
|
||||
* 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 = {
|
||||
.name = "Intel(R) Dual Band Wireless AX 22000",
|
||||
.fw_name_pre = IWL_22000_HR_B_FW_PRE,
|
||||
@ -651,19 +514,6 @@ const struct iwl_cfg iwl22000_2ax_cfg_qnj_hr_b0 = {
|
||||
.num_rbds = IWL_NUM_RBDS_22000_HE,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl22000_2ax_cfg_qnj_hr_a0 = {
|
||||
.name = "Intel(R) Dual Band Wireless AX 22000",
|
||||
.fw_name_pre = IWL_22000_HR_A0_FW_PRE,
|
||||
IWL_DEVICE_22500,
|
||||
/*
|
||||
* This device doesn't support receiving BlockAck with a large bitmap
|
||||
* so we need to restrict the size of transmitted aggregation to the
|
||||
* 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,
|
||||
@ -712,9 +562,7 @@ const struct iwl_cfg iwlax411_2ax_cfg_sosnj_gf4_a0 = {
|
||||
|
||||
MODULE_FIRMWARE(IWL_22000_HR_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
|
||||
MODULE_FIRMWARE(IWL_22000_JF_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
|
||||
MODULE_FIRMWARE(IWL_22000_HR_A_F0_QNJ_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
|
||||
MODULE_FIRMWARE(IWL_22000_HR_B_QNJ_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
|
||||
MODULE_FIRMWARE(IWL_22000_HR_A0_QNJ_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
|
||||
MODULE_FIRMWARE(IWL_QU_C_HR_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
|
||||
MODULE_FIRMWARE(IWL_QU_B_JF_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
|
||||
MODULE_FIRMWARE(IWL_QUZ_A_HR_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
|
||||
|
@ -174,9 +174,23 @@ const struct iwl_cfg_trans_params iwl9000_trans_cfg = {
|
||||
.rf_id = true,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl9260_2ac_cfg = {
|
||||
.fw_name_pre = IWL9260_FW_PRE,
|
||||
IWL_DEVICE_9000,
|
||||
const struct iwl_cfg_trans_params iwl9560_trans_cfg = {
|
||||
.device_family = IWL_DEVICE_FAMILY_9000,
|
||||
.base_params = &iwl9000_base_params,
|
||||
.mq_rx_supported = true,
|
||||
.rf_id = true,
|
||||
.integrated = true,
|
||||
.xtal_latency = 5000,
|
||||
};
|
||||
|
||||
const struct iwl_cfg_trans_params iwl9560_shared_clk_trans_cfg = {
|
||||
.device_family = IWL_DEVICE_FAMILY_9000,
|
||||
.base_params = &iwl9000_base_params,
|
||||
.mq_rx_supported = true,
|
||||
.rf_id = true,
|
||||
.integrated = true,
|
||||
.xtal_latency = 5000,
|
||||
.extra_phy_cfg_flags = FW_PHY_CFG_SHARED_CLK
|
||||
};
|
||||
|
||||
const char iwl9162_name[] = "Intel(R) Wireless-AC 9162";
|
||||
@ -200,7 +214,7 @@ const char iwl9560_killer_1550i_name[] =
|
||||
const char iwl9560_killer_1550s_name[] =
|
||||
"Killer (R) Wireless-AC 1550s Wireless Network Adapter (9560NGW)";
|
||||
|
||||
const struct iwl_cfg iwl9560_2ac_cfg = {
|
||||
const struct iwl_cfg iwl9260_2ac_cfg = {
|
||||
.fw_name_pre = IWL9260_FW_PRE,
|
||||
IWL_DEVICE_9000,
|
||||
};
|
||||
@ -208,16 +222,6 @@ const struct iwl_cfg iwl9560_2ac_cfg = {
|
||||
const struct iwl_cfg iwl9560_2ac_cfg_soc = {
|
||||
.fw_name_pre = IWL9000_FW_PRE,
|
||||
IWL_DEVICE_9000,
|
||||
.integrated = true,
|
||||
.soc_latency = 5000,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl9560_2ac_cfg_shared_clk = {
|
||||
.fw_name_pre = IWL9000_FW_PRE,
|
||||
IWL_DEVICE_9000,
|
||||
.integrated = true,
|
||||
.soc_latency = 5000,
|
||||
.extra_phy_cfg_flags = FW_PHY_CFG_SHARED_CLK
|
||||
};
|
||||
|
||||
MODULE_FIRMWARE(IWL9000_MODULE_FIRMWARE(IWL9000_UCODE_API_MAX));
|
||||
|
@ -5,9 +5,9 @@
|
||||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
|
||||
* Copyright(c) 2016 - 2017 Intel Deutschland GmbH
|
||||
* Copyright(c) 2012 - 2014, 2020 Intel Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
@ -27,9 +27,9 @@
|
||||
*
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
|
||||
* Copyright(c) 2016 - 2017 Intel Deutschland GmbH
|
||||
* Copyright(c) 2012 - 2014, 2020 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -646,6 +646,11 @@ enum iwl_system_subcmd_ids {
|
||||
*/
|
||||
SHARED_MEM_CFG_CMD = 0x0,
|
||||
|
||||
/**
|
||||
* @SOC_CONFIGURATION_CMD: &struct iwl_soc_configuration_cmd
|
||||
*/
|
||||
SOC_CONFIGURATION_CMD = 0x01,
|
||||
|
||||
/**
|
||||
* @INIT_EXTENDED_CFG_CMD: &struct iwl_init_extended_cfg_cmd
|
||||
*/
|
||||
|
@ -427,6 +427,9 @@ struct iwl_tof_range_req_ap_entry_v2 {
|
||||
* Default algo type is ML.
|
||||
* @IWL_INITIATOR_AP_FLAGS_MCSI_REPORT: Send the MCSI for each FTM frame to the
|
||||
* driver.
|
||||
* @IWL_INITIATOR_AP_FLAGS_NON_TB: Use non trigger based flow
|
||||
* @IWL_INITIATOR_AP_FLAGS_TB: Use trigger based flow
|
||||
* @IWL_INITIATOR_AP_FLAGS_SECURED: request secured measurement
|
||||
*/
|
||||
enum iwl_initiator_ap_flags {
|
||||
IWL_INITIATOR_AP_FLAGS_ASAP = BIT(1),
|
||||
@ -436,6 +439,9 @@ enum iwl_initiator_ap_flags {
|
||||
IWL_INITIATOR_AP_FLAGS_ALGO_LR = BIT(5),
|
||||
IWL_INITIATOR_AP_FLAGS_ALGO_FFT = BIT(6),
|
||||
IWL_INITIATOR_AP_FLAGS_MCSI_REPORT = BIT(8),
|
||||
IWL_INITIATOR_AP_FLAGS_NON_TB = BIT(9),
|
||||
IWL_INITIATOR_AP_FLAGS_TB = BIT(10),
|
||||
IWL_INITIATOR_AP_FLAGS_SECURED = BIT(11),
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -95,6 +95,7 @@ struct iwl_ssid_ie {
|
||||
#define IWL_SCAN_MAX_BLACKLIST_LEN 64
|
||||
#define IWL_SCAN_SHORT_BLACKLIST_LEN 16
|
||||
#define IWL_SCAN_MAX_PROFILES 11
|
||||
#define IWL_SCAN_MAX_PROFILES_V2 8
|
||||
#define SCAN_OFFLOAD_PROBE_REQ_SIZE 512
|
||||
#define SCAN_NUM_BAND_PROBE_DATA_V_1 2
|
||||
#define SCAN_NUM_BAND_PROBE_DATA_V_2 3
|
||||
@ -160,8 +161,7 @@ struct iwl_scan_offload_profile {
|
||||
} __packed;
|
||||
|
||||
/**
|
||||
* struct iwl_scan_offload_profile_cfg - SCAN_OFFLOAD_PROFILES_CFG_API_S_VER_1
|
||||
* @profiles: profiles to search for match
|
||||
* struct iwl_scan_offload_profile_cfg_data
|
||||
* @blacklist_len: length of blacklist
|
||||
* @num_profiles: num of profiles in the list
|
||||
* @match_notify: clients waiting for match found notification
|
||||
@ -170,8 +170,7 @@ struct iwl_scan_offload_profile {
|
||||
* @any_beacon_notify: clients waiting for match notification without match
|
||||
* @reserved: reserved
|
||||
*/
|
||||
struct iwl_scan_offload_profile_cfg {
|
||||
struct iwl_scan_offload_profile profiles[IWL_SCAN_MAX_PROFILES];
|
||||
struct iwl_scan_offload_profile_cfg_data {
|
||||
u8 blacklist_len;
|
||||
u8 num_profiles;
|
||||
u8 match_notify;
|
||||
@ -181,6 +180,26 @@ struct iwl_scan_offload_profile_cfg {
|
||||
u8 reserved[2];
|
||||
} __packed;
|
||||
|
||||
/**
|
||||
* struct iwl_scan_offload_profile_cfg
|
||||
* @profiles: profiles to search for match
|
||||
* @data: the rest of the data for profile_cfg
|
||||
*/
|
||||
struct iwl_scan_offload_profile_cfg_v1 {
|
||||
struct iwl_scan_offload_profile profiles[IWL_SCAN_MAX_PROFILES];
|
||||
struct iwl_scan_offload_profile_cfg_data data;
|
||||
} __packed; /* SCAN_OFFLOAD_PROFILES_CFG_API_S_VER_1-2*/
|
||||
|
||||
/**
|
||||
* struct iwl_scan_offload_profile_cfg
|
||||
* @profiles: profiles to search for match
|
||||
* @data: the rest of the data for profile_cfg
|
||||
*/
|
||||
struct iwl_scan_offload_profile_cfg {
|
||||
struct iwl_scan_offload_profile profiles[IWL_SCAN_MAX_PROFILES_V2];
|
||||
struct iwl_scan_offload_profile_cfg_data data;
|
||||
} __packed; /* SCAN_OFFLOAD_PROFILES_CFG_API_S_VER_3*/
|
||||
|
||||
/**
|
||||
* struct iwl_scan_schedule_lmac - schedule of scan offload
|
||||
* @delay: delay between iterations, in seconds.
|
||||
@ -702,13 +721,16 @@ struct iwl_scan_channel_cfg_umac {
|
||||
u8 channel_num;
|
||||
u8 iter_count;
|
||||
__le16 iter_interval;
|
||||
} v1; /* SCAN_CHANNEL_CFG_S_VER1 */
|
||||
} v1; /* SCAN_CHANNEL_CONFIG_API_S_VER_1 */
|
||||
struct {
|
||||
u8 channel_num;
|
||||
u8 band;
|
||||
u8 iter_count;
|
||||
u8 iter_interval;
|
||||
} v2; /* SCAN_CHANNEL_CFG_S_VER2 */
|
||||
} v2; /* SCAN_CHANNEL_CONFIG_API_S_VER_2
|
||||
* SCAN_CHANNEL_CONFIG_API_S_VER_3
|
||||
* SCAN_CHANNEL_CONFIG_API_S_VER_4
|
||||
*/
|
||||
};
|
||||
} __packed;
|
||||
|
||||
@ -943,6 +965,25 @@ struct iwl_scan_channel_params_v4 {
|
||||
u8 adwell_ch_override_bitmap[16];
|
||||
} __packed; /* SCAN_CHANNEL_PARAMS_API_S_VER_4 also
|
||||
SCAN_CHANNEL_PARAMS_API_S_VER_5 */
|
||||
|
||||
/**
|
||||
* struct iwl_scan_channel_params_v6
|
||||
* @flags: channel flags &enum iwl_scan_channel_flags
|
||||
* @count: num of channels in scan request
|
||||
* @n_aps_override: override the number of APs the FW uses to calculate dwell
|
||||
* time when adaptive dwell is used.
|
||||
* Channel k will use n_aps_override[i] when BIT(20 + i) is set in
|
||||
* channel_config[k].flags
|
||||
* @channel_config: array of explicit channel configurations
|
||||
* for 2.4Ghz and 5.2Ghz bands
|
||||
*/
|
||||
struct iwl_scan_channel_params_v6 {
|
||||
u8 flags;
|
||||
u8 count;
|
||||
u8 n_aps_override[2];
|
||||
struct iwl_scan_channel_cfg_umac channel_config[SCAN_MAX_NUM_CHANS_V3];
|
||||
} __packed; /* SCAN_CHANNEL_PARAMS_API_S_VER_6 */
|
||||
|
||||
/**
|
||||
* struct iwl_scan_general_params_v10
|
||||
* @flags: &enum iwl_umac_scan_flags
|
||||
@ -1023,6 +1064,20 @@ 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_params_v14
|
||||
* @general_params: &struct iwl_scan_general_params_v10
|
||||
* @channel_params: &struct iwl_scan_channel_params_v6
|
||||
* @periodic_params: &struct iwl_scan_periodic_parms_v1
|
||||
* @probe_params: &struct iwl_scan_probe_params_v4
|
||||
*/
|
||||
struct iwl_scan_req_params_v14 {
|
||||
struct iwl_scan_general_params_v10 general_params;
|
||||
struct iwl_scan_channel_params_v6 channel_params;
|
||||
struct iwl_scan_periodic_parms_v1 periodic_params;
|
||||
struct iwl_scan_probe_params_v4 probe_params;
|
||||
} __packed; /* SCAN_REQUEST_PARAMS_API_S_VER_14 */
|
||||
|
||||
/**
|
||||
* struct iwl_scan_req_umac_v12
|
||||
* @uid: scan id, &enum iwl_umac_scan_uid_offsets
|
||||
@ -1047,6 +1102,18 @@ struct iwl_scan_req_umac_v13 {
|
||||
struct iwl_scan_req_params_v13 scan_params;
|
||||
} __packed; /* SCAN_REQUEST_CMD_UMAC_API_S_VER_13 */
|
||||
|
||||
/**
|
||||
* struct iwl_scan_req_umac_v14
|
||||
* @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_v14 {
|
||||
__le32 uid;
|
||||
__le32 ooc_priority;
|
||||
struct iwl_scan_req_params_v14 scan_params;
|
||||
} __packed; /* SCAN_REQUEST_CMD_UMAC_API_S_VER_14 */
|
||||
|
||||
/**
|
||||
* struct iwl_umac_scan_abort
|
||||
* @uid: scan id, &enum iwl_umac_scan_uid_offsets
|
||||
@ -1121,7 +1188,7 @@ struct iwl_scan_offload_profiles_query_v1 {
|
||||
u8 resume_while_scanning;
|
||||
u8 self_recovery;
|
||||
__le16 reserved;
|
||||
struct iwl_scan_offload_profile_match_v1 matches[IWL_SCAN_MAX_PROFILES];
|
||||
struct iwl_scan_offload_profile_match_v1 matches[0];
|
||||
} __packed; /* SCAN_OFFLOAD_PROFILES_QUERY_RSP_S_VER_2 */
|
||||
|
||||
/**
|
||||
@ -1165,7 +1232,7 @@ struct iwl_scan_offload_profiles_query {
|
||||
u8 resume_while_scanning;
|
||||
u8 self_recovery;
|
||||
__le16 reserved;
|
||||
struct iwl_scan_offload_profile_match matches[IWL_SCAN_MAX_PROFILES];
|
||||
struct iwl_scan_offload_profile_match matches[0];
|
||||
} __packed; /* SCAN_OFFLOAD_PROFILES_QUERY_RSP_S_VER_3 */
|
||||
|
||||
/**
|
||||
|
87
drivers/net/wireless/intel/iwlwifi/fw/api/soc.h
Normal file
87
drivers/net/wireless/intel/iwlwifi/fw/api/soc.h
Normal file
@ -0,0 +1,87 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* This file is provided under a dual BSD/GPLv2 license. When using or
|
||||
* redistributing this file, you may do so under either license.
|
||||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
|
||||
* Copyright(c) 2016 - 2017 Intel Deutschland GmbH
|
||||
* Copyright(c) 2019 Intel Deutschland GmbH
|
||||
*
|
||||
* 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
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution
|
||||
* in the file called COPYING.
|
||||
*
|
||||
* Contact Information:
|
||||
* Intel Linux Wireless <linuxwifi@intel.com>
|
||||
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
|
||||
*
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
|
||||
* Copyright(c) 2016 - 2017 Intel Deutschland GmbH
|
||||
* Copyright(c) 2019 Intel Deutschland GmbH
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name Intel Corporation nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __iwl_fw_api_soc_h__
|
||||
#define __iwl_fw_api_soc_h__
|
||||
|
||||
#define SOC_CONFIG_CMD_FLAGS_DISCRETE BIT(0)
|
||||
#define SOC_CONFIG_CMD_FLAGS_LOW_LATENCY BIT(1)
|
||||
|
||||
/**
|
||||
* struct iwl_soc_configuration_cmd - Set device stabilization latency
|
||||
*
|
||||
* @flags: soc settings flags. In VER_1, we can only set the DISCRETE
|
||||
* flag, because the FW treats the whole value as an integer. In
|
||||
* VER_2, we can set the bits independently.
|
||||
* @latency: time for SOC to ensure stable power & XTAL
|
||||
*/
|
||||
struct iwl_soc_configuration_cmd {
|
||||
__le32 flags;
|
||||
__le32 latency;
|
||||
} __packed; /*
|
||||
* SOC_CONFIGURATION_CMD_S_VER_1 (see description above)
|
||||
* SOC_CONFIGURATION_CMD_S_VER_2
|
||||
*/
|
||||
|
||||
#endif /* __iwl_fw_api_soc_h__ */
|
@ -1108,6 +1108,38 @@ static int iwl_dump_ini_csr_iter(struct iwl_fw_runtime *fwrt,
|
||||
return sizeof(*range) + le32_to_cpu(range->range_data_size);
|
||||
}
|
||||
|
||||
static int iwl_dump_ini_config_iter(struct iwl_fw_runtime *fwrt,
|
||||
struct iwl_dump_ini_region_data *reg_data,
|
||||
void *range_ptr, int idx)
|
||||
{
|
||||
struct iwl_trans *trans = fwrt->trans;
|
||||
struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data;
|
||||
struct iwl_fw_ini_error_dump_range *range = range_ptr;
|
||||
__le32 *val = range->data;
|
||||
u32 addr = le32_to_cpu(reg->addrs[idx]) +
|
||||
le32_to_cpu(reg->dev_addr.offset);
|
||||
int i;
|
||||
|
||||
/* we shouldn't get here if the trans doesn't have read_config32 */
|
||||
if (WARN_ON_ONCE(!trans->ops->read_config32))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
range->internal_base_addr = cpu_to_le32(addr);
|
||||
range->range_data_size = reg->dev_addr.size;
|
||||
for (i = 0; i < le32_to_cpu(reg->dev_addr.size); i += 4) {
|
||||
int ret;
|
||||
u32 tmp;
|
||||
|
||||
ret = trans->ops->read_config32(trans, addr + i, &tmp);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
*val++ = cpu_to_le32(tmp);
|
||||
}
|
||||
|
||||
return sizeof(*range) + le32_to_cpu(range->range_data_size);
|
||||
}
|
||||
|
||||
static int iwl_dump_ini_dev_mem_iter(struct iwl_fw_runtime *fwrt,
|
||||
struct iwl_dump_ini_region_data *reg_data,
|
||||
void *range_ptr, int idx)
|
||||
@ -1701,13 +1733,7 @@ iwl_dump_ini_mon_smem_get_size(struct iwl_fw_runtime *fwrt,
|
||||
struct iwl_dump_ini_region_data *reg_data)
|
||||
{
|
||||
struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data;
|
||||
struct iwl_fw_ini_allocation_tlv *fw_mon_cfg;
|
||||
u32 alloc_id = le32_to_cpu(reg->internal_buffer.alloc_id), size;
|
||||
|
||||
fw_mon_cfg = &fwrt->trans->dbg.fw_mon_cfg[alloc_id];
|
||||
if (le32_to_cpu(fw_mon_cfg->buf_location) !=
|
||||
IWL_FW_INI_LOCATION_SRAM_PATH)
|
||||
return 0;
|
||||
u32 size;
|
||||
|
||||
size = le32_to_cpu(reg->internal_buffer.size);
|
||||
if (!size)
|
||||
@ -2048,7 +2074,12 @@ static const struct iwl_dump_ini_mem_ops iwl_dump_ini_region_ops[] = {
|
||||
.fill_range = iwl_dump_ini_csr_iter,
|
||||
},
|
||||
[IWL_FW_INI_REGION_DRAM_IMR] = {},
|
||||
[IWL_FW_INI_REGION_PCI_IOSF_CONFIG] = {},
|
||||
[IWL_FW_INI_REGION_PCI_IOSF_CONFIG] = {
|
||||
.get_num_of_ranges = iwl_dump_ini_mem_ranges,
|
||||
.get_size = iwl_dump_ini_mem_get_size,
|
||||
.fill_mem_hdr = iwl_dump_ini_mem_fill_header,
|
||||
.fill_range = iwl_dump_ini_config_iter,
|
||||
},
|
||||
};
|
||||
|
||||
static u32 iwl_dump_ini_trigger(struct iwl_fw_runtime *fwrt,
|
||||
|
@ -5,11 +5,9 @@
|
||||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
|
||||
* Copyright(c) 2016 - 2017 Intel Deutschland GmbH
|
||||
* Copyright(c) 2018 Intel Corporation
|
||||
* Copyright(c) 2019 Intel Corporation
|
||||
* Copyright(c) 2008 - 2014, 2018 - 2020 Intel Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
@ -29,11 +27,9 @@
|
||||
*
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
|
||||
* Copyright(c) 2016 - 2017 Intel Deutschland GmbH
|
||||
* Copyright(c) 2018 Intel Corporation
|
||||
* Copyright(c) 2019 Intel Corporation
|
||||
* Copyright(c) 2008 - 2014, 2018 - 2020 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -369,6 +365,8 @@ typedef unsigned int __bitwise iwl_ucode_tlv_capa_t;
|
||||
* is supported.
|
||||
* @IWL_UCODE_TLV_CAPA_BT_COEX_RRC: supports BT Coex RRC
|
||||
* @IWL_UCODE_TLV_CAPA_GSCAN_SUPPORT: supports gscan (no longer used)
|
||||
* @IWL_UCODE_TLV_CAPA_SOC_LATENCY_SUPPORT: the firmware supports setting
|
||||
* stabilization latency for SoCs.
|
||||
* @IWL_UCODE_TLV_CAPA_STA_PM_NOTIF: firmware will send STA PM notification
|
||||
* @IWL_UCODE_TLV_CAPA_TLC_OFFLOAD: firmware implements rate scaling algorithm
|
||||
* @IWL_UCODE_TLV_CAPA_DYNAMIC_QUOTA: firmware implements quota related
|
||||
@ -437,6 +435,7 @@ enum iwl_ucode_tlv_capa {
|
||||
IWL_UCODE_TLV_CAPA_GSCAN_SUPPORT = (__force iwl_ucode_tlv_capa_t)31,
|
||||
|
||||
/* set 1 */
|
||||
IWL_UCODE_TLV_CAPA_SOC_LATENCY_SUPPORT = (__force iwl_ucode_tlv_capa_t)37,
|
||||
IWL_UCODE_TLV_CAPA_STA_PM_NOTIF = (__force iwl_ucode_tlv_capa_t)38,
|
||||
IWL_UCODE_TLV_CAPA_BINDING_CDB_SUPPORT = (__force iwl_ucode_tlv_capa_t)39,
|
||||
IWL_UCODE_TLV_CAPA_CDB_SUPPORT = (__force iwl_ucode_tlv_capa_t)40,
|
||||
|
@ -69,8 +69,6 @@
|
||||
#include "iwl-eeprom-parse.h"
|
||||
#include "fw/acpi.h"
|
||||
|
||||
#define IWL_FW_DBG_DOMAIN IWL_TRANS_FW_DBG_DOMAIN(fwrt->trans)
|
||||
|
||||
struct iwl_fw_runtime_ops {
|
||||
int (*dump_start)(void *ctx);
|
||||
void (*dump_end)(void *ctx);
|
||||
|
@ -287,27 +287,36 @@ struct iwl_pwr_tx_backoff {
|
||||
/**
|
||||
* struct iwl_cfg_trans - information needed to start the trans
|
||||
*
|
||||
* These values cannot be changed when multiple configs are used for a
|
||||
* single PCI ID, because they are needed before the HW REV or RFID
|
||||
* can be read.
|
||||
* These values are specific to the device ID and do not change when
|
||||
* multiple configs are used for a single device ID. They values are
|
||||
* used, among other things, to boot the NIC so that the HW REV or
|
||||
* RFID can be read before deciding the remaining parameters to use.
|
||||
*
|
||||
* @base_params: pointer to basic parameters
|
||||
* @csr: csr flags and addresses that are different across devices
|
||||
* @device_family: the device family
|
||||
* @umac_prph_offset: offset to add to UMAC periphery address
|
||||
* @xtal_latency: power up latency to get the xtal stabilized
|
||||
* @extra_phy_cfg_flags: extra configuration flags to pass to the PHY
|
||||
* @rf_id: need to read rf_id to determine the firmware image
|
||||
* @use_tfh: use TFH
|
||||
* @gen2: 22000 and on transport operation
|
||||
* @mq_rx_supported: multi-queue rx support
|
||||
* @integrated: discrete or integrated
|
||||
* @low_latency_xtal: use the low latency xtal if supported
|
||||
*/
|
||||
struct iwl_cfg_trans_params {
|
||||
const struct iwl_base_params *base_params;
|
||||
enum iwl_device_family device_family;
|
||||
u32 umac_prph_offset;
|
||||
u32 xtal_latency;
|
||||
u32 extra_phy_cfg_flags;
|
||||
u32 rf_id:1,
|
||||
use_tfh:1,
|
||||
gen2:1,
|
||||
mq_rx_supported:1,
|
||||
integrated:1,
|
||||
low_latency_xtal:1,
|
||||
bisr_workaround:1;
|
||||
};
|
||||
|
||||
@ -374,7 +383,6 @@ struct iwl_fw_mon_regs {
|
||||
* @smem_offset: offset from which the SMEM begins
|
||||
* @smem_len: the length of SMEM
|
||||
* @vht_mu_mimo_supported: VHT MU-MIMO support
|
||||
* @integrated: discrete or integrated
|
||||
* @cdb: CDB support
|
||||
* @nvm_type: see &enum iwl_nvm_type
|
||||
* @d3_debug_data_base_addr: base address where D3 debug data is stored
|
||||
@ -413,7 +421,6 @@ struct iwl_cfg {
|
||||
u32 dccm2_len;
|
||||
u32 smem_offset;
|
||||
u32 smem_len;
|
||||
u32 soc_latency;
|
||||
u16 nvm_ver;
|
||||
u16 nvm_calib_ver;
|
||||
u32 rx_with_siso_diversity:1,
|
||||
@ -427,7 +434,6 @@ struct iwl_cfg {
|
||||
disable_dummy_notification:1,
|
||||
apmg_not_supported:1,
|
||||
vht_mu_mimo_supported:1,
|
||||
integrated:1,
|
||||
cdb:1,
|
||||
dbgc_supported:1,
|
||||
uhb_supported:1;
|
||||
@ -442,7 +448,6 @@ struct iwl_cfg {
|
||||
u8 ucode_api_min;
|
||||
u16 num_rbds;
|
||||
u32 min_umac_error_event_table;
|
||||
u32 extra_phy_cfg_flags;
|
||||
u32 d3_debug_data_base_addr;
|
||||
u32 d3_debug_data_length;
|
||||
u32 min_txq_size;
|
||||
@ -458,6 +463,8 @@ struct iwl_cfg {
|
||||
#define IWL_CFG_MAC_TYPE_PNJ 0x32
|
||||
#define IWL_CFG_MAC_TYPE_TH 0x32
|
||||
#define IWL_CFG_MAC_TYPE_QU 0x33
|
||||
#define IWL_CFG_MAC_TYPE_QUZ 0x35
|
||||
#define IWL_CFG_MAC_TYPE_QNJ 0x36
|
||||
|
||||
#define IWL_CFG_RF_TYPE_TH 0x105
|
||||
#define IWL_CFG_RF_TYPE_TH1 0x108
|
||||
@ -485,6 +492,7 @@ struct iwl_dev_info {
|
||||
u16 subdevice;
|
||||
u16 mac_type;
|
||||
u16 rf_type;
|
||||
u8 mac_step;
|
||||
u8 rf_id;
|
||||
u8 no_160;
|
||||
u8 cores;
|
||||
@ -496,6 +504,11 @@ struct iwl_dev_info {
|
||||
* This list declares the config structures for all devices.
|
||||
*/
|
||||
extern const struct iwl_cfg_trans_params iwl9000_trans_cfg;
|
||||
extern const struct iwl_cfg_trans_params iwl9560_trans_cfg;
|
||||
extern const struct iwl_cfg_trans_params iwl9560_shared_clk_trans_cfg;
|
||||
extern const struct iwl_cfg_trans_params iwl_qu_trans_cfg;
|
||||
extern const struct iwl_cfg_trans_params iwl_qu_long_latency_trans_cfg;
|
||||
extern const struct iwl_cfg_trans_params iwl_qnj_trans_cfg;
|
||||
extern const struct iwl_cfg_trans_params iwl_ax200_trans_cfg;
|
||||
extern const char iwl9162_name[];
|
||||
extern const char iwl9260_name[];
|
||||
@ -583,27 +596,14 @@ extern const struct iwl_cfg iwl8265_2ac_cfg;
|
||||
extern const struct iwl_cfg iwl8275_2ac_cfg;
|
||||
extern const struct iwl_cfg iwl4165_2ac_cfg;
|
||||
extern const struct iwl_cfg iwl9260_2ac_cfg;
|
||||
extern const struct iwl_cfg iwl9260_2ac_160_cfg;
|
||||
extern const struct iwl_cfg iwl9260_killer_2ac_cfg;
|
||||
extern const struct iwl_cfg iwl9270_2ac_cfg;
|
||||
extern const struct iwl_cfg iwl9560_2ac_cfg;
|
||||
extern const struct iwl_cfg iwl9560_2ac_cfg_quz_a0_jf_b0_soc;
|
||||
extern const struct iwl_cfg iwl9560_2ac_160_cfg_quz_a0_jf_b0_soc;
|
||||
extern const struct iwl_cfg iwl9461_2ac_cfg_quz_a0_jf_b0_soc;
|
||||
extern const struct iwl_cfg iwl9462_2ac_cfg_quz_a0_jf_b0_soc;
|
||||
extern const struct iwl_cfg iwl9560_qu_b0_jf_b0_cfg;
|
||||
extern const struct iwl_cfg iwl9560_qu_c0_jf_b0_cfg;
|
||||
extern const struct iwl_cfg iwl9560_quz_a0_jf_b0_cfg;
|
||||
extern const struct iwl_cfg iwl9560_qnj_b0_jf_b0_cfg;
|
||||
extern const struct iwl_cfg iwl9560_2ac_cfg_soc;
|
||||
extern const struct iwl_cfg iwl9560_killer_i_2ac_cfg_quz_a0_jf_b0_soc;
|
||||
extern const struct iwl_cfg iwl9560_killer_s_2ac_cfg_quz_a0_jf_b0_soc;
|
||||
extern const struct iwl_cfg iwl9461_2ac_cfg_shared_clk;
|
||||
extern const struct iwl_cfg iwl9462_2ac_cfg_shared_clk;
|
||||
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 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;
|
||||
extern const struct iwl_cfg iwl22000_2ax_cfg_hr;
|
||||
extern const struct iwl_cfg iwl_ax200_cfg_cc;
|
||||
extern const struct iwl_cfg iwl_ax201_cfg_qu_hr;
|
||||
extern const struct iwl_cfg iwl_ax201_cfg_qu_hr;
|
||||
@ -617,22 +617,8 @@ extern const struct iwl_cfg killer1650s_2ax_cfg_qu_c0_hr_b0;
|
||||
extern const struct iwl_cfg killer1650i_2ax_cfg_qu_c0_hr_b0;
|
||||
extern const struct iwl_cfg killer1650x_2ax_cfg;
|
||||
extern const struct iwl_cfg killer1650w_2ax_cfg;
|
||||
extern const struct iwl_cfg iwl9461_2ac_cfg_qu_b0_jf_b0;
|
||||
extern const struct iwl_cfg iwl9462_2ac_cfg_qu_b0_jf_b0;
|
||||
extern const struct iwl_cfg iwl9560_2ac_cfg_qu_b0_jf_b0;
|
||||
extern const struct iwl_cfg iwl9560_2ac_160_cfg_qu_b0_jf_b0;
|
||||
extern const struct iwl_cfg iwl9461_2ac_cfg_qu_c0_jf_b0;
|
||||
extern const struct iwl_cfg iwl9462_2ac_cfg_qu_c0_jf_b0;
|
||||
extern const struct iwl_cfg iwl9560_2ac_cfg_qu_c0_jf_b0;
|
||||
extern const struct iwl_cfg iwl9560_2ac_160_cfg_qu_c0_jf_b0;
|
||||
extern const struct iwl_cfg killer1550i_2ac_cfg_qu_b0_jf_b0;
|
||||
extern const struct iwl_cfg killer1550s_2ac_cfg_qu_b0_jf_b0;
|
||||
extern const struct iwl_cfg iwl22000_2ax_cfg_jf;
|
||||
extern const struct iwl_cfg iwl22000_2ax_cfg_qnj_hr_a0_f0;
|
||||
extern const struct iwl_cfg iwl22000_2ax_cfg_qnj_hr_b0_f0;
|
||||
extern const struct iwl_cfg iwl22000_2ax_cfg_qnj_hr_b0;
|
||||
extern const struct iwl_cfg iwl9560_2ac_cfg_qnj_jf_b0;
|
||||
extern const struct iwl_cfg iwl22000_2ax_cfg_qnj_hr_a0;
|
||||
extern const struct iwl_cfg iwlax210_2ax_cfg_so_jf_a0;
|
||||
extern const struct iwl_cfg iwlax210_2ax_cfg_so_hr_a0;
|
||||
extern const struct iwl_cfg iwlax211_2ax_cfg_so_gf_a0;
|
||||
|
@ -236,6 +236,12 @@ static int iwl_dbg_tlv_alloc_region(struct iwl_trans *trans,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (type == IWL_FW_INI_REGION_PCI_IOSF_CONFIG &&
|
||||
!trans->ops->read_config32) {
|
||||
IWL_ERR(trans, "WRT: Unsupported region type %u\n", type);
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
active_reg = &trans->dbg.active_regions[id];
|
||||
if (*active_reg) {
|
||||
IWL_WARN(trans, "WRT: Overriding region id %u\n", id);
|
||||
|
@ -1715,6 +1715,7 @@ struct iwl_mod_params iwlwifi_mod_params = {
|
||||
.bt_coex_active = true,
|
||||
.power_level = IWL_POWER_INDEX_1,
|
||||
.uapsd_disable = IWL_DISABLE_UAPSD_BSS | IWL_DISABLE_UAPSD_P2P_CLIENT,
|
||||
.enable_ini = true,
|
||||
/* the rest are 0 by default */
|
||||
};
|
||||
IWL_EXPORT_SYMBOL(iwlwifi_mod_params);
|
||||
@ -1837,7 +1838,7 @@ MODULE_PARM_DESC(uapsd_disable,
|
||||
module_param_named(enable_ini, iwlwifi_mod_params.enable_ini,
|
||||
bool, S_IRUGO | S_IWUSR);
|
||||
MODULE_PARM_DESC(enable_ini,
|
||||
"Enable debug INI TLV FW debug infrastructure (default: 0");
|
||||
"Enable debug INI TLV FW debug infrastructure (default: true");
|
||||
|
||||
/*
|
||||
* set bt_coex_active to true, uCode will do kill/defer
|
||||
|
@ -684,7 +684,9 @@ static struct ieee80211_sband_iftype_data iwl_he_capa[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static void iwl_init_he_hw_capab(struct ieee80211_supported_band *sband,
|
||||
static void iwl_init_he_hw_capab(struct iwl_trans *trans,
|
||||
struct iwl_nvm_data *data,
|
||||
struct ieee80211_supported_band *sband,
|
||||
u8 tx_chains, u8 rx_chains)
|
||||
{
|
||||
sband->iftype_data = iwl_he_capa;
|
||||
@ -728,7 +730,7 @@ static void iwl_init_sbands(struct iwl_trans *trans,
|
||||
tx_chains, rx_chains);
|
||||
|
||||
if (data->sku_cap_11ax_enable && !iwlwifi_mod_params.disable_11ax)
|
||||
iwl_init_he_hw_capab(sband, tx_chains, rx_chains);
|
||||
iwl_init_he_hw_capab(trans, data, sband, tx_chains, rx_chains);
|
||||
|
||||
sband = &data->bands[NL80211_BAND_5GHZ];
|
||||
sband->band = NL80211_BAND_5GHZ;
|
||||
@ -743,7 +745,7 @@ static void iwl_init_sbands(struct iwl_trans *trans,
|
||||
tx_chains, rx_chains);
|
||||
|
||||
if (data->sku_cap_11ax_enable && !iwlwifi_mod_params.disable_11ax)
|
||||
iwl_init_he_hw_capab(sband, tx_chains, rx_chains);
|
||||
iwl_init_he_hw_capab(trans, data, sband, tx_chains, rx_chains);
|
||||
|
||||
if (n_channels != n_used)
|
||||
IWL_ERR_DEV(dev, "NVM: used only %d of %d channels\n",
|
||||
|
@ -544,6 +544,8 @@ struct iwl_trans_rxq_dma_data {
|
||||
* @read_mem: read device's SRAM in DWORD
|
||||
* @write_mem: write device's SRAM in DWORD. If %buf is %NULL, then the memory
|
||||
* will be zeroed.
|
||||
* @read_config32: read a u32 value from the device's config space at
|
||||
* the given offset.
|
||||
* @configure: configure parameters required by the transport layer from
|
||||
* the op_mode. May be called several times before start_fw, can't be
|
||||
* called after that.
|
||||
@ -614,6 +616,7 @@ struct iwl_trans_ops {
|
||||
void *buf, int dwords);
|
||||
int (*write_mem)(struct iwl_trans *trans, u32 addr,
|
||||
const void *buf, int dwords);
|
||||
int (*read_config32)(struct iwl_trans *trans, u32 ofs, u32 *val);
|
||||
void (*configure)(struct iwl_trans *trans,
|
||||
const struct iwl_trans_config *trans_cfg);
|
||||
void (*set_pmi)(struct iwl_trans *trans, bool state);
|
||||
|
@ -1709,6 +1709,7 @@ iwl_mvm_netdetect_query_results(struct iwl_mvm *mvm,
|
||||
};
|
||||
int ret, len;
|
||||
size_t query_len, matches_len;
|
||||
int max_profiles = iwl_umac_scan_get_max_profiles(mvm->fw);
|
||||
|
||||
ret = iwl_mvm_send_cmd(mvm, &cmd);
|
||||
if (ret) {
|
||||
@ -1720,11 +1721,11 @@ iwl_mvm_netdetect_query_results(struct iwl_mvm *mvm,
|
||||
IWL_UCODE_TLV_API_SCAN_OFFLOAD_CHANS)) {
|
||||
query_len = sizeof(struct iwl_scan_offload_profiles_query);
|
||||
matches_len = sizeof(struct iwl_scan_offload_profile_match) *
|
||||
IWL_SCAN_MAX_PROFILES;
|
||||
max_profiles;
|
||||
} else {
|
||||
query_len = sizeof(struct iwl_scan_offload_profiles_query_v1);
|
||||
matches_len = sizeof(struct iwl_scan_offload_profile_match_v1) *
|
||||
IWL_SCAN_MAX_PROFILES;
|
||||
max_profiles;
|
||||
}
|
||||
|
||||
len = iwl_rx_packet_payload_len(cmd.resp_pkt);
|
||||
|
@ -461,6 +461,8 @@ static ssize_t iwl_dbgfs_rs_data_read(struct file *file, char __user *user_buf,
|
||||
|
||||
desc += rs_pretty_print_rate(buff + desc, bufsz - desc,
|
||||
lq_sta->last_rate_n_flags);
|
||||
if (desc < bufsz - 1)
|
||||
buff[desc++] = '\n';
|
||||
mutex_unlock(&mvm->mutex);
|
||||
|
||||
ret = simple_read_from_buffer(user_buf, count, ppos, buff, desc);
|
||||
@ -1013,6 +1015,8 @@ static ssize_t iwl_dbgfs_frame_stats_read(struct iwl_mvm *mvm,
|
||||
(int)(ARRAY_SIZE(stats->last_rates) - i));
|
||||
pos += rs_pretty_print_rate(pos, endpos - pos,
|
||||
stats->last_rates[idx]);
|
||||
if (pos < endpos - 1)
|
||||
*pos++ = '\n';
|
||||
}
|
||||
spin_unlock_bh(&mvm->drv_stats_lock);
|
||||
|
||||
|
@ -278,6 +278,10 @@ iwl_mvm_ftm_target_chandef_v2(struct iwl_mvm *mvm,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* non EDCA based measurement must use HE preamble */
|
||||
if (peer->ftm.trigger_based || peer->ftm.non_trigger_based)
|
||||
*format_bw |= IWL_LOCATION_FRAME_FORMAT_HE;
|
||||
|
||||
*ctrl_ch_position = (peer->chandef.width > NL80211_CHAN_WIDTH_20) ?
|
||||
iwl_mvm_get_ctrl_pos(&peer->chandef) : 0;
|
||||
|
||||
@ -349,6 +353,11 @@ iwl_mvm_ftm_put_target_common(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);
|
||||
|
||||
if (peer->ftm.trigger_based)
|
||||
FTM_PUT_FLAG(TB);
|
||||
else if (peer->ftm.non_trigger_based)
|
||||
FTM_PUT_FLAG(NON_TB);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -73,6 +73,7 @@
|
||||
#include "fw/api/datapath.h"
|
||||
#include "fw/api/phy.h"
|
||||
#include "fw/api/config.h"
|
||||
#include "fw/api/soc.h"
|
||||
#include "fw/api/alive.h"
|
||||
#include "fw/api/binding.h"
|
||||
#include "fw/api/cmdhdr.h"
|
||||
|
@ -5,10 +5,9 @@
|
||||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
|
||||
* Copyright(c) 2016 - 2017 Intel Deutschland GmbH
|
||||
* Copyright(c) 2018 - 2019 Intel Corporation
|
||||
* Copyright(c) 2012 - 2014, 2018 - 2020 Intel Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
@ -28,10 +27,9 @@
|
||||
*
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
|
||||
* Copyright(c) 2016 - 2017 Intel Deutschland GmbH
|
||||
* Copyright(c) 2018 - 2019 Intel Corporation
|
||||
* Copyright(c) 2012 - 2014, 2018 - 2020 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -89,6 +87,36 @@ struct iwl_mvm_alive_data {
|
||||
u32 scd_base_addr;
|
||||
};
|
||||
|
||||
/* set device type and latency */
|
||||
static int iwl_set_soc_latency(struct iwl_mvm *mvm)
|
||||
{
|
||||
struct iwl_soc_configuration_cmd cmd = {};
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* In VER_1 of this command, the discrete value is considered
|
||||
* an integer; In VER_2, it's a bitmask. Since we have only 2
|
||||
* values in VER_1, this is backwards-compatible with VER_2,
|
||||
* as long as we don't set any other bits.
|
||||
*/
|
||||
if (!mvm->trans->trans_cfg->integrated)
|
||||
cmd.flags = cpu_to_le32(SOC_CONFIG_CMD_FLAGS_DISCRETE);
|
||||
|
||||
if (iwl_mvm_lookup_cmd_ver(mvm->fw, IWL_ALWAYS_LONG_GROUP,
|
||||
SCAN_REQ_UMAC) >= 2 &&
|
||||
(mvm->trans->trans_cfg->low_latency_xtal))
|
||||
cmd.flags |= cpu_to_le32(SOC_CONFIG_CMD_FLAGS_LOW_LATENCY);
|
||||
|
||||
cmd.latency = cpu_to_le32(mvm->trans->trans_cfg->xtal_latency);
|
||||
|
||||
ret = iwl_mvm_send_cmd_pdu(mvm, iwl_cmd_id(SOC_CONFIGURATION_CMD,
|
||||
SYSTEM_GROUP, 0), 0,
|
||||
sizeof(cmd), &cmd);
|
||||
if (ret)
|
||||
IWL_ERR(mvm, "Failed to set soc latency: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int iwl_send_tx_ant_cfg(struct iwl_mvm *mvm, u8 valid_tx_ant)
|
||||
{
|
||||
struct iwl_tx_ant_cfg_cmd tx_ant_cmd = {
|
||||
@ -544,7 +572,8 @@ static int iwl_send_phy_cfg_cmd(struct iwl_mvm *mvm)
|
||||
phy_cfg_cmd.phy_cfg = cpu_to_le32(iwl_mvm_get_phy_config(mvm));
|
||||
|
||||
/* set flags extra PHY configuration flags from the device's cfg */
|
||||
phy_cfg_cmd.phy_cfg |= cpu_to_le32(mvm->cfg->extra_phy_cfg_flags);
|
||||
phy_cfg_cmd.phy_cfg |=
|
||||
cpu_to_le32(mvm->trans->trans_cfg->extra_phy_cfg_flags);
|
||||
|
||||
phy_cfg_cmd.calib_control.event_trigger =
|
||||
mvm->fw->default_calib[ucode_type].event_trigger;
|
||||
@ -1110,6 +1139,13 @@ int iwl_mvm_up(struct iwl_mvm *mvm)
|
||||
if (ret)
|
||||
goto error;
|
||||
|
||||
if (fw_has_capa(&mvm->fw->ucode_capa,
|
||||
IWL_UCODE_TLV_CAPA_SOC_LATENCY_SUPPORT)) {
|
||||
ret = iwl_set_soc_latency(mvm);
|
||||
if (ret)
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* Init RSS configuration */
|
||||
if (mvm->trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_22000) {
|
||||
ret = iwl_configure_rxq(mvm);
|
||||
|
@ -193,6 +193,8 @@ static const struct cfg80211_pmsr_capabilities iwl_mvm_pmsr_capa = {
|
||||
.non_asap = 1,
|
||||
.request_lci = 1,
|
||||
.request_civicloc = 1,
|
||||
.trigger_based = 1,
|
||||
.non_trigger_based = 1,
|
||||
.max_bursts_exponent = -1, /* all supported */
|
||||
.max_ftms_per_burst = 0, /* no limits */
|
||||
.bandwidths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
|
||||
@ -201,7 +203,8 @@ static const struct cfg80211_pmsr_capabilities iwl_mvm_pmsr_capa = {
|
||||
BIT(NL80211_CHAN_WIDTH_80),
|
||||
.preambles = BIT(NL80211_PREAMBLE_LEGACY) |
|
||||
BIT(NL80211_PREAMBLE_HT) |
|
||||
BIT(NL80211_PREAMBLE_VHT),
|
||||
BIT(NL80211_PREAMBLE_VHT) |
|
||||
BIT(NL80211_PREAMBLE_HE),
|
||||
},
|
||||
};
|
||||
|
||||
@ -614,7 +617,7 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
|
||||
|
||||
hw->wiphy->max_sched_scan_reqs = 1;
|
||||
hw->wiphy->max_sched_scan_ssids = PROBE_OPTION_MAX;
|
||||
hw->wiphy->max_match_sets = IWL_SCAN_MAX_PROFILES;
|
||||
hw->wiphy->max_match_sets = iwl_umac_scan_get_max_profiles(mvm->fw);
|
||||
/* we create the 802.11 header and zero length SSID IE. */
|
||||
hw->wiphy->max_sched_scan_ie_len =
|
||||
SCAN_OFFLOAD_PROBE_REQ_SIZE - 24 - 2;
|
||||
@ -702,7 +705,8 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
|
||||
mvm->wowlan.n_patterns = IWL_WOWLAN_MAX_PATTERNS;
|
||||
mvm->wowlan.pattern_min_len = IWL_WOWLAN_MIN_PATTERN_LEN;
|
||||
mvm->wowlan.pattern_max_len = IWL_WOWLAN_MAX_PATTERN_LEN;
|
||||
mvm->wowlan.max_nd_match_sets = IWL_SCAN_MAX_PROFILES;
|
||||
mvm->wowlan.max_nd_match_sets =
|
||||
iwl_umac_scan_get_max_profiles(mvm->fw);
|
||||
hw->wiphy->wowlan = &mvm->wowlan;
|
||||
}
|
||||
#endif
|
||||
|
@ -2147,4 +2147,11 @@ iwl_mvm_set_chan_info_chandef(struct iwl_mvm *mvm,
|
||||
iwl_mvm_get_ctrl_pos(chandef));
|
||||
}
|
||||
|
||||
static inline int iwl_umac_scan_get_max_profiles(const struct iwl_fw *fw)
|
||||
{
|
||||
u8 ver = iwl_mvm_lookup_cmd_ver(fw, IWL_ALWAYS_LONG_GROUP,
|
||||
SCAN_OFFLOAD_UPDATE_PROFILES_CMD);
|
||||
return (ver == IWL_FW_CMD_VER_UNKNOWN || ver < 3) ?
|
||||
IWL_SCAN_MAX_PROFILES : IWL_SCAN_MAX_PROFILES_V2;
|
||||
}
|
||||
#endif /* __IWL_MVM_H__ */
|
||||
|
@ -416,8 +416,7 @@ u16 rs_fw_get_max_amsdu_len(struct ieee80211_sta *sta)
|
||||
return IEEE80211_MAX_MPDU_LEN_VHT_7991;
|
||||
default:
|
||||
return IEEE80211_MAX_MPDU_LEN_VHT_3895;
|
||||
}
|
||||
|
||||
}
|
||||
} else if (ht_cap->ht_supported) {
|
||||
if (ht_cap->cap & IEEE80211_HT_CAP_MAX_AMSDU)
|
||||
/*
|
||||
|
@ -3697,7 +3697,7 @@ int rs_pretty_print_rate(char *buf, int bufsz, const u32 rate)
|
||||
!(rate & RATE_MCS_HE_MSK)) {
|
||||
int index = iwl_hwrate_to_plcp_idx(rate);
|
||||
|
||||
return scnprintf(buf, bufsz, "Legacy | ANT: %s Rate: %s Mbps\n",
|
||||
return scnprintf(buf, bufsz, "Legacy | ANT: %s Rate: %s Mbps",
|
||||
rs_pretty_ant(ant),
|
||||
index == IWL_RATE_INVALID ? "BAD" :
|
||||
iwl_rate_mcs[index].mbps);
|
||||
@ -3740,7 +3740,7 @@ int rs_pretty_print_rate(char *buf, int bufsz, const u32 rate)
|
||||
}
|
||||
|
||||
return scnprintf(buf, bufsz,
|
||||
"0x%x: %s | ANT: %s BW: %s MCS: %d NSS: %d %s%s%s%s\n",
|
||||
"0x%x: %s | ANT: %s BW: %s MCS: %d NSS: %d %s%s%s%s",
|
||||
rate, type, rs_pretty_ant(ant), bw, mcs, nss,
|
||||
(rate & RATE_MCS_SGI_MSK) ? "SGI " : "NGI ",
|
||||
(rate & RATE_MCS_STBC_MSK) ? "STBC " : "",
|
||||
@ -3888,6 +3888,8 @@ static ssize_t rs_sta_dbgfs_scale_table_read(struct file *file,
|
||||
desc += scnprintf(buff + desc, bufsz - desc,
|
||||
" rate[%d] 0x%X ", i, r);
|
||||
desc += rs_pretty_print_rate(buff + desc, bufsz - desc, r);
|
||||
if (desc < bufsz - 1)
|
||||
buff[desc++] = '\n';
|
||||
}
|
||||
|
||||
ret = simple_read_from_buffer(user_buf, count, ppos, buff, desc);
|
||||
|
@ -91,8 +91,14 @@
|
||||
#define IWL_SCAN_ADWELL_DEFAULT_N_APS_SOCIAL 10
|
||||
/* number of scan channels */
|
||||
#define IWL_SCAN_NUM_CHANNELS 112
|
||||
/* adaptive dwell default number of APs override */
|
||||
#define IWL_SCAN_ADWELL_DEFAULT_N_APS_OVERRIDE 10
|
||||
/* adaptive dwell number of APs override mask for p2p friendly GO */
|
||||
#define IWL_SCAN_ADWELL_N_APS_GO_FRIENDLY_BIT BIT(20)
|
||||
/* adaptive dwell number of APs override mask for social channels */
|
||||
#define IWL_SCAN_ADWELL_N_APS_SOCIAL_CHS_BIT BIT(21)
|
||||
/* adaptive dwell number of APs override for p2p friendly GO channels */
|
||||
#define IWL_SCAN_ADWELL_N_APS_GO_FRIENDLY 10
|
||||
/* adaptive dwell number of APs override for social channels */
|
||||
#define IWL_SCAN_ADWELL_N_APS_SOCIAL_CHS 2
|
||||
|
||||
struct iwl_mvm_scan_timing_params {
|
||||
u32 suspend_time;
|
||||
@ -588,11 +594,15 @@ iwl_mvm_config_sched_scan_profiles(struct iwl_mvm *mvm,
|
||||
struct cfg80211_sched_scan_request *req)
|
||||
{
|
||||
struct iwl_scan_offload_profile *profile;
|
||||
struct iwl_scan_offload_profile_cfg *profile_cfg;
|
||||
struct iwl_scan_offload_profile_cfg_v1 *profile_cfg_v1;
|
||||
struct iwl_scan_offload_blacklist *blacklist;
|
||||
struct iwl_scan_offload_profile_cfg_data *data;
|
||||
int max_profiles = iwl_umac_scan_get_max_profiles(mvm->fw);
|
||||
int profile_cfg_size = sizeof(*data) +
|
||||
sizeof(*profile) * max_profiles;
|
||||
struct iwl_host_cmd cmd = {
|
||||
.id = SCAN_OFFLOAD_UPDATE_PROFILES_CMD,
|
||||
.len[1] = sizeof(*profile_cfg),
|
||||
.len[1] = profile_cfg_size,
|
||||
.dataflags[0] = IWL_HCMD_DFL_NOCOPY,
|
||||
.dataflags[1] = IWL_HCMD_DFL_NOCOPY,
|
||||
};
|
||||
@ -600,7 +610,7 @@ iwl_mvm_config_sched_scan_profiles(struct iwl_mvm *mvm,
|
||||
int i;
|
||||
int ret;
|
||||
|
||||
if (WARN_ON(req->n_match_sets > IWL_SCAN_MAX_PROFILES))
|
||||
if (WARN_ON(req->n_match_sets > max_profiles))
|
||||
return -EIO;
|
||||
|
||||
if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_SHORT_BL)
|
||||
@ -612,27 +622,37 @@ iwl_mvm_config_sched_scan_profiles(struct iwl_mvm *mvm,
|
||||
if (!blacklist)
|
||||
return -ENOMEM;
|
||||
|
||||
profile_cfg = kzalloc(sizeof(*profile_cfg), GFP_KERNEL);
|
||||
if (!profile_cfg) {
|
||||
profile_cfg_v1 = kzalloc(profile_cfg_size, GFP_KERNEL);
|
||||
if (!profile_cfg_v1) {
|
||||
ret = -ENOMEM;
|
||||
goto free_blacklist;
|
||||
}
|
||||
|
||||
cmd.data[0] = blacklist;
|
||||
cmd.len[0] = sizeof(*blacklist) * blacklist_len;
|
||||
cmd.data[1] = profile_cfg;
|
||||
cmd.data[1] = profile_cfg_v1;
|
||||
|
||||
/* if max_profile is MAX_PROFILES_V2, we have the new API */
|
||||
if (max_profiles == IWL_SCAN_MAX_PROFILES_V2) {
|
||||
struct iwl_scan_offload_profile_cfg *profile_cfg =
|
||||
(struct iwl_scan_offload_profile_cfg *)profile_cfg_v1;
|
||||
|
||||
data = &profile_cfg->data;
|
||||
} else {
|
||||
data = &profile_cfg_v1->data;
|
||||
}
|
||||
|
||||
/* No blacklist configuration */
|
||||
data->num_profiles = req->n_match_sets;
|
||||
data->active_clients = SCAN_CLIENT_SCHED_SCAN;
|
||||
data->pass_match = SCAN_CLIENT_SCHED_SCAN;
|
||||
data->match_notify = SCAN_CLIENT_SCHED_SCAN;
|
||||
|
||||
profile_cfg->num_profiles = req->n_match_sets;
|
||||
profile_cfg->active_clients = SCAN_CLIENT_SCHED_SCAN;
|
||||
profile_cfg->pass_match = SCAN_CLIENT_SCHED_SCAN;
|
||||
profile_cfg->match_notify = SCAN_CLIENT_SCHED_SCAN;
|
||||
if (!req->n_match_sets || !req->match_sets[0].ssid.ssid_len)
|
||||
profile_cfg->any_beacon_notify = SCAN_CLIENT_SCHED_SCAN;
|
||||
data->any_beacon_notify = SCAN_CLIENT_SCHED_SCAN;
|
||||
|
||||
for (i = 0; i < req->n_match_sets; i++) {
|
||||
profile = &profile_cfg->profiles[i];
|
||||
profile = &profile_cfg_v1->profiles[i];
|
||||
profile->ssid_index = i;
|
||||
/* Support any cipher and auth algorithm */
|
||||
profile->unicast_cipher = 0xff;
|
||||
@ -645,7 +665,7 @@ iwl_mvm_config_sched_scan_profiles(struct iwl_mvm *mvm,
|
||||
IWL_DEBUG_SCAN(mvm, "Sending scheduled scan profile config\n");
|
||||
|
||||
ret = iwl_mvm_send_cmd(mvm, &cmd);
|
||||
kfree(profile_cfg);
|
||||
kfree(profile_cfg_v1);
|
||||
free_blacklist:
|
||||
kfree(blacklist);
|
||||
|
||||
@ -1529,14 +1549,19 @@ static int iwl_mvm_scan_ch_and_band_to_idx(u8 channel_id, u8 band)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static const u8 p2p_go_friendly_chs[] = {
|
||||
36, 40, 44, 48, 149, 153, 157, 161, 165,
|
||||
};
|
||||
|
||||
static const u8 social_chs[] = {
|
||||
1, 6, 11
|
||||
};
|
||||
|
||||
static void iwl_mvm_scan_ch_add_n_aps_override(enum nl80211_iftype vif_type,
|
||||
u8 ch_id, u8 band, u8 *ch_bitmap,
|
||||
size_t bitmap_n_entries)
|
||||
{
|
||||
int i;
|
||||
static const u8 p2p_go_friendly_chs[] = {
|
||||
36, 40, 44, 48, 149, 153, 157, 161, 165,
|
||||
};
|
||||
|
||||
if (vif_type != NL80211_IFTYPE_P2P_DEVICE)
|
||||
return;
|
||||
@ -1561,6 +1586,35 @@ static void iwl_mvm_scan_ch_add_n_aps_override(enum nl80211_iftype vif_type,
|
||||
}
|
||||
}
|
||||
|
||||
static u32 iwl_mvm_scan_ch_n_aps_flag(enum nl80211_iftype vif_type, u8 ch_id)
|
||||
{
|
||||
int i;
|
||||
u32 flags = 0;
|
||||
|
||||
if (vif_type != NL80211_IFTYPE_P2P_DEVICE)
|
||||
goto out;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(p2p_go_friendly_chs); i++) {
|
||||
if (p2p_go_friendly_chs[i] == ch_id) {
|
||||
flags |= IWL_SCAN_ADWELL_N_APS_GO_FRIENDLY_BIT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (flags)
|
||||
goto out;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(social_chs); i++) {
|
||||
if (social_chs[i] == ch_id) {
|
||||
flags |= IWL_SCAN_ADWELL_N_APS_SOCIAL_CHS_BIT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
return flags;
|
||||
}
|
||||
|
||||
static void
|
||||
iwl_mvm_umac_scan_cfg_channels(struct iwl_mvm *mvm,
|
||||
struct ieee80211_channel **channels,
|
||||
@ -1615,6 +1669,30 @@ iwl_mvm_umac_scan_cfg_channels_v4(struct iwl_mvm *mvm,
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
iwl_mvm_umac_scan_cfg_channels_v6(struct iwl_mvm *mvm,
|
||||
struct ieee80211_channel **channels,
|
||||
struct iwl_scan_channel_params_v6 *cp,
|
||||
int n_channels, u32 flags,
|
||||
enum nl80211_iftype vif_type)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < n_channels; i++) {
|
||||
enum nl80211_band band = channels[i]->band;
|
||||
struct iwl_scan_channel_cfg_umac *cfg = &cp->channel_config[i];
|
||||
u32 n_aps_flag =
|
||||
iwl_mvm_scan_ch_n_aps_flag(vif_type,
|
||||
cfg->v2.channel_num);
|
||||
|
||||
cfg->flags = cpu_to_le32(flags | n_aps_flag);
|
||||
cfg->v2.channel_num = channels[i]->hw_value;
|
||||
cfg->v2.band = iwl_mvm_phy_band_from_nl80211(band);
|
||||
cfg->v2.iter_count = 1;
|
||||
cfg->v2.iter_interval = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static u8 iwl_mvm_scan_umac_chan_flags_v2(struct iwl_mvm *mvm,
|
||||
struct iwl_mvm_scan_params *params,
|
||||
struct ieee80211_vif *vif)
|
||||
@ -1915,7 +1993,7 @@ iwl_mvm_scan_umac_fill_ch_p_v4(struct iwl_mvm *mvm,
|
||||
{
|
||||
cp->flags = iwl_mvm_scan_umac_chan_flags_v2(mvm, params, vif);
|
||||
cp->count = params->n_channels;
|
||||
cp->num_of_aps_override = IWL_SCAN_ADWELL_DEFAULT_N_APS_OVERRIDE;
|
||||
cp->num_of_aps_override = IWL_SCAN_ADWELL_N_APS_GO_FRIENDLY;
|
||||
|
||||
iwl_mvm_umac_scan_cfg_channels_v4(mvm, params->channels, cp,
|
||||
params->n_channels,
|
||||
@ -1923,6 +2001,23 @@ iwl_mvm_scan_umac_fill_ch_p_v4(struct iwl_mvm *mvm,
|
||||
vif->type);
|
||||
}
|
||||
|
||||
static void
|
||||
iwl_mvm_scan_umac_fill_ch_p_v6(struct iwl_mvm *mvm,
|
||||
struct iwl_mvm_scan_params *params,
|
||||
struct ieee80211_vif *vif,
|
||||
struct iwl_scan_channel_params_v6 *cp,
|
||||
u32 channel_cfg_flags)
|
||||
{
|
||||
cp->flags = iwl_mvm_scan_umac_chan_flags_v2(mvm, params, vif);
|
||||
cp->count = params->n_channels;
|
||||
cp->n_aps_override[0] = IWL_SCAN_ADWELL_N_APS_GO_FRIENDLY;
|
||||
cp->n_aps_override[1] = IWL_SCAN_ADWELL_N_APS_SOCIAL_CHS;
|
||||
|
||||
iwl_mvm_umac_scan_cfg_channels_v6(mvm, params->channels, cp,
|
||||
params->n_channels,
|
||||
channel_cfg_flags,
|
||||
vif->type);
|
||||
}
|
||||
|
||||
static int iwl_mvm_scan_umac_v12(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||
struct iwl_mvm_scan_params *params, int type,
|
||||
@ -1990,6 +2085,40 @@ static int iwl_mvm_scan_umac_v13(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int iwl_mvm_scan_umac_v14(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||
struct iwl_mvm_scan_params *params, int type,
|
||||
int uid)
|
||||
{
|
||||
struct iwl_scan_req_umac_v14 *cmd = mvm->scan_cmd;
|
||||
struct iwl_scan_req_params_v14 *scan_p = &cmd->scan_params;
|
||||
int ret;
|
||||
u16 gen_flags;
|
||||
u32 bitmap_ssid = 0;
|
||||
|
||||
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_v4(params, &scan_p->probe_params,
|
||||
&bitmap_ssid);
|
||||
iwl_mvm_scan_umac_fill_ch_p_v6(mvm, params, vif,
|
||||
&scan_p->channel_params, bitmap_ssid);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int iwl_mvm_num_scans(struct iwl_mvm *mvm)
|
||||
{
|
||||
return hweight32(mvm->scan_status & IWL_MVM_SCAN_MASK);
|
||||
@ -2105,6 +2234,7 @@ struct iwl_scan_umac_handler {
|
||||
|
||||
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(14),
|
||||
IWL_SCAN_UMAC_HANDLER(13),
|
||||
IWL_SCAN_UMAC_HANDLER(12),
|
||||
};
|
||||
@ -2463,6 +2593,7 @@ static int iwl_mvm_scan_stop_wait(struct iwl_mvm *mvm, int type)
|
||||
static int iwl_scan_req_umac_get_size(u8 scan_ver)
|
||||
{
|
||||
switch (scan_ver) {
|
||||
IWL_SCAN_REQ_UMAC_HANDLE_SIZE(14);
|
||||
IWL_SCAN_REQ_UMAC_HANDLE_SIZE(13);
|
||||
IWL_SCAN_REQ_UMAC_HANDLE_SIZE(12);
|
||||
}
|
||||
|
@ -7,7 +7,7 @@
|
||||
*
|
||||
* Copyright(c) 2013 - 2014 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2013 - 2014 Intel Mobile Communications 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
|
||||
@ -29,7 +29,7 @@
|
||||
*
|
||||
* Copyright(c) 2013 - 2014 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2013 - 2014 Intel Mobile Communications 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
|
||||
@ -162,7 +162,9 @@ static void iwl_mvm_fill_sf_command(struct iwl_mvm *mvm,
|
||||
* capabilities of the AP station, and choose the watermark accordingly.
|
||||
*/
|
||||
if (sta) {
|
||||
if (sta->ht_cap.ht_supported || sta->vht_cap.vht_supported) {
|
||||
if (sta->ht_cap.ht_supported ||
|
||||
sta->vht_cap.vht_supported ||
|
||||
sta->he_cap.has_he) {
|
||||
switch (sta->rx_nss) {
|
||||
case 1:
|
||||
watermark = SF_W_MARK_SISO;
|
||||
|
@ -513,279 +513,27 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
|
||||
{IWL_PCI_DEVICE(0x24FD, 0x9074, iwl8265_2ac_cfg)},
|
||||
|
||||
/* 9000 Series */
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x0030, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x0034, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x0038, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x003C, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x0060, iwl9461_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x0064, iwl9461_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x00A0, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x00A4, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x0230, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x0234, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x0238, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x023C, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x0260, iwl9461_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x0264, iwl9461_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x02A0, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x02A4, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x1030, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x1551, killer1550s_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x1552, killer1550i_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x2030, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x2034, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x4030, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x4034, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x40A4, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x4234, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x42A4, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x0030, iwl9560_2ac_160_cfg_quz_a0_jf_b0_soc)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x0034, iwl9560_2ac_cfg_quz_a0_jf_b0_soc)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x0038, iwl9560_2ac_160_cfg_quz_a0_jf_b0_soc)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x003C, iwl9560_2ac_160_cfg_quz_a0_jf_b0_soc)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x0060, iwl9461_2ac_cfg_quz_a0_jf_b0_soc)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x0064, iwl9461_2ac_cfg_quz_a0_jf_b0_soc)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x00A0, iwl9462_2ac_cfg_quz_a0_jf_b0_soc)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x00A4, iwl9462_2ac_cfg_quz_a0_jf_b0_soc)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x0230, iwl9560_2ac_cfg_quz_a0_jf_b0_soc)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x0234, iwl9560_2ac_cfg_quz_a0_jf_b0_soc)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x0238, iwl9560_2ac_cfg_quz_a0_jf_b0_soc)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x023C, iwl9560_2ac_cfg_quz_a0_jf_b0_soc)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x0260, iwl9461_2ac_cfg_quz_a0_jf_b0_soc)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x0264, iwl9461_2ac_cfg_quz_a0_jf_b0_soc)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x02A0, iwl9462_2ac_cfg_quz_a0_jf_b0_soc)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x02A4, iwl9462_2ac_cfg_quz_a0_jf_b0_soc)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x1551, iwl9560_killer_s_2ac_cfg_quz_a0_jf_b0_soc)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x1552, iwl9560_killer_i_2ac_cfg_quz_a0_jf_b0_soc)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x2030, iwl9560_2ac_160_cfg_quz_a0_jf_b0_soc)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x2034, iwl9560_2ac_160_cfg_quz_a0_jf_b0_soc)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x4030, iwl9560_2ac_160_cfg_quz_a0_jf_b0_soc)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x4034, iwl9560_2ac_160_cfg_quz_a0_jf_b0_soc)},
|
||||
{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, PCI_ANY_ID, iwl9000_trans_cfg)},
|
||||
{IWL_PCI_DEVICE(0x271B, PCI_ANY_ID, iwl9000_trans_cfg)},
|
||||
{IWL_PCI_DEVICE(0x271C, PCI_ANY_ID, iwl9000_trans_cfg)},
|
||||
{IWL_PCI_DEVICE(0x30DC, PCI_ANY_ID, iwl9000_trans_cfg)},
|
||||
{IWL_PCI_DEVICE(0x31DC, PCI_ANY_ID, iwl9000_trans_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, PCI_ANY_ID, iwl9000_trans_cfg)},
|
||||
{IWL_PCI_DEVICE(0xA370, PCI_ANY_ID, iwl9000_trans_cfg)},
|
||||
{IWL_PCI_DEVICE(0x271B, PCI_ANY_ID, iwl9560_trans_cfg)},
|
||||
{IWL_PCI_DEVICE(0x271C, PCI_ANY_ID, iwl9560_trans_cfg)},
|
||||
{IWL_PCI_DEVICE(0x30DC, PCI_ANY_ID, iwl9560_trans_cfg)},
|
||||
{IWL_PCI_DEVICE(0x31DC, PCI_ANY_ID, iwl9560_shared_clk_trans_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, PCI_ANY_ID, iwl9560_trans_cfg)},
|
||||
{IWL_PCI_DEVICE(0xA370, PCI_ANY_ID, iwl9560_trans_cfg)},
|
||||
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0034, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0038, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x003C, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0060, iwl9461_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0064, iwl9461_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x00A0, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x00A4, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0230, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0234, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0238, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x023C, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0260, iwl9461_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0264, iwl9461_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x02A0, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x02A4, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x1030, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x1551, killer1550s_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x1552, killer1550i_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x2030, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x2034, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x4030, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x4034, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x40A4, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x4234, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x42A4, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
/* Qu devices */
|
||||
{IWL_PCI_DEVICE(0x02F0, PCI_ANY_ID, iwl_qu_trans_cfg)},
|
||||
{IWL_PCI_DEVICE(0x06F0, PCI_ANY_ID, iwl_qu_trans_cfg)},
|
||||
{IWL_PCI_DEVICE(0x34F0, PCI_ANY_ID, iwl_qu_trans_cfg)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, PCI_ANY_ID, iwl_qu_trans_cfg)},
|
||||
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x0030, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x0034, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x0038, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x003C, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x0060, iwl9461_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x0064, iwl9461_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x00A0, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x00A4, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x0230, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x0234, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x0238, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x023C, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x0260, iwl9461_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x0264, iwl9461_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x02A0, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x02A4, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x1551, killer1550s_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x1552, killer1550i_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x2030, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x2034, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x4030, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x4034, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x40A4, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x4234, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x42A4, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x43F0, PCI_ANY_ID, iwl_qu_long_latency_trans_cfg)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, PCI_ANY_ID, iwl_qu_long_latency_trans_cfg)},
|
||||
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x0030, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x0034, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x0038, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x003C, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x0060, iwl9461_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x0064, iwl9461_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x00A0, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x00A4, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x0230, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x0234, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x0238, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x023C, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x0260, iwl9461_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x0264, iwl9461_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x02A0, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x02A4, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x1030, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x1551, killer1550s_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x1552, killer1550i_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x2030, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x2034, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x4030, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x4034, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x40A4, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x4234, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x42A4, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x2720, PCI_ANY_ID, iwl_qnj_trans_cfg)},
|
||||
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x0030, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x0034, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x0038, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x003C, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x0060, iwl9461_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x0064, iwl9461_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x00A0, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x00A4, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x0230, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x0234, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x0238, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x023C, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x0260, iwl9461_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x0264, iwl9461_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x02A0, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x02A4, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x1030, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x1551, killer1550s_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x1552, killer1550i_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x2030, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x2034, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x4030, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x4034, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x40A4, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x4234, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x42A4, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x0030, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x0034, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x0038, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x003C, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x0060, iwl9461_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x0064, iwl9461_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x00A0, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x00A4, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x0230, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x0234, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x0238, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x023C, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x0260, iwl9461_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x0264, iwl9461_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x02A0, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x02A4, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x1030, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x1551, killer1550s_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x1552, killer1550i_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x2030, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x2034, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x4030, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x4034, iwl9560_2ac_160_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x40A4, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x4234, iwl9560_2ac_cfg_qu_b0_jf_b0)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x42A4, iwl9462_2ac_cfg_qu_b0_jf_b0)},
|
||||
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0030, iwl9560_2ac_cfg_qnj_jf_b0)},
|
||||
|
||||
/* 22000 Series */
|
||||
{IWL_PCI_DEVICE(0x2723, PCI_ANY_ID, iwl_ax200_trans_cfg)},
|
||||
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x0070, iwl_ax201_cfg_quz_hr)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x0074, iwl_ax201_cfg_quz_hr)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x0078, iwl_ax201_cfg_quz_hr)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x007C, iwl_ax201_cfg_quz_hr)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x0244, iwl_ax101_cfg_quz_hr)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x0310, iwl_ax201_cfg_quz_hr)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x1651, iwl_ax1650s_cfg_quz_hr)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x1652, iwl_ax1650i_cfg_quz_hr)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x2074, iwl_ax201_cfg_quz_hr)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x4070, iwl_ax201_cfg_quz_hr)},
|
||||
{IWL_PCI_DEVICE(0x02F0, 0x4244, iwl_ax101_cfg_quz_hr)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x0070, iwl_ax201_cfg_quz_hr)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x0074, iwl_ax201_cfg_quz_hr)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x0078, iwl_ax201_cfg_quz_hr)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x007C, iwl_ax201_cfg_quz_hr)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x0244, iwl_ax101_cfg_quz_hr)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x0310, iwl_ax201_cfg_quz_hr)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x1651, iwl_ax1650s_cfg_quz_hr)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x1652, iwl_ax1650i_cfg_quz_hr)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x2074, iwl_ax201_cfg_quz_hr)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x4070, iwl_ax201_cfg_quz_hr)},
|
||||
{IWL_PCI_DEVICE(0x06F0, 0x4244, iwl_ax101_cfg_quz_hr)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0000, iwl_ax101_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0040, iwl_ax101_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0044, iwl_ax101_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0070, iwl_ax201_cfg_qu_hr)},
|
||||
{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, 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)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x1080, iwl_ax101_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x1651, killer1650s_2ax_cfg_qu_b0_hr_b0)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x1652, killer1650i_2ax_cfg_qu_b0_hr_b0)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x2074, iwl_ax201_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x4070, iwl_ax201_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x4244, iwl_ax101_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x0044, iwl_ax101_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x0070, iwl_ax201_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x0074, iwl_ax201_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x0078, iwl_ax201_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x007C, iwl_ax201_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x0244, iwl_ax101_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x0310, iwl_ax201_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x1651, killer1650s_2ax_cfg_qu_b0_hr_b0)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x1652, killer1650i_2ax_cfg_qu_b0_hr_b0)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x2074, iwl_ax201_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x4070, iwl_ax201_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x4244, iwl_ax101_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x0044, iwl_ax101_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x0070, iwl_ax201_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x0074, iwl_ax201_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x0078, iwl_ax201_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x007C, iwl_ax201_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x0244, iwl_ax101_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x1651, killer1650s_2ax_cfg_qu_b0_hr_b0)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x1652, killer1650i_2ax_cfg_qu_b0_hr_b0)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x2074, iwl_ax201_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x4070, iwl_ax201_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x4244, iwl_ax101_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x0044, iwl_ax101_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x0070, iwl_ax201_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x0074, iwl_ax201_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x0078, iwl_ax201_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x007C, iwl_ax201_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x0244, iwl_ax101_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x0A10, iwl_ax201_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x1651, killer1650s_2ax_cfg_qu_b0_hr_b0)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x1652, killer1650i_2ax_cfg_qu_b0_hr_b0)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x2074, iwl_ax201_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x4070, iwl_ax201_cfg_qu_hr)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x4244, iwl_ax101_cfg_qu_hr)},
|
||||
|
||||
{IWL_PCI_DEVICE(0x2725, 0x0090, iwlax211_2ax_cfg_so_gf_a0)},
|
||||
{IWL_PCI_DEVICE(0x2725, 0x0020, iwlax210_2ax_cfg_ty_gf_a0)},
|
||||
{IWL_PCI_DEVICE(0x2725, 0x0310, iwlax210_2ax_cfg_ty_gf_a0)},
|
||||
@ -807,15 +555,17 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, iwl_hw_card_ids);
|
||||
|
||||
#define _IWL_DEV_INFO(_device, _subdevice, _mac_type, _rf_type, _rf_id, \
|
||||
_no_160, _cores, _cfg, _name) \
|
||||
#define _IWL_DEV_INFO(_device, _subdevice, _mac_type, _mac_step, _rf_type, \
|
||||
_rf_id, _no_160, _cores, _cfg, _name) \
|
||||
{ .device = (_device), .subdevice = (_subdevice), .cfg = &(_cfg), \
|
||||
.name = _name, .mac_type = _mac_type, .rf_type = _rf_type, \
|
||||
.no_160 = _no_160, .cores = _cores, .rf_id = _rf_id, }
|
||||
.no_160 = _no_160, .cores = _cores, .rf_id = _rf_id, \
|
||||
.mac_step = _mac_step }
|
||||
|
||||
#define IWL_DEV_INFO(_device, _subdevice, _cfg, _name) \
|
||||
_IWL_DEV_INFO(_device, _subdevice, IWL_CFG_ANY, IWL_CFG_ANY, \
|
||||
IWL_CFG_ANY, IWL_CFG_ANY, IWL_CFG_ANY, _cfg, _name)
|
||||
IWL_CFG_ANY, IWL_CFG_ANY, IWL_CFG_ANY, IWL_CFG_ANY, \
|
||||
_cfg, _name)
|
||||
|
||||
static const struct iwl_dev_info iwl_dev_info_table[] = {
|
||||
#if IS_ENABLED(CONFIG_IWLMVM)
|
||||
@ -825,120 +575,378 @@ static const struct iwl_dev_info iwl_dev_info_table[] = {
|
||||
IWL_DEV_INFO(0x2526, 0x1552, iwl9560_2ac_cfg_soc, iwl9560_killer_1550i_name),
|
||||
IWL_DEV_INFO(0x30DC, 0x1551, iwl9560_2ac_cfg_soc, iwl9560_killer_1550s_name),
|
||||
IWL_DEV_INFO(0x30DC, 0x1552, iwl9560_2ac_cfg_soc, iwl9560_killer_1550i_name),
|
||||
IWL_DEV_INFO(0x31DC, 0x1551, iwl9560_2ac_cfg_shared_clk, iwl9560_killer_1550s_name),
|
||||
IWL_DEV_INFO(0x31DC, 0x1552, iwl9560_2ac_cfg_shared_clk, iwl9560_killer_1550i_name),
|
||||
IWL_DEV_INFO(0x31DC, 0x1551, iwl9560_2ac_cfg_soc, iwl9560_killer_1550s_name),
|
||||
IWL_DEV_INFO(0x31DC, 0x1552, iwl9560_2ac_cfg_soc, iwl9560_killer_1550i_name),
|
||||
|
||||
IWL_DEV_INFO(0x271C, 0x0214, iwl9260_2ac_cfg, iwl9260_1_name),
|
||||
|
||||
_IWL_DEV_INFO(0x31DC, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_PU, IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_2ac_cfg_shared_clk, iwl9461_160_name),
|
||||
_IWL_DEV_INFO(0x31DC, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_PU, IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_2ac_cfg_shared_clk, iwl9461_name),
|
||||
_IWL_DEV_INFO(0x31DC, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_PU, IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1_DIV,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_2ac_cfg_shared_clk, iwl9462_160_name),
|
||||
_IWL_DEV_INFO(0x31DC, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_PU, IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1_DIV,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_2ac_cfg_shared_clk, iwl9462_name),
|
||||
|
||||
_IWL_DEV_INFO(0x31DC, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_PU, IWL_CFG_RF_TYPE_JF2, IWL_CFG_RF_ID_JF,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_2ac_cfg_shared_clk, iwl9560_160_name),
|
||||
_IWL_DEV_INFO(0x31DC, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_PU, IWL_CFG_RF_TYPE_JF2, IWL_CFG_RF_ID_JF,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_2ac_cfg_shared_clk, iwl9560_name),
|
||||
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_PU, IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_2ac_cfg_soc, iwl9461_160_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_PU, IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_2ac_cfg_soc, iwl9461_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_PU, IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1_DIV,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_2ac_cfg_soc, iwl9462_160_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_PU, IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1_DIV,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_2ac_cfg_soc, iwl9462_name),
|
||||
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_PU, IWL_CFG_RF_TYPE_JF2, IWL_CFG_RF_ID_JF,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_2ac_cfg_soc, iwl9560_160_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_PU, IWL_CFG_RF_TYPE_JF2, IWL_CFG_RF_ID_JF,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_2ac_cfg_soc, iwl9560_name),
|
||||
|
||||
_IWL_DEV_INFO(0x2526, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_PNJ, IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_2ac_cfg, iwl9461_160_name),
|
||||
_IWL_DEV_INFO(0x2526, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_PNJ, IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_2ac_cfg, iwl9461_name),
|
||||
_IWL_DEV_INFO(0x2526, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_PNJ, IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1_DIV,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_2ac_cfg, iwl9462_160_name),
|
||||
_IWL_DEV_INFO(0x2526, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_PNJ, IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1_DIV,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_2ac_cfg, iwl9462_name),
|
||||
|
||||
_IWL_DEV_INFO(0x2526, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_PNJ, IWL_CFG_RF_TYPE_JF2, IWL_CFG_RF_ID_JF,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_2ac_cfg, iwl9560_160_name),
|
||||
_IWL_DEV_INFO(0x2526, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_PNJ, IWL_CFG_RF_TYPE_JF2, IWL_CFG_RF_ID_JF,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_2ac_cfg, iwl9560_name),
|
||||
|
||||
_IWL_DEV_INFO(0x2526, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_TH, IWL_CFG_RF_TYPE_TH, IWL_CFG_ANY,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT_GNSS,
|
||||
iwl9260_2ac_cfg, iwl9270_160_name),
|
||||
_IWL_DEV_INFO(0x2526, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_TH, IWL_CFG_RF_TYPE_TH, IWL_CFG_ANY,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT_GNSS,
|
||||
iwl9260_2ac_cfg, iwl9270_name),
|
||||
|
||||
_IWL_DEV_INFO(0x271B, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_TH, IWL_CFG_RF_TYPE_TH1, IWL_CFG_ANY,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9260_2ac_cfg, iwl9162_160_name),
|
||||
_IWL_DEV_INFO(0x271B, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_TH, IWL_CFG_RF_TYPE_TH1, IWL_CFG_ANY,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9260_2ac_cfg, iwl9162_name),
|
||||
|
||||
_IWL_DEV_INFO(0x2526, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_TH, IWL_CFG_RF_TYPE_TH, IWL_CFG_ANY,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9260_2ac_cfg, iwl9260_160_name),
|
||||
_IWL_DEV_INFO(0x2526, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_TH, IWL_CFG_RF_TYPE_TH, IWL_CFG_ANY,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9260_2ac_cfg, iwl9260_name),
|
||||
|
||||
/* AX200 */
|
||||
IWL_DEV_INFO(0x2723, 0x1653, iwl_ax200_cfg_cc, iwl_ax200_killer_1650w_name),
|
||||
IWL_DEV_INFO(0x2723, 0x1654, iwl_ax200_cfg_cc, iwl_ax200_killer_1650x_name),
|
||||
IWL_DEV_INFO(0x2723, IWL_CFG_ANY, iwl_ax200_cfg_cc, iwl_ax200_name),
|
||||
|
||||
/* Qu with Hr */
|
||||
IWL_DEV_INFO(0x43F0, 0x0044, iwl_ax101_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x43F0, 0x0070, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x43F0, 0x0074, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x43F0, 0x0078, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x43F0, 0x007C, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x43F0, 0x0244, iwl_ax101_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x43F0, 0x1651, killer1650s_2ax_cfg_qu_b0_hr_b0, NULL),
|
||||
IWL_DEV_INFO(0x43F0, 0x1652, killer1650i_2ax_cfg_qu_b0_hr_b0, NULL),
|
||||
IWL_DEV_INFO(0x43F0, 0x2074, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x43F0, 0x4070, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x43F0, 0x4244, iwl_ax101_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0xA0F0, 0x0044, iwl_ax101_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0xA0F0, 0x0070, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0xA0F0, 0x0074, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0xA0F0, 0x0078, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0xA0F0, 0x007C, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0xA0F0, 0x0244, iwl_ax101_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0xA0F0, 0x0A10, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0xA0F0, 0x1651, killer1650s_2ax_cfg_qu_b0_hr_b0, NULL),
|
||||
IWL_DEV_INFO(0xA0F0, 0x1652, killer1650i_2ax_cfg_qu_b0_hr_b0, NULL),
|
||||
IWL_DEV_INFO(0xA0F0, 0x2074, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0xA0F0, 0x4070, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0xA0F0, 0x4244, iwl_ax101_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x02F0, 0x0070, iwl_ax201_cfg_quz_hr, NULL),
|
||||
IWL_DEV_INFO(0x02F0, 0x0074, iwl_ax201_cfg_quz_hr, NULL),
|
||||
IWL_DEV_INFO(0x02F0, 0x0078, iwl_ax201_cfg_quz_hr, NULL),
|
||||
IWL_DEV_INFO(0x02F0, 0x007C, iwl_ax201_cfg_quz_hr, NULL),
|
||||
IWL_DEV_INFO(0x02F0, 0x0244, iwl_ax101_cfg_quz_hr, NULL),
|
||||
IWL_DEV_INFO(0x02F0, 0x0310, iwl_ax201_cfg_quz_hr, NULL),
|
||||
IWL_DEV_INFO(0x02F0, 0x1651, iwl_ax1650s_cfg_quz_hr, NULL),
|
||||
IWL_DEV_INFO(0x02F0, 0x1652, iwl_ax1650i_cfg_quz_hr, NULL),
|
||||
IWL_DEV_INFO(0x02F0, 0x2074, iwl_ax201_cfg_quz_hr, NULL),
|
||||
IWL_DEV_INFO(0x02F0, 0x4070, iwl_ax201_cfg_quz_hr, NULL),
|
||||
IWL_DEV_INFO(0x02F0, 0x4244, iwl_ax101_cfg_quz_hr, NULL),
|
||||
IWL_DEV_INFO(0x06F0, 0x0070, iwl_ax201_cfg_quz_hr, NULL),
|
||||
IWL_DEV_INFO(0x06F0, 0x0074, iwl_ax201_cfg_quz_hr, NULL),
|
||||
IWL_DEV_INFO(0x06F0, 0x0078, iwl_ax201_cfg_quz_hr, NULL),
|
||||
IWL_DEV_INFO(0x06F0, 0x007C, iwl_ax201_cfg_quz_hr, NULL),
|
||||
IWL_DEV_INFO(0x06F0, 0x0244, iwl_ax101_cfg_quz_hr, NULL),
|
||||
IWL_DEV_INFO(0x06F0, 0x0310, iwl_ax201_cfg_quz_hr, NULL),
|
||||
IWL_DEV_INFO(0x06F0, 0x1651, iwl_ax1650s_cfg_quz_hr, NULL),
|
||||
IWL_DEV_INFO(0x06F0, 0x1652, iwl_ax1650i_cfg_quz_hr, NULL),
|
||||
IWL_DEV_INFO(0x06F0, 0x2074, iwl_ax201_cfg_quz_hr, NULL),
|
||||
IWL_DEV_INFO(0x06F0, 0x4070, iwl_ax201_cfg_quz_hr, NULL),
|
||||
IWL_DEV_INFO(0x06F0, 0x4244, iwl_ax101_cfg_quz_hr, NULL),
|
||||
IWL_DEV_INFO(0x34F0, 0x0044, iwl_ax101_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x34F0, 0x0070, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x34F0, 0x0074, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x34F0, 0x0078, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x34F0, 0x007C, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x34F0, 0x0244, iwl_ax101_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x34F0, 0x0310, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x34F0, 0x1651, killer1650s_2ax_cfg_qu_b0_hr_b0, NULL),
|
||||
IWL_DEV_INFO(0x34F0, 0x1652, killer1650i_2ax_cfg_qu_b0_hr_b0, NULL),
|
||||
IWL_DEV_INFO(0x34F0, 0x2074, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x34F0, 0x4070, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x34F0, 0x4244, iwl_ax101_cfg_qu_hr, NULL),
|
||||
|
||||
IWL_DEV_INFO(0x3DF0, 0x0044, iwl_ax101_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x3DF0, 0x0070, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x3DF0, 0x0074, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x3DF0, 0x0078, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x3DF0, 0x007C, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x3DF0, 0x0244, iwl_ax101_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x3DF0, 0x0310, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x3DF0, 0x1651, killer1650s_2ax_cfg_qu_b0_hr_b0, NULL),
|
||||
IWL_DEV_INFO(0x3DF0, 0x1652, killer1650i_2ax_cfg_qu_b0_hr_b0, NULL),
|
||||
IWL_DEV_INFO(0x3DF0, 0x2074, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x3DF0, 0x4070, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x3DF0, 0x4244, iwl_ax101_cfg_qu_hr, NULL),
|
||||
|
||||
IWL_DEV_INFO(0x2720, 0x0000, iwl22000_2ax_cfg_qnj_hr_b0, NULL),
|
||||
IWL_DEV_INFO(0x2720, 0x0040, iwl22000_2ax_cfg_qnj_hr_b0, NULL),
|
||||
IWL_DEV_INFO(0x2720, 0x0044, iwl22000_2ax_cfg_qnj_hr_b0, NULL),
|
||||
IWL_DEV_INFO(0x2720, 0x0070, iwl22000_2ax_cfg_qnj_hr_b0, NULL),
|
||||
IWL_DEV_INFO(0x2720, 0x0074, iwl22000_2ax_cfg_qnj_hr_b0, NULL),
|
||||
IWL_DEV_INFO(0x2720, 0x0078, iwl22000_2ax_cfg_qnj_hr_b0, NULL),
|
||||
IWL_DEV_INFO(0x2720, 0x007C, iwl22000_2ax_cfg_qnj_hr_b0, NULL),
|
||||
IWL_DEV_INFO(0x2720, 0x0244, iwl22000_2ax_cfg_qnj_hr_b0, NULL),
|
||||
IWL_DEV_INFO(0x2720, 0x0310, iwl22000_2ax_cfg_qnj_hr_b0, NULL),
|
||||
IWL_DEV_INFO(0x2720, 0x0A10, iwl22000_2ax_cfg_qnj_hr_b0, NULL),
|
||||
IWL_DEV_INFO(0x2720, 0x1080, iwl22000_2ax_cfg_qnj_hr_b0, NULL),
|
||||
IWL_DEV_INFO(0x2720, 0x1651, iwl22000_2ax_cfg_qnj_hr_b0, NULL),
|
||||
IWL_DEV_INFO(0x2720, 0x1652, iwl22000_2ax_cfg_qnj_hr_b0, NULL),
|
||||
IWL_DEV_INFO(0x2720, 0x2074, iwl22000_2ax_cfg_qnj_hr_b0, NULL),
|
||||
IWL_DEV_INFO(0x2720, 0x4070, iwl22000_2ax_cfg_qnj_hr_b0, NULL),
|
||||
IWL_DEV_INFO(0x2720, 0x4244, iwl22000_2ax_cfg_qnj_hr_b0, NULL),
|
||||
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_PU, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_2ac_cfg_soc, iwl9461_160_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_PU, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_2ac_cfg_soc, iwl9461_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_PU, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1_DIV,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_2ac_cfg_soc, iwl9462_160_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_PU, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1_DIV,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_2ac_cfg_soc, iwl9462_name),
|
||||
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_PU, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF2, IWL_CFG_RF_ID_JF,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_2ac_cfg_soc, iwl9560_160_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_PU, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF2, IWL_CFG_RF_ID_JF,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_2ac_cfg_soc, iwl9560_name),
|
||||
|
||||
_IWL_DEV_INFO(0x2526, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_PNJ, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9260_2ac_cfg, iwl9461_160_name),
|
||||
_IWL_DEV_INFO(0x2526, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_PNJ, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9260_2ac_cfg, iwl9461_name),
|
||||
_IWL_DEV_INFO(0x2526, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_PNJ, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1_DIV,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9260_2ac_cfg, iwl9462_160_name),
|
||||
_IWL_DEV_INFO(0x2526, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_PNJ, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1_DIV,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9260_2ac_cfg, iwl9462_name),
|
||||
|
||||
_IWL_DEV_INFO(0x2526, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_PNJ, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF2, IWL_CFG_RF_ID_JF,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9260_2ac_cfg, iwl9560_160_name),
|
||||
_IWL_DEV_INFO(0x2526, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_PNJ, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF2, IWL_CFG_RF_ID_JF,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9260_2ac_cfg, iwl9560_name),
|
||||
|
||||
_IWL_DEV_INFO(0x2526, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_TH, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_TH, IWL_CFG_ANY,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT_GNSS,
|
||||
iwl9260_2ac_cfg, iwl9270_160_name),
|
||||
_IWL_DEV_INFO(0x2526, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_TH, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_TH, IWL_CFG_ANY,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT_GNSS,
|
||||
iwl9260_2ac_cfg, iwl9270_name),
|
||||
|
||||
_IWL_DEV_INFO(0x271B, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_TH, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_TH1, IWL_CFG_ANY,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9260_2ac_cfg, iwl9162_160_name),
|
||||
_IWL_DEV_INFO(0x271B, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_TH, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_TH1, IWL_CFG_ANY,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9260_2ac_cfg, iwl9162_name),
|
||||
|
||||
_IWL_DEV_INFO(0x2526, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_TH, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_TH, IWL_CFG_ANY,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9260_2ac_cfg, iwl9260_160_name),
|
||||
_IWL_DEV_INFO(0x2526, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_TH, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_TH, IWL_CFG_ANY,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9260_2ac_cfg, iwl9260_name),
|
||||
|
||||
/* Qu with Jf */
|
||||
/* Qu B step */
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_QU, SILICON_B_STEP,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_qu_b0_jf_b0_cfg, iwl9461_160_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_QU, SILICON_B_STEP,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_qu_b0_jf_b0_cfg, iwl9461_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_QU, SILICON_B_STEP,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1_DIV,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_qu_b0_jf_b0_cfg, iwl9462_160_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_QU, SILICON_B_STEP,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1_DIV,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_qu_b0_jf_b0_cfg, iwl9462_name),
|
||||
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_QU, SILICON_B_STEP,
|
||||
IWL_CFG_RF_TYPE_JF2, IWL_CFG_RF_ID_JF,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_qu_b0_jf_b0_cfg, iwl9560_160_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_QU, SILICON_B_STEP,
|
||||
IWL_CFG_RF_TYPE_JF2, IWL_CFG_RF_ID_JF,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_qu_b0_jf_b0_cfg, iwl9560_name),
|
||||
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, 0x1551,
|
||||
IWL_CFG_MAC_TYPE_QU, SILICON_B_STEP,
|
||||
IWL_CFG_RF_TYPE_JF2, IWL_CFG_RF_ID_JF,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_qu_b0_jf_b0_cfg, iwl9560_killer_1550s_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, 0x1552,
|
||||
IWL_CFG_MAC_TYPE_QU, SILICON_B_STEP,
|
||||
IWL_CFG_RF_TYPE_JF2, IWL_CFG_RF_ID_JF,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_qu_b0_jf_b0_cfg, iwl9560_killer_1550i_name),
|
||||
|
||||
/* Qu C step */
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_QU, SILICON_C_STEP,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_qu_c0_jf_b0_cfg, iwl9461_160_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_QU, SILICON_C_STEP,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_qu_c0_jf_b0_cfg, iwl9461_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_QU, SILICON_C_STEP,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1_DIV,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_qu_c0_jf_b0_cfg, iwl9462_160_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_QU, SILICON_C_STEP,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1_DIV,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_qu_c0_jf_b0_cfg, iwl9462_name),
|
||||
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_QU, SILICON_C_STEP,
|
||||
IWL_CFG_RF_TYPE_JF2, IWL_CFG_RF_ID_JF,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_qu_c0_jf_b0_cfg, iwl9560_160_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_QU, SILICON_C_STEP,
|
||||
IWL_CFG_RF_TYPE_JF2, IWL_CFG_RF_ID_JF,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_qu_c0_jf_b0_cfg, iwl9560_name),
|
||||
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, 0x1551,
|
||||
IWL_CFG_MAC_TYPE_QU, SILICON_C_STEP,
|
||||
IWL_CFG_RF_TYPE_JF2, IWL_CFG_RF_ID_JF,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_qu_c0_jf_b0_cfg, iwl9560_killer_1550s_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, 0x1552,
|
||||
IWL_CFG_MAC_TYPE_QU, SILICON_C_STEP,
|
||||
IWL_CFG_RF_TYPE_JF2, IWL_CFG_RF_ID_JF,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_qu_c0_jf_b0_cfg, iwl9560_killer_1550i_name),
|
||||
|
||||
/* QuZ */
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_QUZ, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_quz_a0_jf_b0_cfg, iwl9461_160_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_QUZ, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_quz_a0_jf_b0_cfg, iwl9461_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_QUZ, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1_DIV,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_quz_a0_jf_b0_cfg, iwl9462_160_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_QUZ, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1_DIV,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_quz_a0_jf_b0_cfg, iwl9462_name),
|
||||
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_QUZ, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF2, IWL_CFG_RF_ID_JF,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_quz_a0_jf_b0_cfg, iwl9560_160_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_QUZ, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF2, IWL_CFG_RF_ID_JF,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_quz_a0_jf_b0_cfg, iwl9560_name),
|
||||
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, 0x1551,
|
||||
IWL_CFG_MAC_TYPE_QUZ, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF2, IWL_CFG_RF_ID_JF,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_quz_a0_jf_b0_cfg, iwl9560_killer_1550s_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, 0x1552,
|
||||
IWL_CFG_MAC_TYPE_QUZ, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF2, IWL_CFG_RF_ID_JF,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_quz_a0_jf_b0_cfg, iwl9560_killer_1550i_name),
|
||||
|
||||
/* QnJ */
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_QNJ, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_qnj_b0_jf_b0_cfg, iwl9461_160_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_QNJ, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_qnj_b0_jf_b0_cfg, iwl9461_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_QNJ, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1_DIV,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_qnj_b0_jf_b0_cfg, iwl9462_160_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_QNJ, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1_DIV,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_qnj_b0_jf_b0_cfg, iwl9462_name),
|
||||
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_QNJ, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF2, IWL_CFG_RF_ID_JF,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_qnj_b0_jf_b0_cfg, iwl9560_160_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_QNJ, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF2, IWL_CFG_RF_ID_JF,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_qnj_b0_jf_b0_cfg, iwl9560_name),
|
||||
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, 0x1551,
|
||||
IWL_CFG_MAC_TYPE_QNJ, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF2, IWL_CFG_RF_ID_JF,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_qnj_b0_jf_b0_cfg, iwl9560_killer_1550s_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, 0x1552,
|
||||
IWL_CFG_MAC_TYPE_QNJ, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF2, IWL_CFG_RF_ID_JF,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT,
|
||||
iwl9560_qnj_b0_jf_b0_cfg, iwl9560_killer_1550i_name),
|
||||
#endif /* CONFIG_IWLMVM */
|
||||
};
|
||||
|
||||
@ -985,6 +993,9 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
(dev_info->mac_type == (u16)IWL_CFG_ANY ||
|
||||
dev_info->mac_type ==
|
||||
CSR_HW_REV_TYPE(iwl_trans->hw_rev)) &&
|
||||
(dev_info->mac_step == (u8)IWL_CFG_ANY ||
|
||||
dev_info->mac_step ==
|
||||
CSR_HW_REV_STEP(iwl_trans->hw_rev)) &&
|
||||
(dev_info->rf_type == (u16)IWL_CFG_ANY ||
|
||||
dev_info->rf_type ==
|
||||
CSR_HW_RFID_TYPE(iwl_trans->hw_rf_id)) &&
|
||||
@ -999,7 +1010,6 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
IWL_SUBDEVICE_CORES(pdev->subsystem_device))) {
|
||||
iwl_trans->cfg = dev_info->cfg;
|
||||
iwl_trans->name = dev_info->name;
|
||||
goto found;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1048,9 +1058,6 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
} 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->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)) {
|
||||
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");
|
||||
@ -1060,59 +1067,31 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
CSR_HW_RF_ID_TYPE_CHIP_ID(iwl_trans->hw_rf_id));
|
||||
return -EINVAL;
|
||||
}
|
||||
} 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_QNJ_B0) {
|
||||
u32 hw_status;
|
||||
|
||||
hw_status = iwl_read_prph(iwl_trans, UMAG_GEN_HW_STATUS);
|
||||
if (CSR_HW_RF_STEP(iwl_trans->hw_rf_id) == SILICON_B_STEP)
|
||||
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)
|
||||
iwl_trans->cfg = &iwl22000_2ax_cfg_qnj_hr_a0_f0;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is a hack to switch from Qu B0 to Qu C0. We need to
|
||||
* do this for all cfgs that use Qu B0. All this code is in
|
||||
* urgent need for a refactor, but for now this is the easiest
|
||||
* thing to do to support Qu C-step.
|
||||
* do this for all cfgs that use Qu B0, except for those using
|
||||
* Jf, which have already been moved to the new table. The
|
||||
* rest must be removed once we convert Qu with Hr as well.
|
||||
*/
|
||||
if (iwl_trans->hw_rev == CSR_HW_REV_TYPE_QU_C0) {
|
||||
if (cfg == &iwl_ax101_cfg_qu_hr)
|
||||
if (iwl_trans->cfg == &iwl_ax101_cfg_qu_hr)
|
||||
iwl_trans->cfg = &iwl_ax101_cfg_qu_c0_hr_b0;
|
||||
else if (cfg == &iwl_ax201_cfg_qu_hr)
|
||||
else if (iwl_trans->cfg == &iwl_ax201_cfg_qu_hr)
|
||||
iwl_trans->cfg = &iwl_ax201_cfg_qu_c0_hr_b0;
|
||||
else if (cfg == &iwl9461_2ac_cfg_qu_b0_jf_b0)
|
||||
iwl_trans->cfg = &iwl9461_2ac_cfg_qu_c0_jf_b0;
|
||||
else if (cfg == &iwl9462_2ac_cfg_qu_b0_jf_b0)
|
||||
iwl_trans->cfg = &iwl9462_2ac_cfg_qu_c0_jf_b0;
|
||||
else if (cfg == &iwl9560_2ac_cfg_qu_b0_jf_b0)
|
||||
iwl_trans->cfg = &iwl9560_2ac_cfg_qu_c0_jf_b0;
|
||||
else if (cfg == &iwl9560_2ac_160_cfg_qu_b0_jf_b0)
|
||||
iwl_trans->cfg = &iwl9560_2ac_160_cfg_qu_c0_jf_b0;
|
||||
else if (cfg == &killer1650s_2ax_cfg_qu_b0_hr_b0)
|
||||
else if (iwl_trans->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)
|
||||
else if (iwl_trans->cfg == &killer1650i_2ax_cfg_qu_b0_hr_b0)
|
||||
iwl_trans->cfg = &killer1650i_2ax_cfg_qu_c0_hr_b0;
|
||||
}
|
||||
|
||||
/* same thing for QuZ... */
|
||||
if (iwl_trans->hw_rev == CSR_HW_REV_TYPE_QUZ) {
|
||||
if (cfg == &iwl_ax101_cfg_qu_hr)
|
||||
cfg = &iwl_ax101_cfg_quz_hr;
|
||||
else if (cfg == &iwl_ax201_cfg_qu_hr)
|
||||
cfg = &iwl_ax201_cfg_quz_hr;
|
||||
else if (cfg == &iwl9461_2ac_cfg_qu_b0_jf_b0)
|
||||
cfg = &iwl9461_2ac_cfg_quz_a0_jf_b0_soc;
|
||||
else if (cfg == &iwl9462_2ac_cfg_qu_b0_jf_b0)
|
||||
cfg = &iwl9462_2ac_cfg_quz_a0_jf_b0_soc;
|
||||
else if (cfg == &iwl9560_2ac_cfg_qu_b0_jf_b0)
|
||||
cfg = &iwl9560_2ac_cfg_quz_a0_jf_b0_soc;
|
||||
else if (cfg == &iwl9560_2ac_160_cfg_qu_b0_jf_b0)
|
||||
cfg = &iwl9560_2ac_160_cfg_quz_a0_jf_b0_soc;
|
||||
if (iwl_trans->cfg == &iwl_ax101_cfg_qu_hr)
|
||||
iwl_trans->cfg = &iwl_ax101_cfg_quz_hr;
|
||||
else if (iwl_trans->cfg == &iwl_ax201_cfg_qu_hr)
|
||||
iwl_trans->cfg = &iwl_ax201_cfg_quz_hr;
|
||||
}
|
||||
|
||||
#endif
|
||||
@ -1123,7 +1102,6 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
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;
|
||||
|
@ -718,7 +718,6 @@ int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb,
|
||||
struct iwl_device_tx_cmd *dev_cmd, int txq_id);
|
||||
void iwl_pcie_txq_check_wrptrs(struct iwl_trans *trans);
|
||||
int iwl_trans_pcie_send_hcmd(struct iwl_trans *trans, struct iwl_host_cmd *cmd);
|
||||
void iwl_pcie_cmdq_reclaim(struct iwl_trans *trans, int txq_id, int idx);
|
||||
void iwl_pcie_gen2_txq_inc_wr_ptr(struct iwl_trans *trans,
|
||||
struct iwl_txq *txq);
|
||||
void iwl_pcie_hcmd_complete(struct iwl_trans *trans,
|
||||
|
@ -1043,7 +1043,7 @@ static void iwl_pcie_rx_mq_hw_init(struct iwl_trans *trans)
|
||||
RFH_GEN_CFG_VAL(DEFAULT_RXQ_NUM, 0) |
|
||||
RFH_GEN_CFG_SERVICE_DMA_SNOOP |
|
||||
RFH_GEN_CFG_VAL(RB_CHUNK_SIZE,
|
||||
trans->cfg->integrated ?
|
||||
trans->trans_cfg->integrated ?
|
||||
RFH_GEN_CFG_RB_CHUNK_SIZE_64 :
|
||||
RFH_GEN_CFG_RB_CHUNK_SIZE_128));
|
||||
/* Enable the relevant rx queues */
|
||||
|
@ -1817,7 +1817,7 @@ static int _iwl_trans_pcie_start_hw(struct iwl_trans *trans)
|
||||
iwl_trans_pcie_sw_reset(trans);
|
||||
|
||||
if (trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_22000 &&
|
||||
trans->cfg->integrated) {
|
||||
trans->trans_cfg->integrated) {
|
||||
err = iwl_pcie_gen2_force_power_gating(trans);
|
||||
if (err)
|
||||
return err;
|
||||
@ -2206,6 +2206,13 @@ static int iwl_trans_pcie_write_mem(struct iwl_trans *trans, u32 addr,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int iwl_trans_pcie_read_config32(struct iwl_trans *trans, u32 ofs,
|
||||
u32 *val)
|
||||
{
|
||||
return pci_read_config_dword(IWL_TRANS_GET_PCIE_TRANS(trans)->pci_dev,
|
||||
ofs, val);
|
||||
}
|
||||
|
||||
static void iwl_trans_pcie_freeze_txq_timer(struct iwl_trans *trans,
|
||||
unsigned long txqs,
|
||||
bool freeze)
|
||||
@ -3380,6 +3387,7 @@ static void iwl_trans_pcie_resume(struct iwl_trans *trans)
|
||||
.write_prph = iwl_trans_pcie_write_prph, \
|
||||
.read_mem = iwl_trans_pcie_read_mem, \
|
||||
.write_mem = iwl_trans_pcie_write_mem, \
|
||||
.read_config32 = iwl_trans_pcie_read_config32, \
|
||||
.configure = iwl_trans_pcie_configure, \
|
||||
.set_pmi = iwl_trans_pcie_set_pmi, \
|
||||
.sw_reset = iwl_trans_pcie_sw_reset, \
|
||||
|
@ -1287,7 +1287,7 @@ static int iwl_pcie_set_cmd_in_flight(struct iwl_trans *trans,
|
||||
* need to be reclaimed. As result, some free space forms. If there is
|
||||
* enough free space (> low mark), wake the stack that feeds us.
|
||||
*/
|
||||
void iwl_pcie_cmdq_reclaim(struct iwl_trans *trans, int txq_id, int idx)
|
||||
static void iwl_pcie_cmdq_reclaim(struct iwl_trans *trans, int txq_id, int idx)
|
||||
{
|
||||
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
|
||||
struct iwl_txq *txq = trans_pcie->txq[txq_id];
|
||||
|
@ -232,11 +232,11 @@ static int prism2_download_aux_dump_proc_open(struct inode *inode, struct file *
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct file_operations prism2_download_aux_dump_proc_fops = {
|
||||
.open = prism2_download_aux_dump_proc_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = seq_release_private,
|
||||
static const struct proc_ops prism2_download_aux_dump_proc_ops = {
|
||||
.proc_open = prism2_download_aux_dump_proc_open,
|
||||
.proc_read = seq_read,
|
||||
.proc_lseek = seq_lseek,
|
||||
.proc_release = seq_release_private,
|
||||
};
|
||||
|
||||
|
||||
|
@ -1133,6 +1133,15 @@ enum bt_mp_oper_opcode_8723b {
|
||||
BT_MP_OP_ENABLE_CFO_TRACKING = 0x24,
|
||||
};
|
||||
|
||||
enum rtl8xxxu_bw_mode {
|
||||
RTL8XXXU_CHANNEL_WIDTH_20 = 0,
|
||||
RTL8XXXU_CHANNEL_WIDTH_40 = 1,
|
||||
RTL8XXXU_CHANNEL_WIDTH_80 = 2,
|
||||
RTL8XXXU_CHANNEL_WIDTH_160 = 3,
|
||||
RTL8XXXU_CHANNEL_WIDTH_80_80 = 4,
|
||||
RTL8XXXU_CHANNEL_WIDTH_MAX = 5,
|
||||
};
|
||||
|
||||
struct rtl8723bu_c2h {
|
||||
u8 id;
|
||||
u8 seq;
|
||||
@ -1174,13 +1183,16 @@ struct rtl8723bu_c2h {
|
||||
} __packed bt_info;
|
||||
struct {
|
||||
u8 rate:7;
|
||||
u8 dummy0_0:1;
|
||||
u8 sgi:1;
|
||||
u8 macid;
|
||||
u8 ldpc:1;
|
||||
u8 txbf:1;
|
||||
u8 noisy_state:1;
|
||||
u8 dummy2_0:5;
|
||||
u8 dummy3_0;
|
||||
u8 dummy4_0;
|
||||
u8 dummy5_0;
|
||||
u8 bw;
|
||||
} __packed ra_report;
|
||||
};
|
||||
};
|
||||
@ -1260,6 +1272,12 @@ struct rtl8xxxu_btcoex {
|
||||
#define RTL8XXXU_SNR_THRESH_HIGH 50
|
||||
#define RTL8XXXU_SNR_THRESH_LOW 20
|
||||
|
||||
struct rtl8xxxu_ra_report {
|
||||
struct rate_info txrate;
|
||||
u32 bit_rate;
|
||||
u8 desc_rate;
|
||||
};
|
||||
|
||||
struct rtl8xxxu_priv {
|
||||
struct ieee80211_hw *hw;
|
||||
struct usb_device *udev;
|
||||
@ -1375,6 +1393,7 @@ struct rtl8xxxu_priv {
|
||||
struct sk_buff_head c2hcmd_queue;
|
||||
spinlock_t c2hcmd_lock;
|
||||
struct rtl8xxxu_btcoex bt_coex;
|
||||
struct rtl8xxxu_ra_report ra_report;
|
||||
};
|
||||
|
||||
struct rtl8xxxu_rx_urb {
|
||||
|
@ -4328,7 +4328,7 @@ void rtl8xxxu_gen2_update_rate_mask(struct rtl8xxxu_priv *priv,
|
||||
u32 ramask, u8 rateid, int sgi)
|
||||
{
|
||||
struct h2c_cmd h2c;
|
||||
u8 bw = 0;
|
||||
u8 bw = RTL8XXXU_CHANNEL_WIDTH_20;
|
||||
|
||||
memset(&h2c, 0, sizeof(struct h2c_cmd));
|
||||
|
||||
@ -5389,6 +5389,35 @@ void rtl8723bu_handle_bt_info(struct rtl8xxxu_priv *priv)
|
||||
}
|
||||
}
|
||||
|
||||
static struct ieee80211_rate rtl8xxxu_legacy_ratetable[] = {
|
||||
{.bitrate = 10, .hw_value = 0x00,},
|
||||
{.bitrate = 20, .hw_value = 0x01,},
|
||||
{.bitrate = 55, .hw_value = 0x02,},
|
||||
{.bitrate = 110, .hw_value = 0x03,},
|
||||
{.bitrate = 60, .hw_value = 0x04,},
|
||||
{.bitrate = 90, .hw_value = 0x05,},
|
||||
{.bitrate = 120, .hw_value = 0x06,},
|
||||
{.bitrate = 180, .hw_value = 0x07,},
|
||||
{.bitrate = 240, .hw_value = 0x08,},
|
||||
{.bitrate = 360, .hw_value = 0x09,},
|
||||
{.bitrate = 480, .hw_value = 0x0a,},
|
||||
{.bitrate = 540, .hw_value = 0x0b,},
|
||||
};
|
||||
|
||||
static void rtl8xxxu_desc_to_mcsrate(u16 rate, u8 *mcs, u8 *nss)
|
||||
{
|
||||
if (rate <= DESC_RATE_54M)
|
||||
return;
|
||||
|
||||
if (rate >= DESC_RATE_MCS0 && rate <= DESC_RATE_MCS15) {
|
||||
if (rate < DESC_RATE_MCS8)
|
||||
*nss = 1;
|
||||
else
|
||||
*nss = 2;
|
||||
*mcs = rate - DESC_RATE_MCS0;
|
||||
}
|
||||
}
|
||||
|
||||
static void rtl8xxxu_c2hcmd_callback(struct work_struct *work)
|
||||
{
|
||||
struct rtl8xxxu_priv *priv;
|
||||
@ -5397,9 +5426,14 @@ static void rtl8xxxu_c2hcmd_callback(struct work_struct *work)
|
||||
unsigned long flags;
|
||||
u8 bt_info = 0;
|
||||
struct rtl8xxxu_btcoex *btcoex;
|
||||
struct rtl8xxxu_ra_report *rarpt;
|
||||
u8 rate, sgi, bw;
|
||||
u32 bit_rate;
|
||||
u8 mcs = 0, nss = 0;
|
||||
|
||||
priv = container_of(work, struct rtl8xxxu_priv, c2hcmd_work);
|
||||
btcoex = &priv->bt_coex;
|
||||
rarpt = &priv->ra_report;
|
||||
|
||||
if (priv->rf_paths > 1)
|
||||
goto out;
|
||||
@ -5422,6 +5456,34 @@ static void rtl8xxxu_c2hcmd_callback(struct work_struct *work)
|
||||
}
|
||||
rtl8723bu_handle_bt_info(priv);
|
||||
break;
|
||||
case C2H_8723B_RA_REPORT:
|
||||
rarpt->txrate.flags = 0;
|
||||
rate = c2h->ra_report.rate;
|
||||
sgi = c2h->ra_report.sgi;
|
||||
bw = c2h->ra_report.bw;
|
||||
|
||||
if (rate < DESC_RATE_MCS0) {
|
||||
rarpt->txrate.legacy =
|
||||
rtl8xxxu_legacy_ratetable[rate].bitrate;
|
||||
} else {
|
||||
rtl8xxxu_desc_to_mcsrate(rate, &mcs, &nss);
|
||||
rarpt->txrate.flags |= RATE_INFO_FLAGS_MCS;
|
||||
|
||||
rarpt->txrate.mcs = mcs;
|
||||
rarpt->txrate.nss = nss;
|
||||
|
||||
if (sgi) {
|
||||
rarpt->txrate.flags |=
|
||||
RATE_INFO_FLAGS_SHORT_GI;
|
||||
}
|
||||
|
||||
if (bw == RATE_INFO_BW_20)
|
||||
rarpt->txrate.bw |= RATE_INFO_BW_20;
|
||||
}
|
||||
bit_rate = cfg80211_calculate_bitrate(&rarpt->txrate);
|
||||
rarpt->bit_rate = bit_rate;
|
||||
rarpt->desc_rate = rate;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -5465,7 +5527,7 @@ static void rtl8723bu_handle_c2h(struct rtl8xxxu_priv *priv,
|
||||
case C2H_8723B_RA_REPORT:
|
||||
dev_dbg(dev,
|
||||
"C2H RA RPT: rate %02x, unk %i, macid %02x, noise %i\n",
|
||||
c2h->ra_report.rate, c2h->ra_report.dummy0_0,
|
||||
c2h->ra_report.rate, c2h->ra_report.sgi,
|
||||
c2h->ra_report.macid, c2h->ra_report.noisy_state);
|
||||
break;
|
||||
default:
|
||||
@ -6069,6 +6131,16 @@ rtl8xxxu_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
rtl8xxxu_sta_statistics(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta, struct station_info *sinfo)
|
||||
{
|
||||
struct rtl8xxxu_priv *priv = hw->priv;
|
||||
|
||||
sinfo->txrate = priv->ra_report.txrate;
|
||||
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
|
||||
}
|
||||
|
||||
static u8 rtl8xxxu_signal_to_snr(int signal)
|
||||
{
|
||||
if (signal < RTL8XXXU_NOISE_FLOOR_MIN)
|
||||
@ -6371,6 +6443,7 @@ static const struct ieee80211_ops rtl8xxxu_ops = {
|
||||
.sw_scan_complete = rtl8xxxu_sw_scan_complete,
|
||||
.set_key = rtl8xxxu_set_key,
|
||||
.ampdu_action = rtl8xxxu_ampdu_action,
|
||||
.sta_statistics = rtl8xxxu_sta_statistics,
|
||||
};
|
||||
|
||||
static int rtl8xxxu_parse_usb(struct rtl8xxxu_priv *priv,
|
||||
|
@ -2503,3 +2503,495 @@ void rtw_coex_defreeze_work(struct work_struct *work)
|
||||
rtw_coex_run_coex(rtwdev, COEX_RSN_WLSTATUS);
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_RTW88_DEBUGFS
|
||||
#define INFO_SIZE 80
|
||||
|
||||
#define case_BTINFO(src) \
|
||||
case COEX_BTINFO_SRC_##src: return #src
|
||||
|
||||
static const char *rtw_coex_get_bt_info_src_string(u8 bt_info_src)
|
||||
{
|
||||
switch (bt_info_src) {
|
||||
case_BTINFO(WL_FW);
|
||||
case_BTINFO(BT_RSP);
|
||||
case_BTINFO(BT_ACT);
|
||||
default:
|
||||
return "Unknown";
|
||||
}
|
||||
}
|
||||
|
||||
#define case_RSN(src) \
|
||||
case COEX_RSN_##src: return #src
|
||||
|
||||
static const char *rtw_coex_get_reason_string(u8 reason)
|
||||
{
|
||||
switch (reason) {
|
||||
case_RSN(2GSCANSTART);
|
||||
case_RSN(5GSCANSTART);
|
||||
case_RSN(SCANFINISH);
|
||||
case_RSN(2GSWITCHBAND);
|
||||
case_RSN(5GSWITCHBAND);
|
||||
case_RSN(2GCONSTART);
|
||||
case_RSN(5GCONSTART);
|
||||
case_RSN(2GCONFINISH);
|
||||
case_RSN(5GCONFINISH);
|
||||
case_RSN(2GMEDIA);
|
||||
case_RSN(5GMEDIA);
|
||||
case_RSN(MEDIADISCON);
|
||||
case_RSN(BTINFO);
|
||||
case_RSN(LPS);
|
||||
case_RSN(WLSTATUS);
|
||||
default:
|
||||
return "Unknown";
|
||||
}
|
||||
}
|
||||
|
||||
static int rtw_coex_addr_info(struct rtw_dev *rtwdev,
|
||||
const struct rtw_reg_domain *reg,
|
||||
char addr_info[], int n)
|
||||
{
|
||||
const char *rf_prefix = "";
|
||||
const char *sep = n == 0 ? "" : "/ ";
|
||||
int ffs, fls;
|
||||
int max_fls;
|
||||
|
||||
if (INFO_SIZE - n <= 0)
|
||||
return 0;
|
||||
|
||||
switch (reg->domain) {
|
||||
case RTW_REG_DOMAIN_MAC32:
|
||||
max_fls = 31;
|
||||
break;
|
||||
case RTW_REG_DOMAIN_MAC16:
|
||||
max_fls = 15;
|
||||
break;
|
||||
case RTW_REG_DOMAIN_MAC8:
|
||||
max_fls = 7;
|
||||
break;
|
||||
case RTW_REG_DOMAIN_RF_A:
|
||||
case RTW_REG_DOMAIN_RF_B:
|
||||
rf_prefix = "RF_";
|
||||
max_fls = 19;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
ffs = __ffs(reg->mask);
|
||||
fls = __fls(reg->mask);
|
||||
|
||||
if (ffs == 0 && fls == max_fls)
|
||||
return scnprintf(addr_info + n, INFO_SIZE - n, "%s%s%x",
|
||||
sep, rf_prefix, reg->addr);
|
||||
else if (ffs == fls)
|
||||
return scnprintf(addr_info + n, INFO_SIZE - n, "%s%s%x[%d]",
|
||||
sep, rf_prefix, reg->addr, ffs);
|
||||
else
|
||||
return scnprintf(addr_info + n, INFO_SIZE - n, "%s%s%x[%d:%d]",
|
||||
sep, rf_prefix, reg->addr, fls, ffs);
|
||||
}
|
||||
|
||||
static int rtw_coex_val_info(struct rtw_dev *rtwdev,
|
||||
const struct rtw_reg_domain *reg,
|
||||
char val_info[], int n)
|
||||
{
|
||||
const char *sep = n == 0 ? "" : "/ ";
|
||||
u8 rf_path;
|
||||
|
||||
if (INFO_SIZE - n <= 0)
|
||||
return 0;
|
||||
|
||||
switch (reg->domain) {
|
||||
case RTW_REG_DOMAIN_MAC32:
|
||||
return scnprintf(val_info + n, INFO_SIZE - n, "%s0x%x", sep,
|
||||
rtw_read32_mask(rtwdev, reg->addr, reg->mask));
|
||||
case RTW_REG_DOMAIN_MAC16:
|
||||
return scnprintf(val_info + n, INFO_SIZE - n, "%s0x%x", sep,
|
||||
rtw_read16_mask(rtwdev, reg->addr, reg->mask));
|
||||
case RTW_REG_DOMAIN_MAC8:
|
||||
return scnprintf(val_info + n, INFO_SIZE - n, "%s0x%x", sep,
|
||||
rtw_read8_mask(rtwdev, reg->addr, reg->mask));
|
||||
case RTW_REG_DOMAIN_RF_A:
|
||||
rf_path = RF_PATH_A;
|
||||
break;
|
||||
case RTW_REG_DOMAIN_RF_B:
|
||||
rf_path = RF_PATH_B;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* only RF go through here */
|
||||
return scnprintf(val_info + n, INFO_SIZE - n, "%s0x%x", sep,
|
||||
rtw_read_rf(rtwdev, rf_path, reg->addr, reg->mask));
|
||||
}
|
||||
|
||||
static void rtw_coex_set_coexinfo_hw(struct rtw_dev *rtwdev, struct seq_file *m)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_reg_domain *reg;
|
||||
char addr_info[INFO_SIZE];
|
||||
int n_addr = 0;
|
||||
char val_info[INFO_SIZE];
|
||||
int n_val = 0;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < chip->coex_info_hw_regs_num; i++) {
|
||||
reg = &chip->coex_info_hw_regs[i];
|
||||
|
||||
n_addr += rtw_coex_addr_info(rtwdev, reg, addr_info, n_addr);
|
||||
n_val += rtw_coex_val_info(rtwdev, reg, val_info, n_val);
|
||||
|
||||
if (reg->domain == RTW_REG_DOMAIN_NL) {
|
||||
seq_printf(m, "%-40s = %s\n", addr_info, val_info);
|
||||
n_addr = 0;
|
||||
n_val = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (n_addr != 0 && n_val != 0)
|
||||
seq_printf(m, "%-40s = %s\n", addr_info, val_info);
|
||||
}
|
||||
|
||||
static bool rtw_coex_get_bt_reg(struct rtw_dev *rtwdev,
|
||||
u8 type, u16 addr, u16 *val)
|
||||
{
|
||||
struct rtw_coex_info_req req = {0};
|
||||
struct sk_buff *skb;
|
||||
__le16 le_addr;
|
||||
u8 *payload;
|
||||
|
||||
le_addr = cpu_to_le16(addr);
|
||||
req.op_code = BT_MP_INFO_OP_READ_REG;
|
||||
req.para1 = type;
|
||||
req.para2 = le16_get_bits(le_addr, GENMASK(7, 0));
|
||||
req.para3 = le16_get_bits(le_addr, GENMASK(15, 8));
|
||||
skb = rtw_coex_info_request(rtwdev, &req);
|
||||
if (!skb) {
|
||||
*val = 0xeaea;
|
||||
return false;
|
||||
}
|
||||
|
||||
payload = get_payload_from_coex_resp(skb);
|
||||
*val = GET_COEX_RESP_BT_REG_VAL(payload);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool rtw_coex_get_bt_patch_version(struct rtw_dev *rtwdev,
|
||||
u32 *patch_version)
|
||||
{
|
||||
struct rtw_coex_info_req req = {0};
|
||||
struct sk_buff *skb;
|
||||
u8 *payload;
|
||||
bool ret = false;
|
||||
|
||||
req.op_code = BT_MP_INFO_OP_PATCH_VER;
|
||||
skb = rtw_coex_info_request(rtwdev, &req);
|
||||
if (!skb)
|
||||
goto out;
|
||||
|
||||
payload = get_payload_from_coex_resp(skb);
|
||||
*patch_version = GET_COEX_RESP_BT_PATCH_VER(payload);
|
||||
ret = true;
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static bool rtw_coex_get_bt_supported_version(struct rtw_dev *rtwdev,
|
||||
u32 *supported_version)
|
||||
{
|
||||
struct rtw_coex_info_req req = {0};
|
||||
struct sk_buff *skb;
|
||||
u8 *payload;
|
||||
bool ret = false;
|
||||
|
||||
req.op_code = BT_MP_INFO_OP_SUPP_VER;
|
||||
skb = rtw_coex_info_request(rtwdev, &req);
|
||||
if (!skb)
|
||||
goto out;
|
||||
|
||||
payload = get_payload_from_coex_resp(skb);
|
||||
*supported_version = GET_COEX_RESP_BT_SUPP_VER(payload);
|
||||
ret = true;
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static bool rtw_coex_get_bt_supported_feature(struct rtw_dev *rtwdev,
|
||||
u32 *supported_feature)
|
||||
{
|
||||
struct rtw_coex_info_req req = {0};
|
||||
struct sk_buff *skb;
|
||||
u8 *payload;
|
||||
bool ret = false;
|
||||
|
||||
req.op_code = BT_MP_INFO_OP_SUPP_FEAT;
|
||||
skb = rtw_coex_info_request(rtwdev, &req);
|
||||
if (!skb)
|
||||
goto out;
|
||||
|
||||
payload = get_payload_from_coex_resp(skb);
|
||||
*supported_feature = GET_COEX_RESP_BT_SUPP_FEAT(payload);
|
||||
ret = true;
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
struct rtw_coex_sta_stat_iter_data {
|
||||
struct rtw_vif *rtwvif;
|
||||
struct seq_file *file;
|
||||
};
|
||||
|
||||
static void rtw_coex_sta_stat_iter(void *data, struct ieee80211_sta *sta)
|
||||
{
|
||||
struct rtw_coex_sta_stat_iter_data *sta_iter_data = data;
|
||||
struct rtw_vif *rtwvif = sta_iter_data->rtwvif;
|
||||
struct rtw_sta_info *si = (struct rtw_sta_info *)sta->drv_priv;
|
||||
struct seq_file *m = sta_iter_data->file;
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
|
||||
u8 rssi;
|
||||
|
||||
if (si->vif != vif)
|
||||
return;
|
||||
|
||||
rssi = ewma_rssi_read(&si->avg_rssi);
|
||||
seq_printf(m, "\tPeer %3d\n", si->mac_id);
|
||||
seq_printf(m, "\t\t%-24s = %d\n", "RSSI", rssi);
|
||||
seq_printf(m, "\t\t%-24s = %d\n", "BW mode", si->bw_mode);
|
||||
}
|
||||
|
||||
struct rtw_coex_vif_stat_iter_data {
|
||||
struct rtw_dev *rtwdev;
|
||||
struct seq_file *file;
|
||||
};
|
||||
|
||||
static void rtw_coex_vif_stat_iter(void *data, u8 *mac,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
struct rtw_coex_vif_stat_iter_data *vif_iter_data = data;
|
||||
struct rtw_coex_sta_stat_iter_data sta_iter_data;
|
||||
struct rtw_dev *rtwdev = vif_iter_data->rtwdev;
|
||||
struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv;
|
||||
struct seq_file *m = vif_iter_data->file;
|
||||
struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
|
||||
|
||||
seq_printf(m, "Iface on Port (%d)\n", rtwvif->port);
|
||||
seq_printf(m, "\t%-32s = %d\n",
|
||||
"Beacon interval", bss_conf->beacon_int);
|
||||
seq_printf(m, "\t%-32s = %d\n",
|
||||
"Network Type", rtwvif->net_type);
|
||||
|
||||
sta_iter_data.rtwvif = rtwvif;
|
||||
sta_iter_data.file = m;
|
||||
rtw_iterate_stas_atomic(rtwdev, rtw_coex_sta_stat_iter,
|
||||
&sta_iter_data);
|
||||
}
|
||||
|
||||
void rtw_coex_display_coex_info(struct rtw_dev *rtwdev, struct seq_file *m)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_dm_info *dm_info = &rtwdev->dm_info;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
struct rtw_coex_dm *coex_dm = &coex->dm;
|
||||
struct rtw_hal *hal = &rtwdev->hal;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
struct rtw_fw_state *fw = &rtwdev->fw;
|
||||
struct rtw_coex_vif_stat_iter_data vif_iter_data;
|
||||
u8 reason = coex_dm->reason;
|
||||
u8 sys_lte;
|
||||
u16 score_board_WB, score_board_BW;
|
||||
u32 wl_reg_6c0, wl_reg_6c4, wl_reg_6c8, wl_reg_778, wl_reg_6cc;
|
||||
u32 lte_coex, bt_coex;
|
||||
u32 bt_hi_pri, bt_lo_pri;
|
||||
int i;
|
||||
|
||||
score_board_BW = rtw_coex_read_scbd(rtwdev);
|
||||
score_board_WB = coex_stat->score_board;
|
||||
wl_reg_6c0 = rtw_read32(rtwdev, 0x6c0);
|
||||
wl_reg_6c4 = rtw_read32(rtwdev, 0x6c4);
|
||||
wl_reg_6c8 = rtw_read32(rtwdev, 0x6c8);
|
||||
wl_reg_6cc = rtw_read32(rtwdev, 0x6cc);
|
||||
wl_reg_778 = rtw_read32(rtwdev, 0x778);
|
||||
bt_hi_pri = rtw_read32(rtwdev, 0x770);
|
||||
bt_lo_pri = rtw_read32(rtwdev, 0x774);
|
||||
rtw_write8(rtwdev, 0x76e, 0xc);
|
||||
sys_lte = rtw_read8(rtwdev, 0x73);
|
||||
lte_coex = rtw_coex_read_indirect_reg(rtwdev, 0x38);
|
||||
bt_coex = rtw_coex_read_indirect_reg(rtwdev, 0x54);
|
||||
|
||||
if (!coex_stat->bt_disabled && !coex_stat->bt_mailbox_reply) {
|
||||
rtw_coex_get_bt_supported_version(rtwdev,
|
||||
&coex_stat->bt_supported_version);
|
||||
rtw_coex_get_bt_patch_version(rtwdev, &coex_stat->patch_ver);
|
||||
rtw_coex_get_bt_supported_feature(rtwdev,
|
||||
&coex_stat->bt_supported_feature);
|
||||
rtw_coex_get_bt_reg(rtwdev, 3, 0xae, &coex_stat->bt_reg_vendor_ae);
|
||||
rtw_coex_get_bt_reg(rtwdev, 3, 0xac, &coex_stat->bt_reg_vendor_ac);
|
||||
|
||||
if (coex_stat->patch_ver != 0)
|
||||
coex_stat->bt_mailbox_reply = true;
|
||||
}
|
||||
|
||||
seq_printf(m, "**********************************************\n");
|
||||
seq_printf(m, "\t\tBT Coexist info %x\n", chip->id);
|
||||
seq_printf(m, "**********************************************\n");
|
||||
seq_printf(m, "%-40s = %s/ %d\n",
|
||||
"Mech/ RFE",
|
||||
efuse->share_ant ? "Shared" : "Non-Shared",
|
||||
efuse->rfe_option);
|
||||
seq_printf(m, "%-40s = %08x/ 0x%02x/ 0x%08x %s\n",
|
||||
"Coex Ver/ BT Dez/ BT Rpt",
|
||||
chip->coex_para_ver, chip->bt_desired_ver,
|
||||
coex_stat->bt_supported_version,
|
||||
coex_stat->bt_disabled ? "(BT disabled)" :
|
||||
coex_stat->bt_supported_version >= chip->bt_desired_ver ?
|
||||
"(Match)" : "(Mismatch)");
|
||||
seq_printf(m, "%-40s = %s/ %u/ %d\n",
|
||||
"Role/ RoleSwCnt/ IgnWL/ Feature",
|
||||
coex_stat->bt_slave ? "Slave" : "Master",
|
||||
coex_stat->cnt_bt[COEX_CNT_BT_ROLESWITCH],
|
||||
coex_dm->ignore_wl_act);
|
||||
seq_printf(m, "%-40s = %u.%u/ 0x%x/ %c\n",
|
||||
"WL FW/ BT FW/ KT",
|
||||
fw->version, fw->sub_version,
|
||||
coex_stat->patch_ver, coex_stat->kt_ver + 65);
|
||||
seq_printf(m, "%-40s = %u/ %u/ %u/ ch-(%u)\n",
|
||||
"AFH Map",
|
||||
coex_dm->wl_ch_info[0], coex_dm->wl_ch_info[1],
|
||||
coex_dm->wl_ch_info[2], hal->current_channel);
|
||||
|
||||
seq_printf(m, "**********************************************\n");
|
||||
seq_printf(m, "\t\tBT Status\n");
|
||||
seq_printf(m, "**********************************************\n");
|
||||
seq_printf(m, "%-40s = %s/ %ddBm/ %u/ %u\n",
|
||||
"BT status/ rssi/ retry/ pop",
|
||||
coex_dm->bt_status == COEX_BTSTATUS_NCON_IDLE ? "non-conn" :
|
||||
coex_dm->bt_status == COEX_BTSTATUS_CON_IDLE ? "conn-idle" : "busy",
|
||||
coex_stat->bt_rssi - 100,
|
||||
coex_stat->cnt_bt[COEX_CNT_BT_RETRY],
|
||||
coex_stat->cnt_bt[COEX_CNT_BT_POPEVENT]);
|
||||
seq_printf(m, "%-40s = %s%s%s%s%s (multi-link %d)\n",
|
||||
"Profiles",
|
||||
coex_stat->bt_a2dp_exist ? (coex_stat->bt_a2dp_sink ?
|
||||
"A2DP sink," : "A2DP,") : "",
|
||||
coex_stat->bt_hfp_exist ? "HFP," : "",
|
||||
coex_stat->bt_hid_exist ?
|
||||
(coex_stat->bt_ble_exist ? "HID(RCU)," :
|
||||
coex_stat->bt_hid_slot >= 2 ? "HID(4/18)" :
|
||||
"HID(2/18),") : "",
|
||||
coex_stat->bt_pan_exist ? coex_stat->bt_opp_exist ?
|
||||
"OPP," : "PAN," : "",
|
||||
coex_stat->bt_ble_voice ? "Voice," : "",
|
||||
coex_stat->bt_multi_link);
|
||||
seq_printf(m, "%-40s = %u/ %u/ %u/ 0x%08x\n",
|
||||
"Reinit/ Relink/ IgnWl/ Feature",
|
||||
coex_stat->cnt_bt[COEX_CNT_BT_REINIT],
|
||||
coex_stat->cnt_bt[COEX_CNT_BT_SETUPLINK],
|
||||
coex_stat->cnt_bt[COEX_CNT_BT_IGNWLANACT],
|
||||
coex_stat->bt_supported_feature);
|
||||
seq_printf(m, "%-40s = %u/ %u/ %u/ %u\n",
|
||||
"Page/ Inq/ iqk/ iqk fail",
|
||||
coex_stat->cnt_bt[COEX_CNT_BT_PAGE],
|
||||
coex_stat->cnt_bt[COEX_CNT_BT_INQ],
|
||||
coex_stat->cnt_bt[COEX_CNT_BT_IQK],
|
||||
coex_stat->cnt_bt[COEX_CNT_BT_IQKFAIL]);
|
||||
seq_printf(m, "%-40s = 0x%04x/ 0x%04x/ 0x%04x/ 0x%04x\n",
|
||||
"0xae/ 0xac/ score board (W->B)/ (B->W)",
|
||||
coex_stat->bt_reg_vendor_ae,
|
||||
coex_stat->bt_reg_vendor_ac,
|
||||
score_board_WB, score_board_BW);
|
||||
seq_printf(m, "%-40s = %u/%u, %u/%u\n",
|
||||
"Hi-Pri TX/RX, Lo-Pri TX/RX",
|
||||
bt_hi_pri & 0xffff, bt_hi_pri >> 16,
|
||||
bt_lo_pri & 0xffff, bt_lo_pri >> 16);
|
||||
for (i = 0; i < COEX_BTINFO_SRC_BT_IQK; i++)
|
||||
seq_printf(m, "%-40s = %7ph\n",
|
||||
rtw_coex_get_bt_info_src_string(i),
|
||||
coex_stat->bt_info_c2h[i]);
|
||||
|
||||
seq_printf(m, "**********************************************\n");
|
||||
seq_printf(m, "\t\tWiFi Status\n");
|
||||
seq_printf(m, "**********************************************\n");
|
||||
seq_printf(m, "%-40s = %d\n",
|
||||
"Scanning", test_bit(RTW_FLAG_SCANNING, rtwdev->flags));
|
||||
seq_printf(m, "%-40s = %u/ TX %d Mbps/ RX %d Mbps\n",
|
||||
"G_busy/ TX/ RX",
|
||||
coex_stat->wl_gl_busy,
|
||||
rtwdev->stats.tx_throughput, rtwdev->stats.rx_throughput);
|
||||
seq_printf(m, "%-40s = %u/ %u/ %u\n",
|
||||
"IPS/ Low Power/ PS mode",
|
||||
test_bit(RTW_FLAG_INACTIVE_PS, rtwdev->flags),
|
||||
test_bit(RTW_FLAG_LEISURE_PS_DEEP, rtwdev->flags),
|
||||
rtwdev->lps_conf.mode);
|
||||
|
||||
vif_iter_data.rtwdev = rtwdev;
|
||||
vif_iter_data.file = m;
|
||||
rtw_iterate_vifs_atomic(rtwdev, rtw_coex_vif_stat_iter, &vif_iter_data);
|
||||
|
||||
seq_printf(m, "**********************************************\n");
|
||||
seq_printf(m, "\t\tMechanism\n");
|
||||
seq_printf(m, "**********************************************\n");
|
||||
seq_printf(m, "%-40s = %5ph (case-%d)\n",
|
||||
"TDMA",
|
||||
coex_dm->ps_tdma_para, coex_dm->cur_ps_tdma);
|
||||
seq_printf(m, "%-40s = %d\n",
|
||||
"Timer base", coex_stat->tdma_timer_base);
|
||||
seq_printf(m, "%-40s = %d/ 0x%08x/ 0x%08x/ 0x%08x\n",
|
||||
"Table/ 0x6c0/ 0x6c4/ 0x6c8",
|
||||
coex_dm->cur_table, wl_reg_6c0, wl_reg_6c4, wl_reg_6c8);
|
||||
seq_printf(m, "%-40s = 0x%08x/ 0x%08x/ reason (%s)\n",
|
||||
"0x778/ 0x6cc/ Reason",
|
||||
wl_reg_778, wl_reg_6cc, rtw_coex_get_reason_string(reason));
|
||||
seq_printf(m, "%-40s = %u/ %u/ %u/ %u/ %u\n",
|
||||
"Null All/ Retry/ Ack/ BT Empty/ BT Late",
|
||||
coex_stat->wl_fw_dbg_info[1], coex_stat->wl_fw_dbg_info[2],
|
||||
coex_stat->wl_fw_dbg_info[3], coex_stat->wl_fw_dbg_info[4],
|
||||
coex_stat->wl_fw_dbg_info[5]);
|
||||
seq_printf(m, "%-40s = %u/ %u/ %s/ %u\n",
|
||||
"Cnt TDMA Toggle/ Lk 5ms/ Lk 5ms on/ FW",
|
||||
coex_stat->wl_fw_dbg_info[6],
|
||||
coex_stat->wl_fw_dbg_info[7],
|
||||
coex_stat->wl_slot_extend ? "Yes" : "No",
|
||||
coex_stat->cnt_wl[COEX_CNT_WL_FW_NOTIFY]);
|
||||
|
||||
seq_printf(m, "**********************************************\n");
|
||||
seq_printf(m, "\t\tHW setting\n");
|
||||
seq_printf(m, "**********************************************\n");
|
||||
seq_printf(m, "%-40s = %s/ %s\n",
|
||||
"LTE Coex/ Path Owner",
|
||||
lte_coex & BIT(7) ? "ON" : "OFF",
|
||||
sys_lte & BIT(2) ? "WL" : "BT");
|
||||
seq_printf(m, "%-40s = RF:%s_BB:%s/ RF:%s_BB:%s/ %s\n",
|
||||
"GNT_WL_CTRL/ GNT_BT_CTRL/ Dbg",
|
||||
lte_coex & BIT(12) ? "SW" : "HW",
|
||||
lte_coex & BIT(8) ? "SW" : "HW",
|
||||
lte_coex & BIT(14) ? "SW" : "HW",
|
||||
lte_coex & BIT(10) ? "SW" : "HW",
|
||||
sys_lte & BIT(3) ? "On" : "Off");
|
||||
seq_printf(m, "%-40s = %lu/ %lu\n",
|
||||
"GNT_WL/ GNT_BT",
|
||||
(bt_coex & BIT(2)) >> 2, (bt_coex & BIT(3)) >> 3);
|
||||
seq_printf(m, "%-40s = %u/ %u/ %u/ %u\n",
|
||||
"CRC OK CCK/ OFDM/ HT/ VHT",
|
||||
dm_info->cck_ok_cnt, dm_info->ofdm_ok_cnt,
|
||||
dm_info->ht_ok_cnt, dm_info->vht_ok_cnt);
|
||||
seq_printf(m, "%-40s = %u/ %u/ %u/ %u\n",
|
||||
"CRC ERR CCK/ OFDM/ HT/ VHT",
|
||||
dm_info->cck_err_cnt, dm_info->ofdm_err_cnt,
|
||||
dm_info->ht_err_cnt, dm_info->vht_err_cnt);
|
||||
seq_printf(m, "%-40s = %s/ %s/ %s/ %u\n",
|
||||
"HiPr/ Locking/ Locked/ Noisy",
|
||||
coex_stat->wl_hi_pri_task1 ? "Y" : "N",
|
||||
coex_stat->wl_cck_lock ? "Y" : "N",
|
||||
coex_stat->wl_cck_lock_ever ? "Y" : "N",
|
||||
coex_stat->wl_noisy_level);
|
||||
|
||||
rtw_coex_set_coexinfo_hw(rtwdev, m);
|
||||
}
|
||||
#endif /* CONFIG_RTW88_DEBUGFS */
|
||||
|
@ -46,6 +46,14 @@
|
||||
(__rssi__ == COEX_RSSI_STATE_LOW || \
|
||||
__rssi__ == COEX_RSSI_STATE_STAY_LOW ? true : false); })
|
||||
|
||||
#define GET_COEX_RESP_BT_SUPP_VER(payload) \
|
||||
le64_get_bits(*((__le64 *)(payload)), GENMASK_ULL(39, 32))
|
||||
#define GET_COEX_RESP_BT_SUPP_FEAT(payload) \
|
||||
le64_get_bits(*((__le64 *)(payload)), GENMASK_ULL(39, 24))
|
||||
#define GET_COEX_RESP_BT_PATCH_VER(payload) \
|
||||
le64_get_bits(*((__le64 *)(payload)), GENMASK_ULL(55, 24))
|
||||
#define GET_COEX_RESP_BT_REG_VAL(payload) \
|
||||
le64_get_bits(*((__le64 *)(payload)), GENMASK_ULL(39, 24))
|
||||
#define GET_COEX_RESP_BT_SCAN_TYPE(payload) \
|
||||
le64_get_bits(*((__le64 *)(payload)), GENMASK(31, 24))
|
||||
|
||||
@ -367,4 +375,6 @@ void rtw_coex_wl_fwdbginfo_notify(struct rtw_dev *rtwdev, u8 *buf, u8 length);
|
||||
void rtw_coex_switchband_notify(struct rtw_dev *rtwdev, u8 type);
|
||||
void rtw_coex_wl_status_change_notify(struct rtw_dev *rtwdev);
|
||||
|
||||
void rtw_coex_display_coex_info(struct rtw_dev *rtwdev, struct seq_file *m);
|
||||
|
||||
#endif
|
||||
|
@ -5,6 +5,7 @@
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include "main.h"
|
||||
#include "coex.h"
|
||||
#include "sec.h"
|
||||
#include "fw.h"
|
||||
#include "debug.h"
|
||||
@ -691,6 +692,56 @@ static int rtw_debugfs_get_phy_info(struct seq_file *m, void *v)
|
||||
dm_info->ht_ok_cnt, dm_info->ht_err_cnt);
|
||||
seq_printf(m, " * VHT cnt (ok, err) = (%u, %u)\n",
|
||||
dm_info->vht_ok_cnt, dm_info->vht_err_cnt);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtw_debugfs_get_coex_info(struct seq_file *m, void *v)
|
||||
{
|
||||
struct rtw_debugfs_priv *debugfs_priv = m->private;
|
||||
struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
|
||||
|
||||
rtw_coex_display_coex_info(rtwdev, m);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t rtw_debugfs_set_coex_enable(struct file *filp,
|
||||
const char __user *buffer,
|
||||
size_t count, loff_t *loff)
|
||||
{
|
||||
struct seq_file *seqpriv = (struct seq_file *)filp->private_data;
|
||||
struct rtw_debugfs_priv *debugfs_priv = seqpriv->private;
|
||||
struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
char tmp[32 + 1];
|
||||
bool enable;
|
||||
int ret;
|
||||
|
||||
rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 1);
|
||||
|
||||
ret = kstrtobool(tmp, &enable);
|
||||
if (ret) {
|
||||
rtw_warn(rtwdev, "invalid arguments\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
coex->stop_dm = enable == 0;
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static int rtw_debugfs_get_coex_enable(struct seq_file *m, void *v)
|
||||
{
|
||||
struct rtw_debugfs_priv *debugfs_priv = m->private;
|
||||
struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
|
||||
seq_printf(m, "coex mechanism %s\n",
|
||||
coex->stop_dm ? "disabled" : "enabled");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -784,6 +835,15 @@ static struct rtw_debugfs_priv rtw_debug_priv_phy_info = {
|
||||
.cb_read = rtw_debugfs_get_phy_info,
|
||||
};
|
||||
|
||||
static struct rtw_debugfs_priv rtw_debug_priv_coex_enable = {
|
||||
.cb_write = rtw_debugfs_set_coex_enable,
|
||||
.cb_read = rtw_debugfs_get_coex_enable,
|
||||
};
|
||||
|
||||
static struct rtw_debugfs_priv rtw_debug_priv_coex_info = {
|
||||
.cb_read = rtw_debugfs_get_coex_info,
|
||||
};
|
||||
|
||||
#define rtw_debugfs_add_core(name, mode, fopname, parent) \
|
||||
do { \
|
||||
rtw_debug_priv_ ##name.rtwdev = rtwdev; \
|
||||
@ -814,6 +874,8 @@ void rtw_debugfs_init(struct rtw_dev *rtwdev)
|
||||
rtw_debugfs_add_rw(dump_cam);
|
||||
rtw_debugfs_add_rw(rsvd_page);
|
||||
rtw_debugfs_add_r(phy_info);
|
||||
rtw_debugfs_add_r(coex_info);
|
||||
rtw_debugfs_add_rw(coex_enable);
|
||||
rtw_debugfs_add_r(mac_0);
|
||||
rtw_debugfs_add_r(mac_1);
|
||||
rtw_debugfs_add_r(mac_2);
|
||||
|
@ -515,6 +515,18 @@ struct rtw_hw_reg {
|
||||
u32 mask;
|
||||
};
|
||||
|
||||
struct rtw_reg_domain {
|
||||
u32 addr;
|
||||
u32 mask;
|
||||
#define RTW_REG_DOMAIN_MAC32 0
|
||||
#define RTW_REG_DOMAIN_MAC16 1
|
||||
#define RTW_REG_DOMAIN_MAC8 2
|
||||
#define RTW_REG_DOMAIN_RF_A 3
|
||||
#define RTW_REG_DOMAIN_RF_B 4
|
||||
#define RTW_REG_DOMAIN_NL 0xFF
|
||||
u8 domain;
|
||||
};
|
||||
|
||||
struct rtw_backup_info {
|
||||
u8 len;
|
||||
u32 reg;
|
||||
@ -562,6 +574,9 @@ struct rtw_tx_pkt_info {
|
||||
bool short_gi;
|
||||
bool report;
|
||||
bool rts;
|
||||
bool dis_qselseq;
|
||||
bool en_hwseq;
|
||||
u8 hw_ssn_sel;
|
||||
};
|
||||
|
||||
struct rtw_rx_pkt_stat {
|
||||
@ -1107,6 +1122,7 @@ struct rtw_chip_info {
|
||||
u8 bt_afh_span_bw40;
|
||||
u8 afh_5g_num;
|
||||
u8 wl_rf_para_num;
|
||||
u8 coex_info_hw_regs_num;
|
||||
const u8 *bt_rssi_step;
|
||||
const u8 *wl_rssi_step;
|
||||
const struct coex_table_para *table_nsant;
|
||||
@ -1116,6 +1132,7 @@ struct rtw_chip_info {
|
||||
const struct coex_rf_para *wl_rf_para_tx;
|
||||
const struct coex_rf_para *wl_rf_para_rx;
|
||||
const struct coex_5g_afh_map *afh_5g;
|
||||
const struct rtw_reg_domain *coex_info_hw_regs;
|
||||
};
|
||||
|
||||
enum rtw_coex_bt_state_cnt {
|
||||
@ -1162,6 +1179,7 @@ struct rtw_coex_rfe {
|
||||
struct rtw_coex_dm {
|
||||
bool cur_ps_tdma_on;
|
||||
bool cur_wl_rx_low_gain_en;
|
||||
bool ignore_wl_act;
|
||||
|
||||
u8 reason;
|
||||
u8 bt_rssi_state[4];
|
||||
@ -1242,6 +1260,9 @@ struct rtw_coex_stat {
|
||||
|
||||
u32 bt_supported_version;
|
||||
u32 bt_supported_feature;
|
||||
u32 patch_ver;
|
||||
u16 bt_reg_vendor_ae;
|
||||
u16 bt_reg_vendor_ac;
|
||||
s8 bt_rssi;
|
||||
u8 kt_ver;
|
||||
u8 gnt_workaround_state;
|
||||
|
@ -2371,6 +2371,33 @@ static const struct rtw_pwr_track_tbl rtw8822b_rtw_pwr_track_tbl = {
|
||||
.pwrtrk_2g_ccka_p = rtw8822b_pwrtrk_2g_cck_a_p,
|
||||
};
|
||||
|
||||
static const struct rtw_reg_domain coex_info_hw_regs_8822b[] = {
|
||||
{0xcb0, MASKDWORD, RTW_REG_DOMAIN_MAC32},
|
||||
{0xcb4, MASKDWORD, RTW_REG_DOMAIN_MAC32},
|
||||
{0xcba, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
|
||||
{0xcbd, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
|
||||
{0xc58, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
|
||||
{0xcbd, BIT(0), RTW_REG_DOMAIN_MAC8},
|
||||
{0, 0, RTW_REG_DOMAIN_NL},
|
||||
{0x430, MASKDWORD, RTW_REG_DOMAIN_MAC32},
|
||||
{0x434, MASKDWORD, RTW_REG_DOMAIN_MAC32},
|
||||
{0x42a, MASKLWORD, RTW_REG_DOMAIN_MAC16},
|
||||
{0x426, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
|
||||
{0x45e, BIT(3), RTW_REG_DOMAIN_MAC8},
|
||||
{0x454, MASKLWORD, RTW_REG_DOMAIN_MAC16},
|
||||
{0, 0, RTW_REG_DOMAIN_NL},
|
||||
{0x4c, BIT(24) | BIT(23), RTW_REG_DOMAIN_MAC32},
|
||||
{0x64, BIT(0), RTW_REG_DOMAIN_MAC8},
|
||||
{0x4c6, BIT(4), RTW_REG_DOMAIN_MAC8},
|
||||
{0x40, BIT(5), RTW_REG_DOMAIN_MAC8},
|
||||
{0x1, RFREG_MASK, RTW_REG_DOMAIN_RF_B},
|
||||
{0, 0, RTW_REG_DOMAIN_NL},
|
||||
{0x550, MASKDWORD, RTW_REG_DOMAIN_MAC32},
|
||||
{0x522, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
|
||||
{0x953, BIT(1), RTW_REG_DOMAIN_MAC8},
|
||||
{0xc50, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
|
||||
};
|
||||
|
||||
struct rtw_chip_info rtw8822b_hw_spec = {
|
||||
.ops = &rtw8822b_ops,
|
||||
.id = RTW_CHIP_TYPE_8822B,
|
||||
@ -2439,6 +2466,9 @@ struct rtw_chip_info rtw8822b_hw_spec = {
|
||||
.bt_afh_span_bw40 = 0x36,
|
||||
.afh_5g_num = ARRAY_SIZE(afh_5g_8822b),
|
||||
.afh_5g = afh_5g_8822b,
|
||||
|
||||
.coex_info_hw_regs_num = ARRAY_SIZE(coex_info_hw_regs_8822b),
|
||||
.coex_info_hw_regs = coex_info_hw_regs_8822b,
|
||||
};
|
||||
EXPORT_SYMBOL(rtw8822b_hw_spec);
|
||||
|
||||
|
@ -4092,6 +4092,31 @@ static const struct wiphy_wowlan_support rtw_wowlan_stub_8822c = {
|
||||
};
|
||||
#endif
|
||||
|
||||
static const struct rtw_reg_domain coex_info_hw_regs_8822c[] = {
|
||||
{0x1860, BIT(3), RTW_REG_DOMAIN_MAC8},
|
||||
{0x4160, BIT(3), RTW_REG_DOMAIN_MAC8},
|
||||
{0x1c32, BIT(6), RTW_REG_DOMAIN_MAC8},
|
||||
{0x1c38, BIT(28), RTW_REG_DOMAIN_MAC32},
|
||||
{0, 0, RTW_REG_DOMAIN_NL},
|
||||
{0x430, MASKDWORD, RTW_REG_DOMAIN_MAC32},
|
||||
{0x434, MASKDWORD, RTW_REG_DOMAIN_MAC32},
|
||||
{0x42a, MASKLWORD, RTW_REG_DOMAIN_MAC16},
|
||||
{0x426, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
|
||||
{0x45e, BIT(3), RTW_REG_DOMAIN_MAC8},
|
||||
{0x454, MASKLWORD, RTW_REG_DOMAIN_MAC16},
|
||||
{0, 0, RTW_REG_DOMAIN_NL},
|
||||
{0x4c, BIT(24) | BIT(23), RTW_REG_DOMAIN_MAC32},
|
||||
{0x64, BIT(0), RTW_REG_DOMAIN_MAC8},
|
||||
{0x4c6, BIT(4), RTW_REG_DOMAIN_MAC8},
|
||||
{0x40, BIT(5), RTW_REG_DOMAIN_MAC8},
|
||||
{0x1, RFREG_MASK, RTW_REG_DOMAIN_RF_B},
|
||||
{0, 0, RTW_REG_DOMAIN_NL},
|
||||
{0x550, MASKDWORD, RTW_REG_DOMAIN_MAC32},
|
||||
{0x522, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
|
||||
{0x953, BIT(1), RTW_REG_DOMAIN_MAC8},
|
||||
{0xc50, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
|
||||
};
|
||||
|
||||
struct rtw_chip_info rtw8822c_hw_spec = {
|
||||
.ops = &rtw8822c_ops,
|
||||
.id = RTW_CHIP_TYPE_8822C,
|
||||
@ -4168,6 +4193,9 @@ struct rtw_chip_info rtw8822c_hw_spec = {
|
||||
.bt_afh_span_bw40 = 0x36,
|
||||
.afh_5g_num = ARRAY_SIZE(afh_5g_8822c),
|
||||
.afh_5g = afh_5g_8822c,
|
||||
|
||||
.coex_info_hw_regs_num = ARRAY_SIZE(coex_info_hw_regs_8822c),
|
||||
.coex_info_hw_regs = coex_info_hw_regs_8822c,
|
||||
};
|
||||
EXPORT_SYMBOL(rtw8822c_hw_spec);
|
||||
|
||||
|
@ -58,6 +58,9 @@ void rtw_tx_fill_tx_desc(struct rtw_tx_pkt_info *pkt_info, struct sk_buff *skb)
|
||||
SET_TX_DESC_SPE_RPT(txdesc, pkt_info->report);
|
||||
SET_TX_DESC_SW_DEFINE(txdesc, pkt_info->sn);
|
||||
SET_TX_DESC_USE_RTS(txdesc, pkt_info->rts);
|
||||
SET_TX_DESC_DISQSELSEQ(txdesc, pkt_info->dis_qselseq);
|
||||
SET_TX_DESC_EN_HWSEQ(txdesc, pkt_info->en_hwseq);
|
||||
SET_TX_DESC_HW_SSN_SEL(txdesc, pkt_info->hw_ssn_sel);
|
||||
}
|
||||
EXPORT_SYMBOL(rtw_tx_fill_tx_desc);
|
||||
|
||||
@ -227,6 +230,9 @@ static void rtw_tx_mgmt_pkt_info_update(struct rtw_dev *rtwdev,
|
||||
pkt_info->use_rate = true;
|
||||
pkt_info->rate_id = 6;
|
||||
pkt_info->dis_rate_fallback = true;
|
||||
pkt_info->dis_qselseq = true;
|
||||
pkt_info->en_hwseq = true;
|
||||
pkt_info->hw_ssn_sel = 0;
|
||||
}
|
||||
|
||||
static void rtw_tx_data_pkt_info_update(struct rtw_dev *rtwdev,
|
||||
|
@ -53,6 +53,12 @@
|
||||
le32p_replace_bits((__le32 *)(txdesc) + 0x02, value, BIT(19))
|
||||
#define SET_TX_DESC_SW_DEFINE(tx_desc, value) \
|
||||
le32p_replace_bits((__le32 *)(txdesc) + 0x06, value, GENMASK(11, 0))
|
||||
#define SET_TX_DESC_DISQSELSEQ(txdesc, value) \
|
||||
le32p_replace_bits((__le32 *)(txdesc) + 0x00, value, BIT(31))
|
||||
#define SET_TX_DESC_EN_HWSEQ(txdesc, value) \
|
||||
le32p_replace_bits((__le32 *)(txdesc) + 0x08, value, BIT(15))
|
||||
#define SET_TX_DESC_HW_SSN_SEL(txdesc, value) \
|
||||
le32p_replace_bits((__le32 *)(txdesc) + 0x03, value, GENMASK(7, 6))
|
||||
|
||||
enum rtw_tx_desc_queue_select {
|
||||
TX_DESC_QSEL_TID0 = 0,
|
||||
|
Loading…
Reference in New Issue
Block a user