iwlwifi patches for 4.14
* Fix a UBSAN warning; * Improvement in the net-stack/driver log syncing * An RCU lock fix in the new rate-scaling code; * Support for new PCI IDs for the 9000 family; * Support for a new API version; * Initial work for supporting the new ETSI rules; * Support for advanced dwell in scanning; * Support for OCE in scanning; * Some debugging improvements; * Other small improvements and cleanups here and there. -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEF3LNfgb2BPWm68smoUecoho8xfoFAlq7844ACgkQoUecoho8 xfrA4w/+Id8GUA7RpsH3rkdWYJbru9j4XzANGVgDqo1G52nuczAjWuT5Apdtb9Dc ULwYpo8O9H4xLc3plF7RQ/NuqH5gLB+XpKFUbo6pN6tKOYXo6lyvAVjE9N6fhaxT pbd2ZFyC7M6NAhyPIAC5n0MiLBQw57Y0Qiou/woowF/GGttP++XFLsCjU8h4bKui NTenIfs8ht0t0KFw56JEiyMeUS8HcLa6fcnkTFkIZbyho5MlMJP8Yxnc0E7mwwOf BWpwlRBCSJUghzW3MiWeSkU1+23IPbFFRdSRY3Suk0u1lFfWuIAKM0iqpg/BKeU9 EVrvFLQ+P8KjnfDV9zxTFL24oxw1YJ/Myss5nIAOFzKopco7FNdGbkW7HD2XVwVz vjs5j57496lkC/Cb55zXbNLjrp1gL+16RlOcpKNmcS5khmv0NrKBj5RRkZQ8XOXD TWBOcev89R58E6XnUijiEN96zZ7Ufdb56m3Xm/uvses/aoNFK5+QspMdPTeuI+VA Pw+APOiTSWHW29Ndn93MNLlJoo02v/o/qWbPUkTN9iASyHowYuKqiC18o3vx8I/6 DFh86k1wNchgxlo8MbHrM2ginr/+LtQke+FsjczCRIRUH8ySFHthZtItr2Bl/kky JQwC/R7AQT8iZWphA8aEQnXOaOuxwMve0QpKxHwAI4FUFHReUU0= =8m6c -----END PGP SIGNATURE----- Merge tag 'iwlwifi-next-for-kalle-2018-03-28' of git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-next iwlwifi patches for 4.14 * Fix a UBSAN warning; * Improvement in the net-stack/driver log syncing * An RCU lock fix in the new rate-scaling code; * Support for new PCI IDs for the 9000 family; * Support for a new API version; * Initial work for supporting the new ETSI rules; * Support for advanced dwell in scanning; * Support for OCE in scanning; * Some debugging improvements; * Other small improvements and cleanups here and there.
This commit is contained in:
commit
63f5be0a81
|
@ -6,6 +6,7 @@
|
|||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2015-2017 Intel Deutschland GmbH
|
||||
* Copyright (C) 2018 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
|
||||
|
@ -19,6 +20,7 @@
|
|||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2015-2017 Intel Deutschland GmbH
|
||||
* Copyright (C) 2018 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -55,7 +57,7 @@
|
|||
#include "iwl-agn-hw.h"
|
||||
|
||||
/* Highest firmware API version supported */
|
||||
#define IWL_22000_UCODE_API_MAX 36
|
||||
#define IWL_22000_UCODE_API_MAX 38
|
||||
|
||||
/* Lowest firmware API version supported */
|
||||
#define IWL_22000_UCODE_API_MIN 24
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2015-2017 Intel Deutschland GmbH
|
||||
* Copyright (C) 2018 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
|
||||
|
@ -19,6 +20,7 @@
|
|||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2015-2017 Intel Deutschland GmbH
|
||||
* Copyright (C) 2018 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -56,7 +58,7 @@
|
|||
#include "fw/file.h"
|
||||
|
||||
/* Highest firmware API version supported */
|
||||
#define IWL9000_UCODE_API_MAX 36
|
||||
#define IWL9000_UCODE_API_MAX 38
|
||||
|
||||
/* Lowest firmware API version supported */
|
||||
#define IWL9000_UCODE_API_MIN 30
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
* 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 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
|
||||
|
@ -30,6 +31,7 @@
|
|||
* 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 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -310,6 +312,17 @@ struct iwl_mcc_update_resp_v1 {
|
|||
__le32 channels[0];
|
||||
} __packed; /* LAR_UPDATE_MCC_CMD_RESP_S_VER_1 */
|
||||
|
||||
/**
|
||||
* enum iwl_geo_information - geographic information.
|
||||
* @GEO_NO_INFO: no special info for this geo profile.
|
||||
* @GEO_WMM_ETSI_5GHZ_INFO: this geo profile limits the WMM params
|
||||
* for the 5 GHz band.
|
||||
*/
|
||||
enum iwl_geo_information {
|
||||
GEO_NO_INFO = 0,
|
||||
GEO_WMM_ETSI_5GHZ_INFO = BIT(0),
|
||||
};
|
||||
|
||||
/**
|
||||
* struct iwl_mcc_update_resp - response to MCC_UPDATE_CMD.
|
||||
* Contains the new channel control profile map, if changed, and the new MCC
|
||||
|
@ -320,7 +333,8 @@ struct iwl_mcc_update_resp_v1 {
|
|||
* @cap: capabilities for all channels which matches the MCC
|
||||
* @source_id: the MCC source, see iwl_mcc_source
|
||||
* @time: time elapsed from the MCC test start (in 30 seconds TU)
|
||||
* @reserved: reserved.
|
||||
* @geo_info: geographic specific profile information
|
||||
* see &enum iwl_geo_information.
|
||||
* @n_channels: number of channels in @channels_data (may be 14, 39, 50 or 51
|
||||
* channels, depending on platform)
|
||||
* @channels: channel control data map, DWORD for each channel. Only the first
|
||||
|
@ -332,10 +346,10 @@ struct iwl_mcc_update_resp {
|
|||
u8 cap;
|
||||
u8 source_id;
|
||||
__le16 time;
|
||||
__le16 reserved;
|
||||
__le16 geo_info;
|
||||
__le32 n_channels;
|
||||
__le32 channels[0];
|
||||
} __packed; /* LAR_UPDATE_MCC_CMD_RESP_S_VER_2 */
|
||||
} __packed; /* LAR_UPDATE_MCC_CMD_RESP_S_VER_3 */
|
||||
|
||||
/**
|
||||
* struct iwl_mcc_chub_notif - chub notifies of mcc change
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
* 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 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -579,8 +580,23 @@ enum iwl_umac_scan_general_flags {
|
|||
IWL_UMAC_SCAN_GEN_FLAGS_RRM_ENABLED = BIT(8),
|
||||
IWL_UMAC_SCAN_GEN_FLAGS_MATCH = BIT(9),
|
||||
IWL_UMAC_SCAN_GEN_FLAGS_EXTENDED_DWELL = BIT(10),
|
||||
/* Extended dwell is obselete when adaptive dwell is used, making this
|
||||
* bit reusable. Hence, probe request defer is used only when adaptive
|
||||
* dwell is supported. */
|
||||
IWL_UMAC_SCAN_GEN_FLAGS_PROB_REQ_DEFER_SUPP = BIT(10),
|
||||
IWL_UMAC_SCAN_GEN_FLAGS_LMAC2_FRAGMENTED = BIT(11),
|
||||
IWL_UMAC_SCAN_GEN_FLAGS_ADAPTIVE_DWELL = BIT(13),
|
||||
IWL_UMAC_SCAN_GEN_FLAGS_MAX_CHNL_TIME = BIT(14),
|
||||
IWL_UMAC_SCAN_GEN_FLAGS_PROB_REQ_HIGH_TX_RATE = BIT(15),
|
||||
};
|
||||
|
||||
/**
|
||||
* enum iwl_umac_scan_general_flags2 - UMAC scan general flags #2
|
||||
* @IWL_UMAC_SCAN_GEN_FLAGS2_NOTIF_PER_CHNL: Whether to send a complete
|
||||
* notification per channel or not.
|
||||
*/
|
||||
enum iwl_umac_scan_general_flags2 {
|
||||
IWL_UMAC_SCAN_GEN_FLAGS2_NOTIF_PER_CHNL = BIT(0),
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -628,6 +644,18 @@ struct iwl_scan_req_umac_tail {
|
|||
struct iwl_ssid_ie direct_scan[PROBE_OPTION_MAX];
|
||||
} __packed;
|
||||
|
||||
/**
|
||||
* struct iwl_scan_umac_chan_param
|
||||
* @flags: channel flags &enum iwl_scan_channel_flags
|
||||
* @count: num of channels in scan request
|
||||
* @reserved: for future use and alignment
|
||||
*/
|
||||
struct iwl_scan_umac_chan_param {
|
||||
u8 flags;
|
||||
u8 count;
|
||||
__le16 reserved;
|
||||
} __packed; /*SCAN_CHANNEL_PARAMS_API_S_VER_1 */
|
||||
|
||||
/**
|
||||
* struct iwl_scan_req_umac
|
||||
* @flags: &enum iwl_umac_scan_flags
|
||||
|
@ -636,23 +664,24 @@ struct iwl_scan_req_umac_tail {
|
|||
* @general_flags: &enum iwl_umac_scan_general_flags
|
||||
* @scan_start_mac_id: report the scan start TSF time according to this mac TSF
|
||||
* @extended_dwell: dwell time for channels 1, 6 and 11
|
||||
* @active_dwell: dwell time for active scan
|
||||
* @passive_dwell: dwell time for passive scan
|
||||
* @active_dwell: dwell time for active scan per LMAC
|
||||
* @passive_dwell: dwell time for passive scan per LMAC
|
||||
* @fragmented_dwell: dwell time for fragmented passive scan
|
||||
* @adwell_default_n_aps: for adaptive dwell the default number of APs
|
||||
* per channel
|
||||
* @adwell_default_n_aps_social: for adaptive dwell the default
|
||||
* number of APs per social (1,6,11) channel
|
||||
* @general_flags2: &enum iwl_umac_scan_general_flags2
|
||||
* @adwell_max_budget: for adaptive dwell the maximal budget of TU to be added
|
||||
* to total scan time
|
||||
* @max_out_time: max out of serving channel time, per LMAC - for CDB there
|
||||
* are 2 LMACs
|
||||
* @suspend_time: max suspend time, per LMAC - for CDB there are 2 LMACs
|
||||
* @scan_priority: scan internal prioritization &enum iwl_scan_priority
|
||||
* @channel_flags: &enum iwl_scan_channel_flags
|
||||
* @n_channels: num of channels in scan request
|
||||
* @num_of_fragments: Number of fragments needed for full coverage per band.
|
||||
* Relevant only for fragmented scan.
|
||||
* @channel: &struct iwl_scan_umac_chan_param
|
||||
* @reserved: for future use and alignment
|
||||
* @reserved2: for future use and alignment
|
||||
* @reserved3: for future use and alignment
|
||||
* @data: &struct iwl_scan_channel_cfg_umac and
|
||||
* &struct iwl_scan_req_umac_tail
|
||||
|
@ -673,10 +702,7 @@ struct iwl_scan_req_umac {
|
|||
__le32 max_out_time;
|
||||
__le32 suspend_time;
|
||||
__le32 scan_priority;
|
||||
/* SCAN_CHANNEL_PARAMS_API_S_VER_1 */
|
||||
u8 channel_flags;
|
||||
u8 n_channels;
|
||||
__le16 reserved2;
|
||||
struct iwl_scan_umac_chan_param channel;
|
||||
u8 data[];
|
||||
} v1; /* SCAN_REQUEST_CMD_UMAC_API_S_VER_1 */
|
||||
struct {
|
||||
|
@ -687,10 +713,7 @@ struct iwl_scan_req_umac {
|
|||
__le32 max_out_time[SCAN_TWO_LMACS];
|
||||
__le32 suspend_time[SCAN_TWO_LMACS];
|
||||
__le32 scan_priority;
|
||||
/* SCAN_CHANNEL_PARAMS_API_S_VER_1 */
|
||||
u8 channel_flags;
|
||||
u8 n_channels;
|
||||
__le16 reserved2;
|
||||
struct iwl_scan_umac_chan_param channel;
|
||||
u8 data[];
|
||||
} v6; /* SCAN_REQUEST_CMD_UMAC_API_S_VER_6 */
|
||||
struct {
|
||||
|
@ -704,16 +727,30 @@ struct iwl_scan_req_umac {
|
|||
__le32 max_out_time[SCAN_TWO_LMACS];
|
||||
__le32 suspend_time[SCAN_TWO_LMACS];
|
||||
__le32 scan_priority;
|
||||
/* SCAN_CHANNEL_PARAMS_API_S_VER_1 */
|
||||
u8 channel_flags;
|
||||
u8 n_channels;
|
||||
__le16 reserved2;
|
||||
struct iwl_scan_umac_chan_param channel;
|
||||
u8 data[];
|
||||
} v7; /* SCAN_REQUEST_CMD_UMAC_API_S_VER_7 */
|
||||
struct {
|
||||
u8 active_dwell[SCAN_TWO_LMACS];
|
||||
u8 reserved2;
|
||||
u8 adwell_default_n_aps;
|
||||
u8 adwell_default_n_aps_social;
|
||||
u8 general_flags2;
|
||||
__le16 adwell_max_budget;
|
||||
__le32 max_out_time[SCAN_TWO_LMACS];
|
||||
__le32 suspend_time[SCAN_TWO_LMACS];
|
||||
__le32 scan_priority;
|
||||
u8 passive_dwell[SCAN_TWO_LMACS];
|
||||
u8 num_of_fragments[SCAN_TWO_LMACS];
|
||||
struct iwl_scan_umac_chan_param channel;
|
||||
u8 data[];
|
||||
} v8; /* SCAN_REQUEST_CMD_UMAC_API_S_VER_8 */
|
||||
};
|
||||
} __packed;
|
||||
|
||||
#define IWL_SCAN_REQ_UMAC_SIZE_V7 sizeof(struct iwl_scan_req_umac)
|
||||
#define IWL_SCAN_REQ_UMAC_SIZE_V8 sizeof(struct iwl_scan_req_umac)
|
||||
#define IWL_SCAN_REQ_UMAC_SIZE_V7 (sizeof(struct iwl_scan_req_umac) - \
|
||||
4 * sizeof(u8))
|
||||
#define IWL_SCAN_REQ_UMAC_SIZE_V6 (sizeof(struct iwl_scan_req_umac) - \
|
||||
2 * sizeof(u8) - sizeof(__le16))
|
||||
#define IWL_SCAN_REQ_UMAC_SIZE_V1 (sizeof(struct iwl_scan_req_umac) - \
|
||||
|
|
|
@ -68,6 +68,7 @@
|
|||
#include "iwl-drv.h"
|
||||
#include "runtime.h"
|
||||
#include "dbg.h"
|
||||
#include "debugfs.h"
|
||||
#include "iwl-io.h"
|
||||
#include "iwl-prph.h"
|
||||
#include "iwl-csr.h"
|
||||
|
@ -1007,6 +1008,12 @@ int iwl_fw_dbg_collect(struct iwl_fw_runtime *fwrt,
|
|||
{
|
||||
struct iwl_fw_dump_desc *desc;
|
||||
|
||||
if (trigger && trigger->flags & IWL_FW_DBG_FORCE_RESTART) {
|
||||
IWL_WARN(fwrt, "Force restart: trigger %d fired.\n", trig);
|
||||
iwl_force_nmi(fwrt->trans);
|
||||
return 0;
|
||||
}
|
||||
|
||||
desc = kzalloc(sizeof(*desc) + len, GFP_ATOMIC);
|
||||
if (!desc)
|
||||
return -ENOMEM;
|
||||
|
@ -1080,6 +1087,9 @@ int iwl_fw_start_dbg_conf(struct iwl_fw_runtime *fwrt, u8 conf_id)
|
|||
IWL_WARN(fwrt, "FW already configured (%d) - re-configuring\n",
|
||||
fwrt->dump.conf);
|
||||
|
||||
/* start default config marker cmd for syncing logs */
|
||||
iwl_fw_trigger_timestamp(fwrt, 1);
|
||||
|
||||
/* Send all HCMDs for configuring the FW debug */
|
||||
ptr = (void *)&fwrt->fw->dbg_conf_tlv[conf_id]->hcmd;
|
||||
for (i = 0; i < fwrt->fw->dbg_conf_tlv[conf_id]->num_of_hcmds; i++) {
|
||||
|
|
|
@ -157,6 +157,20 @@ static void iwl_fw_timestamp_marker_wk(struct work_struct *work)
|
|||
ret, jiffies_to_msecs(delay) / 1000);
|
||||
}
|
||||
|
||||
void iwl_fw_trigger_timestamp(struct iwl_fw_runtime *fwrt, u32 delay)
|
||||
{
|
||||
IWL_INFO(fwrt,
|
||||
"starting timestamp_marker trigger with delay: %us\n",
|
||||
delay);
|
||||
|
||||
iwl_fw_cancel_timestamp(fwrt);
|
||||
|
||||
fwrt->timestamp.delay = msecs_to_jiffies(delay * 1000);
|
||||
|
||||
schedule_delayed_work(&fwrt->timestamp.wk,
|
||||
round_jiffies_relative(fwrt->timestamp.delay));
|
||||
}
|
||||
|
||||
static ssize_t iwl_dbgfs_timestamp_marker_write(struct iwl_fw_runtime *fwrt,
|
||||
char *buf, size_t count,
|
||||
loff_t *ppos)
|
||||
|
@ -168,16 +182,8 @@ static ssize_t iwl_dbgfs_timestamp_marker_write(struct iwl_fw_runtime *fwrt,
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
IWL_INFO(fwrt,
|
||||
"starting timestamp_marker trigger with delay: %us\n",
|
||||
delay);
|
||||
iwl_fw_trigger_timestamp(fwrt, delay);
|
||||
|
||||
iwl_fw_cancel_timestamp(fwrt);
|
||||
|
||||
fwrt->timestamp.delay = msecs_to_jiffies(delay * 1000);
|
||||
|
||||
schedule_delayed_work(&fwrt->timestamp.wk,
|
||||
round_jiffies_relative(fwrt->timestamp.delay));
|
||||
return count;
|
||||
}
|
||||
|
||||
|
|
|
@ -89,6 +89,8 @@ static inline void iwl_fw_resume_timestamp(struct iwl_fw_runtime *fwrt)
|
|||
round_jiffies_relative(fwrt->timestamp.delay));
|
||||
}
|
||||
|
||||
void iwl_fw_trigger_timestamp(struct iwl_fw_runtime *fwrt, u32 delay);
|
||||
|
||||
#else
|
||||
static inline int iwl_fwrt_dbgfs_register(struct iwl_fw_runtime *fwrt,
|
||||
struct dentry *dbgfs_dir)
|
||||
|
@ -102,4 +104,7 @@ static inline void iwl_fw_suspend_timestamp(struct iwl_fw_runtime *fwrt) {}
|
|||
|
||||
static inline void iwl_fw_resume_timestamp(struct iwl_fw_runtime *fwrt) {}
|
||||
|
||||
static inline void iwl_fw_trigger_timestamp(struct iwl_fw_runtime *fwrt,
|
||||
u32 delay) {}
|
||||
|
||||
#endif /* CONFIG_IWLWIFI_DEBUGFS */
|
||||
|
|
|
@ -250,6 +250,8 @@ typedef unsigned int __bitwise iwl_ucode_tlv_api_t;
|
|||
* indicating low latency direction.
|
||||
* @IWL_UCODE_TLV_API_DEPRECATE_TTAK: RX status flag TTAK ok (bit 7) is
|
||||
* deprecated.
|
||||
* @IWL_UCODE_TLV_API_ADAPTIVE_DWELL_V2: This ucode supports version 8
|
||||
* of scan request: SCAN_REQUEST_CMD_UMAC_API_S_VER_8
|
||||
*
|
||||
* @NUM_IWL_UCODE_TLV_API: number of bits used
|
||||
*/
|
||||
|
@ -265,10 +267,12 @@ enum iwl_ucode_tlv_api {
|
|||
IWL_UCODE_TLV_API_NAN2_VER2 = (__force iwl_ucode_tlv_api_t)31,
|
||||
/* API Set 1 */
|
||||
IWL_UCODE_TLV_API_ADAPTIVE_DWELL = (__force iwl_ucode_tlv_api_t)32,
|
||||
IWL_UCODE_TLV_API_OCE = (__force iwl_ucode_tlv_api_t)33,
|
||||
IWL_UCODE_TLV_API_NEW_BEACON_TEMPLATE = (__force iwl_ucode_tlv_api_t)34,
|
||||
IWL_UCODE_TLV_API_NEW_RX_STATS = (__force iwl_ucode_tlv_api_t)35,
|
||||
IWL_UCODE_TLV_API_QUOTA_LOW_LATENCY = (__force iwl_ucode_tlv_api_t)38,
|
||||
IWL_UCODE_TLV_API_DEPRECATE_TTAK = (__force iwl_ucode_tlv_api_t)41,
|
||||
IWL_UCODE_TLV_API_ADAPTIVE_DWELL_V2 = (__force iwl_ucode_tlv_api_t)42,
|
||||
|
||||
NUM_IWL_UCODE_TLV_API
|
||||
#ifdef __CHECKER__
|
||||
|
@ -616,6 +620,14 @@ enum iwl_fw_dbg_trigger_mode {
|
|||
IWL_FW_DBG_TRIGGER_MONITOR_ONLY = BIT(2),
|
||||
};
|
||||
|
||||
/**
|
||||
* enum iwl_fw_dbg_trigger_flags - the flags supported by wrt triggers
|
||||
* @IWL_FW_DBG_FORCE_RESTART: force a firmware restart
|
||||
*/
|
||||
enum iwl_fw_dbg_trigger_flags {
|
||||
IWL_FW_DBG_FORCE_RESTART = BIT(0),
|
||||
};
|
||||
|
||||
/**
|
||||
* enum iwl_fw_dbg_trigger_vif_type - define the VIF type for a trigger
|
||||
* @IWL_FW_DBG_CONF_VIF_ANY: any vif type
|
||||
|
@ -652,6 +664,7 @@ enum iwl_fw_dbg_trigger_vif_type {
|
|||
* @occurrences: number of occurrences. 0 means the trigger will never fire.
|
||||
* @trig_dis_ms: the time, in milliseconds, after an occurrence of this
|
||||
* trigger in which another occurrence should be ignored.
|
||||
* @flags: &enum iwl_fw_dbg_trigger_flags
|
||||
*/
|
||||
struct iwl_fw_dbg_trigger_tlv {
|
||||
__le32 id;
|
||||
|
@ -662,7 +675,8 @@ struct iwl_fw_dbg_trigger_tlv {
|
|||
u8 start_conf_id;
|
||||
__le16 occurrences;
|
||||
__le16 trig_dis_ms;
|
||||
__le16 reserved[3];
|
||||
u8 flags;
|
||||
u8 reserved[5];
|
||||
|
||||
u8 data[0];
|
||||
} __packed;
|
||||
|
|
|
@ -110,6 +110,8 @@
|
|||
#define IWL_MVM_SW_TX_CSUM_OFFLOAD 0
|
||||
#define IWL_MVM_HW_CSUM_DISABLE 0
|
||||
#define IWL_MVM_PARSE_NVM 0
|
||||
#define IWL_MVM_ADWELL_ENABLE 1
|
||||
#define IWL_MVM_ADWELL_MAX_BUDGET 0
|
||||
#define IWL_MVM_RS_NUM_TRY_BEFORE_ANT_TOGGLE 1
|
||||
#define IWL_MVM_RS_HT_VHT_RETRIES_PER_RATE 2
|
||||
#define IWL_MVM_RS_HT_VHT_RETRIES_PER_RATE_TW 1
|
||||
|
|
|
@ -1276,7 +1276,6 @@ static ssize_t iwl_dbgfs_low_latency_write(struct ieee80211_vif *vif, char *buf,
|
|||
{
|
||||
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
|
||||
struct iwl_mvm *mvm = mvmvif->mvm;
|
||||
bool prev;
|
||||
u8 value;
|
||||
int ret;
|
||||
|
||||
|
@ -1287,9 +1286,7 @@ static ssize_t iwl_dbgfs_low_latency_write(struct ieee80211_vif *vif, char *buf,
|
|||
return -EINVAL;
|
||||
|
||||
mutex_lock(&mvm->mutex);
|
||||
prev = iwl_mvm_vif_low_latency(mvmvif);
|
||||
mvmvif->low_latency_dbgfs = value;
|
||||
iwl_mvm_update_low_latency(mvm, vif, prev);
|
||||
iwl_mvm_update_low_latency(mvm, vif, value, LOW_LATENCY_DEBUGFS);
|
||||
mutex_unlock(&mvm->mutex);
|
||||
|
||||
return count;
|
||||
|
@ -1306,9 +1303,9 @@ static ssize_t iwl_dbgfs_low_latency_read(struct file *file,
|
|||
|
||||
len = scnprintf(buf, sizeof(buf) - 1,
|
||||
"traffic=%d\ndbgfs=%d\nvcmd=%d\n",
|
||||
mvmvif->low_latency_traffic,
|
||||
mvmvif->low_latency_dbgfs,
|
||||
mvmvif->low_latency_vcmd);
|
||||
!!(mvmvif->low_latency & LOW_LATENCY_TRAFFIC),
|
||||
!!(mvmvif->low_latency & LOW_LATENCY_DEBUGFS),
|
||||
!!(mvmvif->low_latency & LOW_LATENCY_VCMD));
|
||||
return simple_read_from_buffer(user_buf, count, ppos, buf, len);
|
||||
}
|
||||
|
||||
|
|
|
@ -421,6 +421,7 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
|
|||
ieee80211_hw_set(hw, SUPPORTS_CLONED_SKBS);
|
||||
ieee80211_hw_set(hw, SUPPORTS_AMSDU_IN_AMPDU);
|
||||
ieee80211_hw_set(hw, NEEDS_UNIQUE_STA_ADDR);
|
||||
ieee80211_hw_set(hw, DEAUTH_NEED_MGD_TX_PREP);
|
||||
|
||||
if (iwl_mvm_has_tlc_offload(mvm)) {
|
||||
ieee80211_hw_set(hw, TX_AMPDU_SETUP_IN_HW);
|
||||
|
@ -661,6 +662,17 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
|
|||
NL80211_EXT_FEATURE_SET_SCAN_DWELL);
|
||||
}
|
||||
|
||||
if (iwl_mvm_is_oce_supported(mvm)) {
|
||||
wiphy_ext_feature_set(hw->wiphy,
|
||||
NL80211_EXT_FEATURE_ACCEPT_BCAST_PROBE_RESP);
|
||||
wiphy_ext_feature_set(hw->wiphy,
|
||||
NL80211_EXT_FEATURE_FILS_MAX_CHANNEL_TIME);
|
||||
wiphy_ext_feature_set(hw->wiphy,
|
||||
NL80211_EXT_FEATURE_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION);
|
||||
wiphy_ext_feature_set(hw->wiphy,
|
||||
NL80211_EXT_FEATURE_OCE_PROBE_REQ_HIGH_TX_RATE);
|
||||
}
|
||||
|
||||
mvm->rts_threshold = IEEE80211_MAX_RTS_THRESHOLD;
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
|
@ -2804,9 +2816,6 @@ static void iwl_mvm_mac_mgd_prepare_tx(struct ieee80211_hw *hw,
|
|||
u32 duration = IWL_MVM_TE_SESSION_PROTECTION_MAX_TIME_MS;
|
||||
u32 min_duration = IWL_MVM_TE_SESSION_PROTECTION_MIN_TIME_MS;
|
||||
|
||||
if (WARN_ON_ONCE(vif->bss_conf.assoc))
|
||||
return;
|
||||
|
||||
/*
|
||||
* iwl_mvm_protect_session() reads directly from the device
|
||||
* (the system time), so make sure it is available.
|
||||
|
|
|
@ -299,6 +299,18 @@ enum iwl_bt_force_ant_mode {
|
|||
BT_FORCE_ANT_MAX,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct iwl_mvm_low_latency_cause - low latency set causes
|
||||
* @LOW_LATENCY_TRAFFIC: indicates low latency traffic was detected
|
||||
* @LOW_LATENCY_DEBUGFS: low latency mode set from debugfs
|
||||
* @LOW_LATENCY_VCMD: low latency mode set from vendor command
|
||||
*/
|
||||
enum iwl_mvm_low_latency_cause {
|
||||
LOW_LATENCY_TRAFFIC = BIT(0),
|
||||
LOW_LATENCY_DEBUGFS = BIT(1),
|
||||
LOW_LATENCY_VCMD = BIT(2),
|
||||
};
|
||||
|
||||
/**
|
||||
* struct iwl_mvm_vif_bf_data - beacon filtering related data
|
||||
* @bf_enabled: indicates if beacon filtering is enabled
|
||||
|
@ -335,9 +347,8 @@ struct iwl_mvm_vif_bf_data {
|
|||
* @pm_enabled - Indicate if MAC power management is allowed
|
||||
* @monitor_active: indicates that monitor context is configured, and that the
|
||||
* interface should get quota etc.
|
||||
* @low_latency_traffic: indicates low latency traffic was detected
|
||||
* @low_latency_dbgfs: low latency mode set from debugfs
|
||||
* @low_latency_vcmd: low latency mode set from vendor command
|
||||
* @low_latency: indicates low latency is set, see
|
||||
* enum &iwl_mvm_low_latency_cause for causes.
|
||||
* @ps_disabled: indicates that this interface requires PS to be disabled
|
||||
* @queue_params: QoS params for this MAC
|
||||
* @bcast_sta: station used for broadcast packets. Used by the following
|
||||
|
@ -367,7 +378,7 @@ struct iwl_mvm_vif {
|
|||
bool ap_ibss_active;
|
||||
bool pm_enabled;
|
||||
bool monitor_active;
|
||||
bool low_latency_traffic, low_latency_dbgfs, low_latency_vcmd;
|
||||
u8 low_latency;
|
||||
bool ps_disabled;
|
||||
struct iwl_mvm_vif_bf_data bf_data;
|
||||
|
||||
|
@ -1155,6 +1166,18 @@ static inline bool iwl_mvm_is_adaptive_dwell_supported(struct iwl_mvm *mvm)
|
|||
IWL_UCODE_TLV_API_ADAPTIVE_DWELL);
|
||||
}
|
||||
|
||||
static inline bool iwl_mvm_is_adaptive_dwell_v2_supported(struct iwl_mvm *mvm)
|
||||
{
|
||||
return fw_has_api(&mvm->fw->ucode_capa,
|
||||
IWL_UCODE_TLV_API_ADAPTIVE_DWELL_V2);
|
||||
}
|
||||
|
||||
static inline bool iwl_mvm_is_oce_supported(struct iwl_mvm *mvm)
|
||||
{
|
||||
/* OCE should never be enabled for LMAC scan FWs */
|
||||
return fw_has_api(&mvm->fw->ucode_capa, IWL_UCODE_TLV_API_OCE);
|
||||
}
|
||||
|
||||
static inline bool iwl_mvm_enter_d0i3_on_suspend(struct iwl_mvm *mvm)
|
||||
{
|
||||
/* For now we only use this mode to differentiate between
|
||||
|
@ -1744,7 +1767,8 @@ bool iwl_mvm_rx_diversity_allowed(struct iwl_mvm *mvm);
|
|||
|
||||
/* Low latency */
|
||||
int iwl_mvm_update_low_latency(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||
bool value);
|
||||
bool low_latency,
|
||||
enum iwl_mvm_low_latency_cause cause);
|
||||
/* get SystemLowLatencyMode - only needed for beacon threshold? */
|
||||
bool iwl_mvm_low_latency(struct iwl_mvm *mvm);
|
||||
/* get VMACLowLatencyMode */
|
||||
|
@ -1760,9 +1784,17 @@ static inline bool iwl_mvm_vif_low_latency(struct iwl_mvm_vif *mvmvif)
|
|||
* binding, so this has no real impact. For now, just return
|
||||
* the current desired low-latency state.
|
||||
*/
|
||||
return mvmvif->low_latency_dbgfs ||
|
||||
mvmvif->low_latency_traffic ||
|
||||
mvmvif->low_latency_vcmd;
|
||||
return mvmvif->low_latency;
|
||||
}
|
||||
|
||||
static inline
|
||||
void iwl_mvm_vif_set_low_latency(struct iwl_mvm_vif *mvmvif, bool set,
|
||||
enum iwl_mvm_low_latency_cause cause)
|
||||
{
|
||||
if (set)
|
||||
mvmvif->low_latency |= cause;
|
||||
else
|
||||
mvmvif->low_latency &= ~cause;
|
||||
}
|
||||
|
||||
/* hw scheduler queue config */
|
||||
|
|
|
@ -234,13 +234,15 @@ void iwl_mvm_tlc_update_notif(struct iwl_mvm *mvm, struct iwl_rx_packet *pkt)
|
|||
struct iwl_mvm_sta *mvmsta;
|
||||
struct iwl_lq_sta_rs_fw *lq_sta;
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
notif = (void *)pkt->data;
|
||||
mvmsta = iwl_mvm_sta_from_staid_rcu(mvm, notif->sta_id);
|
||||
|
||||
if (!mvmsta) {
|
||||
IWL_ERR(mvm, "Invalid sta id (%d) in FW TLC notification\n",
|
||||
notif->sta_id);
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
|
||||
lq_sta = &mvmsta->lq_sta.rs_fw;
|
||||
|
@ -251,6 +253,8 @@ void iwl_mvm_tlc_update_notif(struct iwl_mvm *mvm, struct iwl_rx_packet *pkt)
|
|||
IWL_DEBUG_RATE(mvm, "new rate_n_flags: 0x%X\n",
|
||||
lq_sta->last_rate_n_flags);
|
||||
}
|
||||
out:
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
void rs_fw_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
||||
|
|
|
@ -831,6 +831,16 @@ static void iwl_mvm_agg_rx_received(struct iwl_mvm *mvm,
|
|||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
static void iwl_mvm_flip_address(u8 *addr)
|
||||
{
|
||||
int i;
|
||||
u8 mac_addr[ETH_ALEN];
|
||||
|
||||
for (i = 0; i < ETH_ALEN; i++)
|
||||
mac_addr[i] = addr[ETH_ALEN - i - 1];
|
||||
ether_addr_copy(addr, mac_addr);
|
||||
}
|
||||
|
||||
void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi,
|
||||
struct iwl_rx_cmd_buffer *rxb, int queue)
|
||||
{
|
||||
|
@ -985,21 +995,16 @@ void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi,
|
|||
*/
|
||||
if ((desc->mac_flags2 & IWL_RX_MPDU_MFLG2_AMSDU) &&
|
||||
!WARN_ON(!ieee80211_is_data_qos(hdr->frame_control))) {
|
||||
int i;
|
||||
u8 *qc = ieee80211_get_qos_ctl(hdr);
|
||||
u8 mac_addr[ETH_ALEN];
|
||||
|
||||
*qc &= ~IEEE80211_QOS_CTL_A_MSDU_PRESENT;
|
||||
|
||||
for (i = 0; i < ETH_ALEN; i++)
|
||||
mac_addr[i] = hdr->addr3[ETH_ALEN - i - 1];
|
||||
ether_addr_copy(hdr->addr3, mac_addr);
|
||||
if (mvm->trans->cfg->device_family ==
|
||||
IWL_DEVICE_FAMILY_9000) {
|
||||
iwl_mvm_flip_address(hdr->addr3);
|
||||
|
||||
if (ieee80211_has_a4(hdr->frame_control)) {
|
||||
for (i = 0; i < ETH_ALEN; i++)
|
||||
mac_addr[i] =
|
||||
hdr->addr4[ETH_ALEN - i - 1];
|
||||
ether_addr_copy(hdr->addr4, mac_addr);
|
||||
if (ieee80211_has_a4(hdr->frame_control))
|
||||
iwl_mvm_flip_address(hdr->addr4);
|
||||
}
|
||||
}
|
||||
if (baid != IWL_RX_REORDER_DATA_INVALID_BAID) {
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
* 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 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -85,6 +86,17 @@ enum iwl_mvm_traffic_load {
|
|||
#define IWL_SCAN_DWELL_PASSIVE 110
|
||||
#define IWL_SCAN_DWELL_FRAGMENTED 44
|
||||
#define IWL_SCAN_DWELL_EXTENDED 90
|
||||
#define IWL_SCAN_NUM_OF_FRAGS 3
|
||||
|
||||
|
||||
/* adaptive dwell max budget time [TU] for full scan */
|
||||
#define IWL_SCAN_ADWELL_MAX_BUDGET_FULL_SCAN 300
|
||||
/* adaptive dwell max budget time [TU] for directed scan */
|
||||
#define IWL_SCAN_ADWELL_MAX_BUDGET_DIRECTED_SCAN 100
|
||||
/* adaptive dwell default APs number */
|
||||
#define IWL_SCAN_ADWELL_DEFAULT_N_APS 2
|
||||
/* adaptive dwell default APs number in social channels (1, 6, 11) */
|
||||
#define IWL_SCAN_ADWELL_DEFAULT_N_APS_SOCIAL 10
|
||||
|
||||
struct iwl_mvm_scan_timing_params {
|
||||
u32 suspend_time;
|
||||
|
@ -134,6 +146,9 @@ static inline void *iwl_mvm_get_scan_req_umac_data(struct iwl_mvm *mvm)
|
|||
{
|
||||
struct iwl_scan_req_umac *cmd = mvm->scan_cmd;
|
||||
|
||||
if (iwl_mvm_is_adaptive_dwell_v2_supported(mvm))
|
||||
return (void *)&cmd->v8.data;
|
||||
|
||||
if (iwl_mvm_is_adaptive_dwell_supported(mvm))
|
||||
return (void *)&cmd->v7.data;
|
||||
|
||||
|
@ -143,6 +158,23 @@ static inline void *iwl_mvm_get_scan_req_umac_data(struct iwl_mvm *mvm)
|
|||
return (void *)&cmd->v1.data;
|
||||
}
|
||||
|
||||
static inline struct iwl_scan_umac_chan_param *
|
||||
iwl_mvm_get_scan_req_umac_channel(struct iwl_mvm *mvm)
|
||||
{
|
||||
struct iwl_scan_req_umac *cmd = mvm->scan_cmd;
|
||||
|
||||
if (iwl_mvm_is_adaptive_dwell_v2_supported(mvm))
|
||||
return &cmd->v8.channel;
|
||||
|
||||
if (iwl_mvm_is_adaptive_dwell_supported(mvm))
|
||||
return &cmd->v7.channel;
|
||||
|
||||
if (iwl_mvm_has_new_tx_api(mvm))
|
||||
return &cmd->v6.channel;
|
||||
|
||||
return &cmd->v1.channel;
|
||||
}
|
||||
|
||||
static u8 iwl_mvm_scan_rx_ant(struct iwl_mvm *mvm)
|
||||
{
|
||||
if (mvm->scan_rx_ant != ANT_NONE)
|
||||
|
@ -1113,66 +1145,92 @@ static void iwl_mvm_scan_umac_dwell(struct iwl_mvm *mvm,
|
|||
struct iwl_scan_req_umac *cmd,
|
||||
struct iwl_mvm_scan_params *params)
|
||||
{
|
||||
struct iwl_mvm_scan_timing_params *timing = &scan_timing[params->type];
|
||||
struct iwl_mvm_scan_timing_params *timing, *hb_timing;
|
||||
u8 active_dwell, passive_dwell;
|
||||
|
||||
if (iwl_mvm_is_regular_scan(params))
|
||||
cmd->ooc_priority = cpu_to_le32(IWL_SCAN_PRIORITY_EXT_6);
|
||||
else
|
||||
cmd->ooc_priority = cpu_to_le32(IWL_SCAN_PRIORITY_EXT_2);
|
||||
timing = &scan_timing[params->type];
|
||||
active_dwell = params->measurement_dwell ?
|
||||
params->measurement_dwell : IWL_SCAN_DWELL_ACTIVE;
|
||||
passive_dwell = params->measurement_dwell ?
|
||||
params->measurement_dwell : IWL_SCAN_DWELL_PASSIVE;
|
||||
|
||||
if (iwl_mvm_is_adaptive_dwell_supported(mvm)) {
|
||||
if (params->measurement_dwell) {
|
||||
cmd->v7.active_dwell = params->measurement_dwell;
|
||||
cmd->v7.passive_dwell = params->measurement_dwell;
|
||||
} else {
|
||||
cmd->v7.active_dwell = IWL_SCAN_DWELL_ACTIVE;
|
||||
cmd->v7.passive_dwell = IWL_SCAN_DWELL_PASSIVE;
|
||||
}
|
||||
cmd->v7.fragmented_dwell = IWL_SCAN_DWELL_FRAGMENTED;
|
||||
cmd->v7.adwell_default_n_aps_social =
|
||||
IWL_SCAN_ADWELL_DEFAULT_N_APS_SOCIAL;
|
||||
cmd->v7.adwell_default_n_aps =
|
||||
IWL_SCAN_ADWELL_DEFAULT_N_APS;
|
||||
|
||||
/* if custom max budget was configured with debugfs */
|
||||
if (IWL_MVM_ADWELL_MAX_BUDGET)
|
||||
cmd->v7.adwell_max_budget =
|
||||
cpu_to_le16(IWL_MVM_ADWELL_MAX_BUDGET);
|
||||
else if (params->ssids && params->ssids[0].ssid_len)
|
||||
cmd->v7.adwell_max_budget =
|
||||
cpu_to_le16(IWL_SCAN_ADWELL_MAX_BUDGET_DIRECTED_SCAN);
|
||||
else
|
||||
cmd->v7.adwell_max_budget =
|
||||
cpu_to_le16(IWL_SCAN_ADWELL_MAX_BUDGET_FULL_SCAN);
|
||||
|
||||
cmd->v7.scan_priority = cpu_to_le32(IWL_SCAN_PRIORITY_EXT_6);
|
||||
cmd->v7.max_out_time[SCAN_LB_LMAC_IDX] =
|
||||
cpu_to_le32(timing->max_out_time);
|
||||
cmd->v7.suspend_time[SCAN_LB_LMAC_IDX] =
|
||||
cpu_to_le32(timing->suspend_time);
|
||||
|
||||
if (iwl_mvm_is_cdb_supported(mvm)) {
|
||||
hb_timing = &scan_timing[params->type];
|
||||
|
||||
cmd->v7.max_out_time[SCAN_HB_LMAC_IDX] =
|
||||
cpu_to_le32(timing->max_out_time);
|
||||
cpu_to_le32(hb_timing->max_out_time);
|
||||
cmd->v7.suspend_time[SCAN_HB_LMAC_IDX] =
|
||||
cpu_to_le32(timing->suspend_time);
|
||||
cpu_to_le32(hb_timing->suspend_time);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (params->measurement_dwell) {
|
||||
cmd->v1.active_dwell = params->measurement_dwell;
|
||||
cmd->v1.passive_dwell = params->measurement_dwell;
|
||||
cmd->v1.extended_dwell = params->measurement_dwell;
|
||||
if (!iwl_mvm_is_adaptive_dwell_v2_supported(mvm)) {
|
||||
cmd->v7.active_dwell = active_dwell;
|
||||
cmd->v7.passive_dwell = passive_dwell;
|
||||
cmd->v7.fragmented_dwell = IWL_SCAN_DWELL_FRAGMENTED;
|
||||
} else {
|
||||
cmd->v8.active_dwell[SCAN_LB_LMAC_IDX] = active_dwell;
|
||||
cmd->v8.passive_dwell[SCAN_LB_LMAC_IDX] = passive_dwell;
|
||||
if (iwl_mvm_is_cdb_supported(mvm)) {
|
||||
cmd->v8.active_dwell[SCAN_HB_LMAC_IDX] =
|
||||
active_dwell;
|
||||
cmd->v8.passive_dwell[SCAN_HB_LMAC_IDX] =
|
||||
passive_dwell;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
cmd->v1.active_dwell = IWL_SCAN_DWELL_ACTIVE;
|
||||
cmd->v1.passive_dwell = IWL_SCAN_DWELL_PASSIVE;
|
||||
cmd->v1.extended_dwell = IWL_SCAN_DWELL_EXTENDED;
|
||||
}
|
||||
cmd->v1.fragmented_dwell = IWL_SCAN_DWELL_FRAGMENTED;
|
||||
cmd->v1.extended_dwell = params->measurement_dwell ?
|
||||
params->measurement_dwell : IWL_SCAN_DWELL_EXTENDED;
|
||||
cmd->v1.active_dwell = active_dwell;
|
||||
cmd->v1.passive_dwell = passive_dwell;
|
||||
cmd->v1.fragmented_dwell = IWL_SCAN_DWELL_FRAGMENTED;
|
||||
|
||||
if (iwl_mvm_has_new_tx_api(mvm)) {
|
||||
cmd->v6.scan_priority = cpu_to_le32(IWL_SCAN_PRIORITY_EXT_6);
|
||||
cmd->v6.max_out_time[SCAN_LB_LMAC_IDX] =
|
||||
cpu_to_le32(timing->max_out_time);
|
||||
cmd->v6.suspend_time[SCAN_LB_LMAC_IDX] =
|
||||
cpu_to_le32(timing->suspend_time);
|
||||
if (iwl_mvm_is_cdb_supported(mvm)) {
|
||||
hb_timing = &scan_timing[params->type];
|
||||
|
||||
cmd->v6.max_out_time[SCAN_HB_LMAC_IDX] =
|
||||
cpu_to_le32(timing->max_out_time);
|
||||
cpu_to_le32(hb_timing->max_out_time);
|
||||
cmd->v6.suspend_time[SCAN_HB_LMAC_IDX] =
|
||||
cpu_to_le32(hb_timing->suspend_time);
|
||||
}
|
||||
|
||||
if (iwl_mvm_has_new_tx_api(mvm)) {
|
||||
cmd->v6.scan_priority =
|
||||
cpu_to_le32(IWL_SCAN_PRIORITY_EXT_6);
|
||||
cmd->v6.max_out_time[SCAN_LB_LMAC_IDX] =
|
||||
cpu_to_le32(timing->max_out_time);
|
||||
cmd->v6.suspend_time[SCAN_LB_LMAC_IDX] =
|
||||
cpu_to_le32(timing->suspend_time);
|
||||
} else {
|
||||
cmd->v1.scan_priority =
|
||||
cpu_to_le32(IWL_SCAN_PRIORITY_EXT_6);
|
||||
cmd->v1.max_out_time =
|
||||
cpu_to_le32(timing->max_out_time);
|
||||
cmd->v1.suspend_time =
|
||||
cpu_to_le32(timing->suspend_time);
|
||||
}
|
||||
} else {
|
||||
cmd->v1.max_out_time = cpu_to_le32(timing->max_out_time);
|
||||
cmd->v1.suspend_time = cpu_to_le32(timing->suspend_time);
|
||||
cmd->v1.scan_priority =
|
||||
cpu_to_le32(IWL_SCAN_PRIORITY_EXT_6);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1234,11 +1292,39 @@ static u16 iwl_mvm_scan_umac_flags(struct iwl_mvm *mvm,
|
|||
if (mvm->sched_scan_pass_all == SCHED_SCAN_PASS_ALL_ENABLED)
|
||||
flags |= IWL_UMAC_SCAN_GEN_FLAGS_ITER_COMPLETE;
|
||||
|
||||
if (iwl_mvm_is_adaptive_dwell_supported(mvm) && IWL_MVM_ADWELL_ENABLE &&
|
||||
vif->type != NL80211_IFTYPE_P2P_DEVICE)
|
||||
flags |= IWL_UMAC_SCAN_GEN_FLAGS_ADAPTIVE_DWELL;
|
||||
|
||||
/*
|
||||
* Extended dwell is relevant only for low band to start with, as it is
|
||||
* being used for social channles only (1, 6, 11), so we can check
|
||||
* only scan type on low band also for CDB.
|
||||
*/
|
||||
if (iwl_mvm_is_regular_scan(params) &&
|
||||
vif->type != NL80211_IFTYPE_P2P_DEVICE &&
|
||||
params->type != IWL_SCAN_TYPE_FRAGMENTED)
|
||||
params->type != IWL_SCAN_TYPE_FRAGMENTED &&
|
||||
!iwl_mvm_is_adaptive_dwell_supported(mvm) &&
|
||||
!iwl_mvm_is_oce_supported(mvm))
|
||||
flags |= IWL_UMAC_SCAN_GEN_FLAGS_EXTENDED_DWELL;
|
||||
|
||||
if (iwl_mvm_is_oce_supported(mvm)) {
|
||||
if ((params->flags &
|
||||
NL80211_SCAN_FLAG_OCE_PROBE_REQ_HIGH_TX_RATE))
|
||||
flags |= IWL_UMAC_SCAN_GEN_FLAGS_PROB_REQ_HIGH_TX_RATE;
|
||||
/* Since IWL_UMAC_SCAN_GEN_FLAGS_EXTENDED_DWELL and
|
||||
* NL80211_SCAN_FLAG_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION shares
|
||||
* the same bit, we need to make sure that we use this bit here
|
||||
* only when IWL_UMAC_SCAN_GEN_FLAGS_EXTENDED_DWELL cannot be
|
||||
* used. */
|
||||
if ((params->flags &
|
||||
NL80211_SCAN_FLAG_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION) &&
|
||||
!WARN_ON_ONCE(!iwl_mvm_is_adaptive_dwell_supported(mvm)))
|
||||
flags |= IWL_UMAC_SCAN_GEN_FLAGS_PROB_REQ_DEFER_SUPP;
|
||||
if ((params->flags & NL80211_SCAN_FLAG_FILS_MAX_CHANNEL_TIME))
|
||||
flags |= IWL_UMAC_SCAN_GEN_FLAGS_MAX_CHNL_TIME;
|
||||
}
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
|
@ -1247,6 +1333,7 @@ static int iwl_mvm_scan_umac(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
|||
int type)
|
||||
{
|
||||
struct iwl_scan_req_umac *cmd = mvm->scan_cmd;
|
||||
struct iwl_scan_umac_chan_param *chan_param;
|
||||
void *cmd_data = iwl_mvm_get_scan_req_umac_data(mvm);
|
||||
struct iwl_scan_req_umac_tail *sec_part = cmd_data +
|
||||
sizeof(struct iwl_scan_channel_cfg_umac) *
|
||||
|
@ -1254,8 +1341,11 @@ static int iwl_mvm_scan_umac(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
|||
int uid, i;
|
||||
u32 ssid_bitmap = 0;
|
||||
u8 channel_flags = 0;
|
||||
u16 gen_flags;
|
||||
struct iwl_mvm_vif *scan_vif = iwl_mvm_vif_from_mac80211(vif);
|
||||
|
||||
chan_param = iwl_mvm_get_scan_req_umac_channel(mvm);
|
||||
|
||||
lockdep_assert_held(&mvm->mutex);
|
||||
|
||||
if (WARN_ON(params->n_scan_plans > IWL_MAX_SCHED_SCAN_PLANS))
|
||||
|
@ -1272,8 +1362,17 @@ static int iwl_mvm_scan_umac(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
|||
mvm->scan_uid_status[uid] = type;
|
||||
|
||||
cmd->uid = cpu_to_le32(uid);
|
||||
cmd->general_flags = cpu_to_le16(iwl_mvm_scan_umac_flags(mvm, params,
|
||||
vif));
|
||||
gen_flags = iwl_mvm_scan_umac_flags(mvm, params, vif);
|
||||
cmd->general_flags = cpu_to_le16(gen_flags);
|
||||
if (iwl_mvm_is_adaptive_dwell_v2_supported(mvm)) {
|
||||
if (gen_flags & IWL_UMAC_SCAN_GEN_FLAGS_FRAGMENTED)
|
||||
cmd->v8.num_of_fragments[SCAN_LB_LMAC_IDX] =
|
||||
IWL_SCAN_NUM_OF_FRAGS;
|
||||
if (gen_flags & IWL_UMAC_SCAN_GEN_FLAGS_LMAC2_FRAGMENTED)
|
||||
cmd->v8.num_of_fragments[SCAN_HB_LMAC_IDX] =
|
||||
IWL_SCAN_NUM_OF_FRAGS;
|
||||
}
|
||||
|
||||
cmd->scan_start_mac_id = scan_vif->id;
|
||||
|
||||
if (type == IWL_MVM_SCAN_SCHED || type == IWL_MVM_SCAN_NETDETECT)
|
||||
|
@ -1284,16 +1383,8 @@ static int iwl_mvm_scan_umac(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
|||
IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE |
|
||||
IWL_SCAN_CHANNEL_FLAG_CACHE_ADD;
|
||||
|
||||
if (iwl_mvm_is_adaptive_dwell_supported(mvm)) {
|
||||
cmd->v7.channel_flags = channel_flags;
|
||||
cmd->v7.n_channels = params->n_channels;
|
||||
} else if (iwl_mvm_has_new_tx_api(mvm)) {
|
||||
cmd->v6.channel_flags = channel_flags;
|
||||
cmd->v6.n_channels = params->n_channels;
|
||||
} else {
|
||||
cmd->v1.channel_flags = channel_flags;
|
||||
cmd->v1.n_channels = params->n_channels;
|
||||
}
|
||||
chan_param->flags = channel_flags;
|
||||
chan_param->count = params->n_channels;
|
||||
|
||||
iwl_scan_build_ssids(params, sec_part->direct_scan, &ssid_bitmap);
|
||||
|
||||
|
@ -1732,7 +1823,9 @@ int iwl_mvm_scan_size(struct iwl_mvm *mvm)
|
|||
{
|
||||
int base_size = IWL_SCAN_REQ_UMAC_SIZE_V1;
|
||||
|
||||
if (iwl_mvm_is_adaptive_dwell_supported(mvm))
|
||||
if (iwl_mvm_is_adaptive_dwell_v2_supported(mvm))
|
||||
base_size = IWL_SCAN_REQ_UMAC_SIZE_V8;
|
||||
else if (iwl_mvm_is_adaptive_dwell_supported(mvm))
|
||||
base_size = IWL_SCAN_REQ_UMAC_SIZE_V7;
|
||||
else if (iwl_mvm_has_new_tx_api(mvm))
|
||||
base_size = IWL_SCAN_REQ_UMAC_SIZE_V6;
|
||||
|
|
|
@ -687,6 +687,74 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mvm *mvm, struct sk_buff *skb)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_INET
|
||||
|
||||
static int
|
||||
iwl_mvm_tx_tso_segment(struct sk_buff *skb, unsigned int num_subframes,
|
||||
netdev_features_t netdev_flags,
|
||||
struct sk_buff_head *mpdus_skb)
|
||||
{
|
||||
struct sk_buff *tmp, *next;
|
||||
struct ieee80211_hdr *hdr = (void *)skb->data;
|
||||
char cb[sizeof(skb->cb)];
|
||||
u16 i = 0;
|
||||
unsigned int tcp_payload_len;
|
||||
unsigned int mss = skb_shinfo(skb)->gso_size;
|
||||
bool ipv4 = (skb->protocol == htons(ETH_P_IP));
|
||||
u16 ip_base_id = ipv4 ? ntohs(ip_hdr(skb)->id) : 0;
|
||||
|
||||
skb_shinfo(skb)->gso_size = num_subframes * mss;
|
||||
memcpy(cb, skb->cb, sizeof(cb));
|
||||
|
||||
next = skb_gso_segment(skb, netdev_flags);
|
||||
skb_shinfo(skb)->gso_size = mss;
|
||||
if (WARN_ON_ONCE(IS_ERR(next)))
|
||||
return -EINVAL;
|
||||
else if (next)
|
||||
consume_skb(skb);
|
||||
|
||||
while (next) {
|
||||
tmp = next;
|
||||
next = tmp->next;
|
||||
|
||||
memcpy(tmp->cb, cb, sizeof(tmp->cb));
|
||||
/*
|
||||
* Compute the length of all the data added for the A-MSDU.
|
||||
* This will be used to compute the length to write in the TX
|
||||
* command. We have: SNAP + IP + TCP for n -1 subframes and
|
||||
* ETH header for n subframes.
|
||||
*/
|
||||
tcp_payload_len = skb_tail_pointer(tmp) -
|
||||
skb_transport_header(tmp) -
|
||||
tcp_hdrlen(tmp) + tmp->data_len;
|
||||
|
||||
if (ipv4)
|
||||
ip_hdr(tmp)->id = htons(ip_base_id + i * num_subframes);
|
||||
|
||||
if (tcp_payload_len > mss) {
|
||||
skb_shinfo(tmp)->gso_size = mss;
|
||||
} else {
|
||||
if (ieee80211_is_data_qos(hdr->frame_control)) {
|
||||
u8 *qc;
|
||||
|
||||
if (ipv4)
|
||||
ip_send_check(ip_hdr(tmp));
|
||||
|
||||
qc = ieee80211_get_qos_ctl((void *)tmp->data);
|
||||
*qc &= ~IEEE80211_QOS_CTL_A_MSDU_PRESENT;
|
||||
}
|
||||
skb_shinfo(tmp)->gso_size = 0;
|
||||
}
|
||||
|
||||
tmp->prev = NULL;
|
||||
tmp->next = NULL;
|
||||
|
||||
__skb_queue_tail(mpdus_skb, tmp);
|
||||
i++;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int iwl_mvm_tx_tso(struct iwl_mvm *mvm, struct sk_buff *skb,
|
||||
struct ieee80211_tx_info *info,
|
||||
struct ieee80211_sta *sta,
|
||||
|
@ -695,14 +763,10 @@ static int iwl_mvm_tx_tso(struct iwl_mvm *mvm, struct sk_buff *skb,
|
|||
struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
|
||||
struct ieee80211_hdr *hdr = (void *)skb->data;
|
||||
unsigned int mss = skb_shinfo(skb)->gso_size;
|
||||
struct sk_buff *tmp, *next;
|
||||
char cb[sizeof(skb->cb)];
|
||||
unsigned int num_subframes, tcp_payload_len, subf_len, max_amsdu_len;
|
||||
bool ipv4 = (skb->protocol == htons(ETH_P_IP));
|
||||
u16 ip_base_id = ipv4 ? ntohs(ip_hdr(skb)->id) : 0;
|
||||
u16 snap_ip_tcp, pad, i = 0;
|
||||
u16 snap_ip_tcp, pad;
|
||||
unsigned int dbg_max_amsdu_len;
|
||||
netdev_features_t netdev_features = NETIF_F_CSUM_MASK | NETIF_F_SG;
|
||||
netdev_features_t netdev_flags = NETIF_F_CSUM_MASK | NETIF_F_SG;
|
||||
u8 *qc, tid, txf;
|
||||
|
||||
snap_ip_tcp = 8 + skb_transport_header(skb) - skb_network_header(skb) +
|
||||
|
@ -712,16 +776,8 @@ static int iwl_mvm_tx_tso(struct iwl_mvm *mvm, struct sk_buff *skb,
|
|||
|
||||
if (!sta->max_amsdu_len ||
|
||||
!ieee80211_is_data_qos(hdr->frame_control) ||
|
||||
(!mvmsta->tlc_amsdu && !dbg_max_amsdu_len)) {
|
||||
num_subframes = 1;
|
||||
pad = 0;
|
||||
goto segment;
|
||||
}
|
||||
|
||||
qc = ieee80211_get_qos_ctl(hdr);
|
||||
tid = *qc & IEEE80211_QOS_CTL_TID_MASK;
|
||||
if (WARN_ON_ONCE(tid >= IWL_MAX_TID_COUNT))
|
||||
return -EINVAL;
|
||||
(!mvmsta->tlc_amsdu && !dbg_max_amsdu_len))
|
||||
return iwl_mvm_tx_tso_segment(skb, 1, netdev_flags, mpdus_skb);
|
||||
|
||||
/*
|
||||
* Do not build AMSDU for IPv6 with extension headers.
|
||||
|
@ -730,22 +786,22 @@ static int iwl_mvm_tx_tso(struct iwl_mvm *mvm, struct sk_buff *skb,
|
|||
if (skb->protocol == htons(ETH_P_IPV6) &&
|
||||
((struct ipv6hdr *)skb_network_header(skb))->nexthdr !=
|
||||
IPPROTO_TCP) {
|
||||
num_subframes = 1;
|
||||
pad = 0;
|
||||
netdev_features &= ~NETIF_F_CSUM_MASK;
|
||||
goto segment;
|
||||
netdev_flags &= ~NETIF_F_CSUM_MASK;
|
||||
return iwl_mvm_tx_tso_segment(skb, 1, netdev_flags, mpdus_skb);
|
||||
}
|
||||
|
||||
qc = ieee80211_get_qos_ctl(hdr);
|
||||
tid = *qc & IEEE80211_QOS_CTL_TID_MASK;
|
||||
if (WARN_ON_ONCE(tid >= IWL_MAX_TID_COUNT))
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* No need to lock amsdu_in_ampdu_allowed since it can't be modified
|
||||
* during an BA session.
|
||||
*/
|
||||
if (info->flags & IEEE80211_TX_CTL_AMPDU &&
|
||||
!mvmsta->tid_data[tid].amsdu_in_ampdu_allowed) {
|
||||
num_subframes = 1;
|
||||
pad = 0;
|
||||
goto segment;
|
||||
}
|
||||
!mvmsta->tid_data[tid].amsdu_in_ampdu_allowed)
|
||||
return iwl_mvm_tx_tso_segment(skb, 1, netdev_flags, mpdus_skb);
|
||||
|
||||
max_amsdu_len = sta->max_amsdu_len;
|
||||
|
||||
|
@ -811,56 +867,8 @@ static int iwl_mvm_tx_tso(struct iwl_mvm *mvm, struct sk_buff *skb,
|
|||
* Trick the segmentation function to make it
|
||||
* create SKBs that can fit into one A-MSDU.
|
||||
*/
|
||||
segment:
|
||||
skb_shinfo(skb)->gso_size = num_subframes * mss;
|
||||
memcpy(cb, skb->cb, sizeof(cb));
|
||||
|
||||
next = skb_gso_segment(skb, netdev_features);
|
||||
skb_shinfo(skb)->gso_size = mss;
|
||||
if (WARN_ON_ONCE(IS_ERR(next)))
|
||||
return -EINVAL;
|
||||
else if (next)
|
||||
consume_skb(skb);
|
||||
|
||||
while (next) {
|
||||
tmp = next;
|
||||
next = tmp->next;
|
||||
|
||||
memcpy(tmp->cb, cb, sizeof(tmp->cb));
|
||||
/*
|
||||
* Compute the length of all the data added for the A-MSDU.
|
||||
* This will be used to compute the length to write in the TX
|
||||
* command. We have: SNAP + IP + TCP for n -1 subframes and
|
||||
* ETH header for n subframes.
|
||||
*/
|
||||
tcp_payload_len = skb_tail_pointer(tmp) -
|
||||
skb_transport_header(tmp) -
|
||||
tcp_hdrlen(tmp) + tmp->data_len;
|
||||
|
||||
if (ipv4)
|
||||
ip_hdr(tmp)->id = htons(ip_base_id + i * num_subframes);
|
||||
|
||||
if (tcp_payload_len > mss) {
|
||||
skb_shinfo(tmp)->gso_size = mss;
|
||||
} else {
|
||||
if (ieee80211_is_data_qos(hdr->frame_control)) {
|
||||
qc = ieee80211_get_qos_ctl((void *)tmp->data);
|
||||
|
||||
if (ipv4)
|
||||
ip_send_check(ip_hdr(tmp));
|
||||
*qc &= ~IEEE80211_QOS_CTL_A_MSDU_PRESENT;
|
||||
}
|
||||
skb_shinfo(tmp)->gso_size = 0;
|
||||
}
|
||||
|
||||
tmp->prev = NULL;
|
||||
tmp->next = NULL;
|
||||
|
||||
__skb_queue_tail(mpdus_skb, tmp);
|
||||
i++;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return iwl_mvm_tx_tso_segment(skb, num_subframes, netdev_flags,
|
||||
mpdus_skb);
|
||||
}
|
||||
#else /* CONFIG_INET */
|
||||
static int iwl_mvm_tx_tso(struct iwl_mvm *mvm, struct sk_buff *skb,
|
||||
|
|
|
@ -800,12 +800,19 @@ int iwl_mvm_disable_txq(struct iwl_mvm *mvm, int queue, int mac80211_queue,
|
|||
.scd_queue = queue,
|
||||
.action = SCD_CFG_DISABLE_QUEUE,
|
||||
};
|
||||
bool remove_mac_queue = true;
|
||||
bool remove_mac_queue = mac80211_queue != IEEE80211_INVAL_HW_QUEUE;
|
||||
int ret;
|
||||
|
||||
if (WARN_ON(remove_mac_queue && mac80211_queue >= IEEE80211_MAX_QUEUES))
|
||||
return -EINVAL;
|
||||
|
||||
if (iwl_mvm_has_new_tx_api(mvm)) {
|
||||
spin_lock_bh(&mvm->queue_info_lock);
|
||||
mvm->hw_queue_to_mac80211[queue] &= ~BIT(mac80211_queue);
|
||||
|
||||
if (remove_mac_queue)
|
||||
mvm->hw_queue_to_mac80211[queue] &=
|
||||
~BIT(mac80211_queue);
|
||||
|
||||
spin_unlock_bh(&mvm->queue_info_lock);
|
||||
|
||||
iwl_trans_txq_free(mvm->trans, queue);
|
||||
|
@ -1027,14 +1034,18 @@ bool iwl_mvm_rx_diversity_allowed(struct iwl_mvm *mvm)
|
|||
}
|
||||
|
||||
int iwl_mvm_update_low_latency(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||
bool prev)
|
||||
bool low_latency,
|
||||
enum iwl_mvm_low_latency_cause cause)
|
||||
{
|
||||
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
|
||||
int res;
|
||||
bool low_latency;
|
||||
bool prev;
|
||||
|
||||
lockdep_assert_held(&mvm->mutex);
|
||||
|
||||
prev = iwl_mvm_vif_low_latency(mvmvif);
|
||||
iwl_mvm_vif_set_low_latency(mvmvif, low_latency, cause);
|
||||
|
||||
low_latency = iwl_mvm_vif_low_latency(mvmvif);
|
||||
|
||||
if (low_latency == prev)
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
* Copyright(c) 2007 - 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
|
||||
*
|
||||
* 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
|
||||
|
@ -36,6 +37,7 @@
|
|||
* Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
|
||||
* All rights reserved.
|
||||
* Copyright(c) 2017 Intel Deutschland GmbH
|
||||
* Copyright(c) 2018 Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
|
@ -517,9 +519,9 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
|
|||
{IWL_PCI_DEVICE(0x24FD, 0x9074, iwl8265_2ac_cfg)},
|
||||
|
||||
/* 9000 Series */
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0000, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0010, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0014, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0018, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0030, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0034, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0038, iwl9560_2ac_cfg)},
|
||||
|
@ -544,11 +546,15 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
|
|||
{IWL_PCI_DEVICE(0x2526, 0x1410, iwl9270_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x1420, iwl9460_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x1610, iwl9270_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x2030, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x2034, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x4010, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x4030, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x4034, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x40A4, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0xA014, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x4234, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x42A4, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0xA014, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x271B, 0x0010, iwl9160_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x271B, 0x0014, iwl9160_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x271B, 0x0210, iwl9160_2ac_cfg)},
|
||||
|
@ -569,16 +575,42 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
|
|||
{IWL_PCI_DEVICE(0x2720, 0x0264, iwl9461_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x02A0, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x02A4, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x1010, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x1030, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x1210, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x2030, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x2034, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x4030, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x4034, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x40A4, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x4234, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x42A4, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x30DC, 0x0030, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x30DC, 0x0034, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x30DC, 0x0038, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x30DC, 0x003C, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x30DC, 0x0060, iwl9460_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x30DC, 0x0064, iwl9461_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x30DC, 0x00A0, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x30DC, 0x00A4, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x30DC, 0x0230, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x30DC, 0x0234, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x30DC, 0x0238, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x30DC, 0x023C, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x30DC, 0x0260, iwl9461_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x30DC, 0x0264, iwl9461_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x30DC, 0x02A0, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x30DC, 0x02A4, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x30DC, 0x1010, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x30DC, 0x1030, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x30DC, 0x1210, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x30DC, 0x2030, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x30DC, 0x2034, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x30DC, 0x4030, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x30DC, 0x4034, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x30DC, 0x40A4, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x30DC, 0x4234, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x30DC, 0x42A4, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x31DC, 0x0030, iwl9560_2ac_cfg_shared_clk)},
|
||||
{IWL_PCI_DEVICE(0x31DC, 0x0034, iwl9560_2ac_cfg_shared_clk)},
|
||||
{IWL_PCI_DEVICE(0x31DC, 0x0038, iwl9560_2ac_cfg_shared_clk)},
|
||||
|
@ -595,12 +627,94 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
|
|||
{IWL_PCI_DEVICE(0x31DC, 0x0264, iwl9461_2ac_cfg_shared_clk)},
|
||||
{IWL_PCI_DEVICE(0x31DC, 0x02A0, iwl9462_2ac_cfg_shared_clk)},
|
||||
{IWL_PCI_DEVICE(0x31DC, 0x02A4, iwl9462_2ac_cfg_shared_clk)},
|
||||
{IWL_PCI_DEVICE(0x31DC, 0x1010, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x31DC, 0x1030, iwl9560_2ac_cfg_shared_clk)},
|
||||
{IWL_PCI_DEVICE(0x31DC, 0x1210, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x31DC, 0x2030, iwl9560_2ac_cfg_shared_clk)},
|
||||
{IWL_PCI_DEVICE(0x31DC, 0x2034, iwl9560_2ac_cfg_shared_clk)},
|
||||
{IWL_PCI_DEVICE(0x31DC, 0x4030, iwl9560_2ac_cfg_shared_clk)},
|
||||
{IWL_PCI_DEVICE(0x31DC, 0x4034, iwl9560_2ac_cfg_shared_clk)},
|
||||
{IWL_PCI_DEVICE(0x31DC, 0x40A4, iwl9462_2ac_cfg_shared_clk)},
|
||||
{IWL_PCI_DEVICE(0x31DC, 0x4234, iwl9560_2ac_cfg_shared_clk)},
|
||||
{IWL_PCI_DEVICE(0x31DC, 0x42A4, iwl9462_2ac_cfg_shared_clk)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x0030, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x0034, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x0038, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x003C, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x0060, iwl9461_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x0064, iwl9461_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x00A0, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x00A4, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x0230, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x0234, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x0238, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x023C, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x0260, iwl9461_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x0264, iwl9461_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x02A0, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x02A4, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x1010, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x1030, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x1210, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x2030, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x2034, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x4030, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x4034, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x40A4, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x4234, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x42A4, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x0030, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x0034, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x0038, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x003C, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x0060, iwl9461_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x0064, iwl9461_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x00A0, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x00A4, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x0230, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x0234, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x0238, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x023C, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x0260, iwl9461_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x0264, iwl9461_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x02A0, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x02A4, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x1010, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x1030, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x1210, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x2030, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x2034, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x4030, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x4034, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x40A4, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x4234, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, 0x42A4, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x0030, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x0034, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x0038, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x003C, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x0060, iwl9461_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x0064, iwl9461_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x00A0, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x00A4, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x0230, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x0234, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x0238, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x023C, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x0260, iwl9461_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x0264, iwl9461_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x02A0, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x02A4, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x1010, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x1030, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x1210, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x2030, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x2034, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x4030, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x4034, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x40A4, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x4234, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x43F0, 0x42A4, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x0000, iwl9460_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x0010, iwl9460_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x0030, iwl9560_2ac_cfg_soc)},
|
||||
|
@ -626,11 +740,44 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
|
|||
{IWL_PCI_DEVICE(0x9DF0, 0x0610, iwl9460_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x0710, iwl9460_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x0A10, iwl9460_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x1010, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x1030, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x1210, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x2010, iwl9460_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x2030, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x2034, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x2A10, iwl9460_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x4030, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x4034, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x40A4, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x4234, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x42A4, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x0030, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x0034, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x0038, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x003C, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x0060, iwl9461_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x0064, iwl9461_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x00A0, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x00A4, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x0230, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x0234, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x0238, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x023C, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x0260, iwl9461_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x0264, iwl9461_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x02A0, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x02A4, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x1010, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x1030, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x1210, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x2030, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x2034, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x4030, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x4034, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x40A4, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x4234, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, 0x42A4, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA370, 0x0030, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA370, 0x0034, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA370, 0x0038, iwl9560_2ac_cfg_soc)},
|
||||
|
@ -647,10 +794,16 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
|
|||
{IWL_PCI_DEVICE(0xA370, 0x0264, iwl9461_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA370, 0x02A0, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA370, 0x02A4, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA370, 0x1010, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0xA370, 0x1030, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA370, 0x1210, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0xA370, 0x2030, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA370, 0x2034, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA370, 0x4030, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA370, 0x4034, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA370, 0x40A4, iwl9462_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA370, 0x4234, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA370, 0x42A4, iwl9462_2ac_cfg_soc)},
|
||||
|
||||
/* 22000 Series */
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0A10, iwl22000_2ac_cfg_hr_cdb)},
|
||||
|
|
Loading…
Reference in New Issue