iwlwifi: update driver from iwlwifi-next
Import code update from iwlwifi-next at e89600ebeeb14d18c0b062837a84196f72542830. This amongst other things removes the deprecated BCAST_FILTERING option, which we had disabled before due to firmware issues. Also prepares us for the next firmware update. The "enable_ini" module option has become an integer with a sysctl proc equivalent handler. Disable the module parameter changing for the moment until we'll have working LinuxKPI support or implement it as SYSCTL_PROC in FreeBSD directly. Sponsored by: The FreeBSD Foundation MFC after: 3 days
This commit is contained in:
parent
05d6f4d696
commit
fac1f59384
@ -1,7 +1,7 @@
|
||||
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
/*
|
||||
* Copyright (C) 2015-2017 Intel Deutschland GmbH
|
||||
* Copyright (C) 2018-2021 Intel Corporation
|
||||
* Copyright (C) 2018-2022 Intel Corporation
|
||||
*/
|
||||
#include <linux/module.h>
|
||||
#include <linux/stringify.h>
|
||||
@ -10,7 +10,7 @@
|
||||
#include "fw/api/txq.h"
|
||||
|
||||
/* Highest firmware API version supported */
|
||||
#define IWL_22000_UCODE_API_MAX 70
|
||||
#define IWL_22000_UCODE_API_MAX 72
|
||||
|
||||
/* Lowest firmware API version supported */
|
||||
#define IWL_22000_UCODE_API_MIN 39
|
||||
@ -391,6 +391,21 @@ const struct iwl_cfg_trans_params iwl_so_long_latency_trans_cfg = {
|
||||
.ltr_delay = IWL_CFG_TRANS_LTR_DELAY_2500US,
|
||||
};
|
||||
|
||||
const struct iwl_cfg_trans_params iwl_so_long_latency_imr_trans_cfg = {
|
||||
.mq_rx_supported = true,
|
||||
.use_tfh = true,
|
||||
.rf_id = true,
|
||||
.gen2 = true,
|
||||
.device_family = IWL_DEVICE_FAMILY_AX210,
|
||||
.base_params = &iwl_ax210_base_params,
|
||||
.umac_prph_offset = 0x300000,
|
||||
.integrated = true,
|
||||
.low_latency_xtal = true,
|
||||
.xtal_latency = 12000,
|
||||
.ltr_delay = IWL_CFG_TRANS_LTR_DELAY_2500US,
|
||||
.imr_enabled = true,
|
||||
};
|
||||
|
||||
/*
|
||||
* 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
|
||||
|
@ -1,9 +1,10 @@
|
||||
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
/*
|
||||
* Copyright (C) 2017 Intel Deutschland GmbH
|
||||
* Copyright (C) 2019-2021 Intel Corporation
|
||||
* Copyright (C) 2019-2022 Intel Corporation
|
||||
*/
|
||||
#include <linux/uuid.h>
|
||||
#include <linux/dmi.h>
|
||||
#include "iwl-drv.h"
|
||||
#include "iwl-debug.h"
|
||||
#include "acpi.h"
|
||||
@ -19,6 +20,30 @@ const guid_t iwl_rfi_guid = GUID_INIT(0x7266172C, 0x220B, 0x4B29,
|
||||
0xDD, 0x26, 0xB5, 0xFD);
|
||||
IWL_EXPORT_SYMBOL(iwl_rfi_guid);
|
||||
|
||||
static const struct dmi_system_id dmi_ppag_approved_list[] = {
|
||||
{ .ident = "HP",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "HP"),
|
||||
},
|
||||
},
|
||||
{ .ident = "SAMSUNG",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD"),
|
||||
},
|
||||
},
|
||||
{ .ident = "MSFT",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
|
||||
},
|
||||
},
|
||||
{ .ident = "ASUS",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTek COMPUTER INC."),
|
||||
},
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
static int iwl_acpi_get_handle(struct device *dev, acpi_string method,
|
||||
acpi_handle *ret_handle)
|
||||
{
|
||||
@ -537,8 +562,8 @@ IWL_EXPORT_SYMBOL(iwl_sar_select_profile);
|
||||
int iwl_sar_get_wrds_table(struct iwl_fw_runtime *fwrt)
|
||||
{
|
||||
union acpi_object *wifi_pkg, *table, *data;
|
||||
bool enabled;
|
||||
int ret, tbl_rev;
|
||||
u32 flags;
|
||||
u8 num_chains, num_sub_bands;
|
||||
|
||||
data = iwl_acpi_get_object(fwrt->dev, ACPI_WRDS_METHOD);
|
||||
@ -604,7 +629,8 @@ int iwl_sar_get_wrds_table(struct iwl_fw_runtime *fwrt)
|
||||
|
||||
IWL_DEBUG_RADIO(fwrt, "Reading WRDS tbl_rev=%d\n", tbl_rev);
|
||||
|
||||
enabled = !!(wifi_pkg->package.elements[1].integer.value);
|
||||
flags = wifi_pkg->package.elements[1].integer.value;
|
||||
fwrt->reduced_power_flags = flags >> IWL_REDUCE_POWER_FLAGS_POS;
|
||||
|
||||
/* position of the actual table */
|
||||
table = &wifi_pkg->package.elements[2];
|
||||
@ -612,7 +638,8 @@ int iwl_sar_get_wrds_table(struct iwl_fw_runtime *fwrt)
|
||||
/* The profile from WRDS is officially profile 1, but goes
|
||||
* into sar_profiles[0] (because we don't have a profile 0).
|
||||
*/
|
||||
ret = iwl_sar_set_profile(table, &fwrt->sar_profiles[0], enabled,
|
||||
ret = iwl_sar_set_profile(table, &fwrt->sar_profiles[0],
|
||||
flags & IWL_SAR_ENABLE_MSK,
|
||||
num_chains, num_sub_bands);
|
||||
out_free:
|
||||
kfree(data);
|
||||
@ -896,10 +923,11 @@ bool iwl_sar_geo_support(struct iwl_fw_runtime *fwrt)
|
||||
* only one using version 36, so skip this version entirely.
|
||||
*/
|
||||
return IWL_UCODE_SERIAL(fwrt->fw->ucode_ver) >= 38 ||
|
||||
IWL_UCODE_SERIAL(fwrt->fw->ucode_ver) == 17 ||
|
||||
(IWL_UCODE_SERIAL(fwrt->fw->ucode_ver) == 29 &&
|
||||
((fwrt->trans->hw_rev & CSR_HW_REV_TYPE_MSK) ==
|
||||
CSR_HW_REV_TYPE_7265D));
|
||||
(IWL_UCODE_SERIAL(fwrt->fw->ucode_ver) == 17 &&
|
||||
fwrt->trans->hw_rev != CSR_HW_REV_TYPE_3160) ||
|
||||
(IWL_UCODE_SERIAL(fwrt->fw->ucode_ver) == 29 &&
|
||||
((fwrt->trans->hw_rev & CSR_HW_REV_TYPE_MSK) ==
|
||||
CSR_HW_REV_TYPE_7265D));
|
||||
}
|
||||
IWL_EXPORT_SYMBOL(iwl_sar_geo_support);
|
||||
|
||||
@ -969,3 +997,181 @@ __le32 iwl_acpi_get_lari_config_bitmap(struct iwl_fw_runtime *fwrt)
|
||||
return config_bitmap;
|
||||
}
|
||||
IWL_EXPORT_SYMBOL(iwl_acpi_get_lari_config_bitmap);
|
||||
|
||||
int iwl_acpi_get_ppag_table(struct iwl_fw_runtime *fwrt)
|
||||
{
|
||||
union acpi_object *wifi_pkg, *data, *flags;
|
||||
int i, j, ret, tbl_rev, num_sub_bands = 0;
|
||||
int idx = 2;
|
||||
|
||||
fwrt->ppag_flags = 0;
|
||||
|
||||
data = iwl_acpi_get_object(fwrt->dev, ACPI_PPAG_METHOD);
|
||||
if (IS_ERR(data))
|
||||
return PTR_ERR(data);
|
||||
|
||||
/* try to read ppag table rev 2 or 1 (both have the same data size) */
|
||||
wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data,
|
||||
ACPI_PPAG_WIFI_DATA_SIZE_V2, &tbl_rev);
|
||||
|
||||
if (!IS_ERR(wifi_pkg)) {
|
||||
if (tbl_rev == 1 || tbl_rev == 2) {
|
||||
num_sub_bands = IWL_NUM_SUB_BANDS_V2;
|
||||
IWL_DEBUG_RADIO(fwrt,
|
||||
"Reading PPAG table v2 (tbl_rev=%d)\n",
|
||||
tbl_rev);
|
||||
goto read_table;
|
||||
} else {
|
||||
ret = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
}
|
||||
|
||||
/* try to read ppag table revision 0 */
|
||||
wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data,
|
||||
ACPI_PPAG_WIFI_DATA_SIZE_V1, &tbl_rev);
|
||||
|
||||
if (!IS_ERR(wifi_pkg)) {
|
||||
if (tbl_rev != 0) {
|
||||
ret = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
num_sub_bands = IWL_NUM_SUB_BANDS_V1;
|
||||
IWL_DEBUG_RADIO(fwrt, "Reading PPAG table v1 (tbl_rev=0)\n");
|
||||
goto read_table;
|
||||
}
|
||||
|
||||
read_table:
|
||||
fwrt->ppag_ver = tbl_rev;
|
||||
flags = &wifi_pkg->package.elements[1];
|
||||
|
||||
if (flags->type != ACPI_TYPE_INTEGER) {
|
||||
ret = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
fwrt->ppag_flags = flags->integer.value & ACPI_PPAG_MASK;
|
||||
|
||||
if (!fwrt->ppag_flags) {
|
||||
ret = 0;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
/*
|
||||
* read, verify gain values and save them into the PPAG table.
|
||||
* first sub-band (j=0) corresponds to Low-Band (2.4GHz), and the
|
||||
* following sub-bands to High-Band (5GHz).
|
||||
*/
|
||||
for (i = 0; i < IWL_NUM_CHAIN_LIMITS; i++) {
|
||||
for (j = 0; j < num_sub_bands; j++) {
|
||||
union acpi_object *ent;
|
||||
|
||||
ent = &wifi_pkg->package.elements[idx++];
|
||||
if (ent->type != ACPI_TYPE_INTEGER) {
|
||||
ret = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
fwrt->ppag_chains[i].subbands[j] = ent->integer.value;
|
||||
|
||||
if ((j == 0 &&
|
||||
(fwrt->ppag_chains[i].subbands[j] > ACPI_PPAG_MAX_LB ||
|
||||
fwrt->ppag_chains[i].subbands[j] < ACPI_PPAG_MIN_LB)) ||
|
||||
(j != 0 &&
|
||||
(fwrt->ppag_chains[i].subbands[j] > ACPI_PPAG_MAX_HB ||
|
||||
fwrt->ppag_chains[i].subbands[j] < ACPI_PPAG_MIN_HB))) {
|
||||
fwrt->ppag_flags = 0;
|
||||
ret = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
ret = 0;
|
||||
|
||||
out_free:
|
||||
kfree(data);
|
||||
return ret;
|
||||
}
|
||||
IWL_EXPORT_SYMBOL(iwl_acpi_get_ppag_table);
|
||||
|
||||
int iwl_read_ppag_table(struct iwl_fw_runtime *fwrt, union iwl_ppag_table_cmd *cmd,
|
||||
int *cmd_size)
|
||||
{
|
||||
u8 cmd_ver;
|
||||
int i, j, num_sub_bands;
|
||||
s8 *gain;
|
||||
|
||||
if (!fw_has_capa(&fwrt->fw->ucode_capa, IWL_UCODE_TLV_CAPA_SET_PPAG)) {
|
||||
IWL_DEBUG_RADIO(fwrt,
|
||||
"PPAG capability not supported by FW, command not sent.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (!fwrt->ppag_flags) {
|
||||
IWL_DEBUG_RADIO(fwrt, "PPAG not enabled, command not sent.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* The 'flags' field is the same in v1 and in v2 so we can just
|
||||
* use v1 to access it.
|
||||
*/
|
||||
cmd->v1.flags = cpu_to_le32(fwrt->ppag_flags);
|
||||
cmd_ver = iwl_fw_lookup_cmd_ver(fwrt->fw,
|
||||
WIDE_ID(PHY_OPS_GROUP, PER_PLATFORM_ANT_GAIN_CMD),
|
||||
IWL_FW_CMD_VER_UNKNOWN);
|
||||
if (cmd_ver == 1) {
|
||||
num_sub_bands = IWL_NUM_SUB_BANDS_V1;
|
||||
gain = cmd->v1.gain[0];
|
||||
*cmd_size = sizeof(cmd->v1);
|
||||
if (fwrt->ppag_ver == 1 || fwrt->ppag_ver == 2) {
|
||||
IWL_DEBUG_RADIO(fwrt,
|
||||
"PPAG table rev is %d but FW supports v1, sending truncated table\n",
|
||||
fwrt->ppag_ver);
|
||||
cmd->v1.flags &= cpu_to_le32(IWL_PPAG_ETSI_MASK);
|
||||
}
|
||||
} else if (cmd_ver == 2 || cmd_ver == 3) {
|
||||
num_sub_bands = IWL_NUM_SUB_BANDS_V2;
|
||||
gain = cmd->v2.gain[0];
|
||||
*cmd_size = sizeof(cmd->v2);
|
||||
if (fwrt->ppag_ver == 0) {
|
||||
IWL_DEBUG_RADIO(fwrt,
|
||||
"PPAG table is v1 but FW supports v2, sending padded table\n");
|
||||
} else if (cmd_ver == 2 && fwrt->ppag_ver == 2) {
|
||||
IWL_DEBUG_RADIO(fwrt,
|
||||
"PPAG table is v3 but FW supports v2, sending partial bitmap.\n");
|
||||
cmd->v1.flags &= cpu_to_le32(IWL_PPAG_ETSI_MASK);
|
||||
}
|
||||
} else {
|
||||
IWL_DEBUG_RADIO(fwrt, "Unsupported PPAG command version\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
for (i = 0; i < IWL_NUM_CHAIN_LIMITS; i++) {
|
||||
for (j = 0; j < num_sub_bands; j++) {
|
||||
gain[i * num_sub_bands + j] =
|
||||
fwrt->ppag_chains[i].subbands[j];
|
||||
IWL_DEBUG_RADIO(fwrt,
|
||||
"PPAG table: chain[%d] band[%d]: gain = %d\n",
|
||||
i, j, gain[i * num_sub_bands + j]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
IWL_EXPORT_SYMBOL(iwl_read_ppag_table);
|
||||
|
||||
bool iwl_acpi_is_ppag_approved(struct iwl_fw_runtime *fwrt)
|
||||
{
|
||||
|
||||
if (!dmi_check_system(dmi_ppag_approved_list)) {
|
||||
IWL_DEBUG_RADIO(fwrt,
|
||||
"System vendor '%s' is not in the approved list, disabling PPAG.\n",
|
||||
dmi_get_system_info(DMI_SYS_VENDOR));
|
||||
fwrt->ppag_flags = 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
IWL_EXPORT_SYMBOL(iwl_acpi_is_ppag_approved);
|
||||
|
@ -91,6 +91,11 @@
|
||||
#define ACPI_PPAG_MAX_LB 24
|
||||
#define ACPI_PPAG_MIN_HB -16
|
||||
#define ACPI_PPAG_MAX_HB 40
|
||||
#define ACPI_PPAG_MASK 3
|
||||
#define IWL_PPAG_ETSI_MASK BIT(0)
|
||||
|
||||
#define IWL_SAR_ENABLE_MSK BIT(0)
|
||||
#define IWL_REDUCE_POWER_FLAGS_POS 1
|
||||
|
||||
/*
|
||||
* The profile for revision 2 is a superset of revision 1, which is in
|
||||
@ -220,6 +225,13 @@ int iwl_acpi_get_tas(struct iwl_fw_runtime *fwrt,
|
||||
|
||||
__le32 iwl_acpi_get_lari_config_bitmap(struct iwl_fw_runtime *fwrt);
|
||||
|
||||
int iwl_acpi_get_ppag_table(struct iwl_fw_runtime *fwrt);
|
||||
|
||||
int iwl_read_ppag_table(struct iwl_fw_runtime *fwrt, union iwl_ppag_table_cmd *cmd,
|
||||
int *cmd_size);
|
||||
|
||||
bool iwl_acpi_is_ppag_approved(struct iwl_fw_runtime *fwrt);
|
||||
|
||||
#else /* CONFIG_ACPI */
|
||||
|
||||
static inline void *iwl_acpi_get_object(struct device *dev, acpi_string method)
|
||||
@ -307,6 +319,22 @@ static inline __le32 iwl_acpi_get_lari_config_bitmap(struct iwl_fw_runtime *fwrt
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int iwl_acpi_get_ppag_table(struct iwl_fw_runtime *fwrt)
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
static inline int iwl_read_ppag_table(struct iwl_fw_runtime *fwrt,
|
||||
union iwl_ppag_table_cmd *cmd, int *cmd_size)
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
static inline bool iwl_acpi_is_ppag_approved(struct iwl_fw_runtime *fwrt)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_ACPI */
|
||||
|
||||
static inline union acpi_object *
|
||||
|
@ -493,11 +493,6 @@ enum iwl_legacy_cmds {
|
||||
*/
|
||||
DEBUG_LOG_MSG = 0xf7,
|
||||
|
||||
/**
|
||||
* @BCAST_FILTER_CMD: &struct iwl_bcast_filter_cmd
|
||||
*/
|
||||
BCAST_FILTER_CMD = 0xcf,
|
||||
|
||||
/**
|
||||
* @MCAST_FILTER_CMD: &struct iwl_mcast_filter_cmd
|
||||
*/
|
||||
|
@ -36,92 +36,4 @@ struct iwl_mcast_filter_cmd {
|
||||
u8 addr_list[0];
|
||||
} __packed; /* MCAST_FILTERING_CMD_API_S_VER_1 */
|
||||
|
||||
#define MAX_BCAST_FILTERS 8
|
||||
#define MAX_BCAST_FILTER_ATTRS 2
|
||||
|
||||
/**
|
||||
* enum iwl_mvm_bcast_filter_attr_offset - written by fw for each Rx packet
|
||||
* @BCAST_FILTER_OFFSET_PAYLOAD_START: offset is from payload start.
|
||||
* @BCAST_FILTER_OFFSET_IP_END: offset is from ip header end (i.e.
|
||||
* start of ip payload).
|
||||
*/
|
||||
enum iwl_mvm_bcast_filter_attr_offset {
|
||||
BCAST_FILTER_OFFSET_PAYLOAD_START = 0,
|
||||
BCAST_FILTER_OFFSET_IP_END = 1,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct iwl_fw_bcast_filter_attr - broadcast filter attribute
|
||||
* @offset_type: &enum iwl_mvm_bcast_filter_attr_offset.
|
||||
* @offset: starting offset of this pattern.
|
||||
* @reserved1: reserved
|
||||
* @val: value to match - big endian (MSB is the first
|
||||
* byte to match from offset pos).
|
||||
* @mask: mask to match (big endian).
|
||||
*/
|
||||
struct iwl_fw_bcast_filter_attr {
|
||||
u8 offset_type;
|
||||
u8 offset;
|
||||
__le16 reserved1;
|
||||
__be32 val;
|
||||
__be32 mask;
|
||||
} __packed; /* BCAST_FILTER_ATT_S_VER_1 */
|
||||
|
||||
/**
|
||||
* enum iwl_mvm_bcast_filter_frame_type - filter frame type
|
||||
* @BCAST_FILTER_FRAME_TYPE_ALL: consider all frames.
|
||||
* @BCAST_FILTER_FRAME_TYPE_IPV4: consider only ipv4 frames
|
||||
*/
|
||||
enum iwl_mvm_bcast_filter_frame_type {
|
||||
BCAST_FILTER_FRAME_TYPE_ALL = 0,
|
||||
BCAST_FILTER_FRAME_TYPE_IPV4 = 1,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct iwl_fw_bcast_filter - broadcast filter
|
||||
* @discard: discard frame (1) or let it pass (0).
|
||||
* @frame_type: &enum iwl_mvm_bcast_filter_frame_type.
|
||||
* @reserved1: reserved
|
||||
* @num_attrs: number of valid attributes in this filter.
|
||||
* @attrs: attributes of this filter. a filter is considered matched
|
||||
* only when all its attributes are matched (i.e. AND relationship)
|
||||
*/
|
||||
struct iwl_fw_bcast_filter {
|
||||
u8 discard;
|
||||
u8 frame_type;
|
||||
u8 num_attrs;
|
||||
u8 reserved1;
|
||||
struct iwl_fw_bcast_filter_attr attrs[MAX_BCAST_FILTER_ATTRS];
|
||||
} __packed; /* BCAST_FILTER_S_VER_1 */
|
||||
|
||||
/**
|
||||
* struct iwl_fw_bcast_mac - per-mac broadcast filtering configuration.
|
||||
* @default_discard: default action for this mac (discard (1) / pass (0)).
|
||||
* @reserved1: reserved
|
||||
* @attached_filters: bitmap of relevant filters for this mac.
|
||||
*/
|
||||
struct iwl_fw_bcast_mac {
|
||||
u8 default_discard;
|
||||
u8 reserved1;
|
||||
__le16 attached_filters;
|
||||
} __packed; /* BCAST_MAC_CONTEXT_S_VER_1 */
|
||||
|
||||
/**
|
||||
* struct iwl_bcast_filter_cmd - broadcast filtering configuration
|
||||
* @disable: enable (0) / disable (1)
|
||||
* @max_bcast_filters: max number of filters (MAX_BCAST_FILTERS)
|
||||
* @max_macs: max number of macs (NUM_MAC_INDEX_DRIVER)
|
||||
* @reserved1: reserved
|
||||
* @filters: broadcast filters
|
||||
* @macs: broadcast filtering configuration per-mac
|
||||
*/
|
||||
struct iwl_bcast_filter_cmd {
|
||||
u8 disable;
|
||||
u8 max_bcast_filters;
|
||||
u8 max_macs;
|
||||
u8 reserved1;
|
||||
struct iwl_fw_bcast_filter filters[MAX_BCAST_FILTERS];
|
||||
struct iwl_fw_bcast_mac macs[NUM_MAC_INDEX_DRIVER];
|
||||
} __packed; /* BCAST_FILTERING_HCMD_API_S_VER_1 */
|
||||
|
||||
#endif /* __iwl_fw_api_filter_h__ */
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
||||
/*
|
||||
* Copyright (C) 2012-2014, 2018-2021 Intel Corporation
|
||||
* Copyright (C) 2012-2014, 2018-2022 Intel Corporation
|
||||
* Copyright (C) 2013-2014 Intel Mobile Communications GmbH
|
||||
* Copyright (C) 2015-2017 Intel Deutschland GmbH
|
||||
*/
|
||||
@ -340,7 +340,7 @@ struct iwl_dev_tx_power_cmd_v5 {
|
||||
} __packed; /* TX_REDUCED_POWER_API_S_VER_5 */
|
||||
|
||||
/**
|
||||
* struct iwl_dev_tx_power_cmd_v5 - TX power reduction command version 5
|
||||
* struct iwl_dev_tx_power_cmd_v6 - TX power reduction command version 6
|
||||
* @per_chain: per chain restrictions
|
||||
* @enable_ack_reduction: enable or disable close range ack TX power
|
||||
* reduction.
|
||||
@ -360,6 +360,28 @@ struct iwl_dev_tx_power_cmd_v6 {
|
||||
__le32 timer_period;
|
||||
} __packed; /* TX_REDUCED_POWER_API_S_VER_6 */
|
||||
|
||||
/**
|
||||
* struct iwl_dev_tx_power_cmd_v7 - TX power reduction command version 7
|
||||
* @per_chain: per chain restrictions
|
||||
* @enable_ack_reduction: enable or disable close range ack TX power
|
||||
* reduction.
|
||||
* @per_chain_restriction_changed: is per_chain_restriction has changed
|
||||
* from last command. used if set_mode is
|
||||
* IWL_TX_POWER_MODE_SET_SAR_TIMER.
|
||||
* note: if not changed, the command is used for keep alive only.
|
||||
* @reserved: reserved (padding)
|
||||
* @timer_period: timer in milliseconds. if expires FW will change to default
|
||||
* BIOS values. relevant if setMode is IWL_TX_POWER_MODE_SET_SAR_TIMER
|
||||
* @flags: reduce power flags.
|
||||
*/
|
||||
struct iwl_dev_tx_power_cmd_v7 {
|
||||
__le16 per_chain[IWL_NUM_CHAIN_TABLES_V2][IWL_NUM_CHAIN_LIMITS][IWL_NUM_SUB_BANDS_V2];
|
||||
u8 enable_ack_reduction;
|
||||
u8 per_chain_restriction_changed;
|
||||
u8 reserved[2];
|
||||
__le32 timer_period;
|
||||
__le32 flags;
|
||||
} __packed; /* TX_REDUCED_POWER_API_S_VER_7 */
|
||||
/**
|
||||
* struct iwl_dev_tx_power_cmd - TX power reduction command (multiversion)
|
||||
* @common: common part of the command
|
||||
@ -375,6 +397,7 @@ struct iwl_dev_tx_power_cmd {
|
||||
struct iwl_dev_tx_power_cmd_v4 v4;
|
||||
struct iwl_dev_tx_power_cmd_v5 v5;
|
||||
struct iwl_dev_tx_power_cmd_v6 v6;
|
||||
struct iwl_dev_tx_power_cmd_v7 v7;
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -752,7 +752,6 @@ struct iwl_lq_cmd {
|
||||
|
||||
u8 iwl_fw_rate_idx_to_plcp(int idx);
|
||||
u32 iwl_new_rate_from_v1(u32 rate_v1);
|
||||
u32 iwl_legacy_rate_to_fw_idx(u32 rate_n_flags);
|
||||
const struct iwl_rate_mcs_info *iwl_rate_mcs(int idx);
|
||||
const char *iwl_rs_pretty_ant(u8 ant);
|
||||
const char *iwl_rs_pretty_bw(int bw);
|
||||
|
@ -2443,6 +2443,9 @@ static u32 iwl_dump_ini_trigger(struct iwl_fw_runtime *fwrt,
|
||||
struct iwl_dump_ini_region_data reg_data = {
|
||||
.dump_data = dump_data,
|
||||
};
|
||||
struct iwl_dump_ini_region_data imr_reg_data = {
|
||||
.dump_data = dump_data,
|
||||
};
|
||||
int i;
|
||||
u32 size = 0;
|
||||
u64 regions_mask = le64_to_cpu(trigger->regions_mask) &
|
||||
@ -2478,10 +2481,32 @@ static u32 iwl_dump_ini_trigger(struct iwl_fw_runtime *fwrt,
|
||||
tp_id);
|
||||
continue;
|
||||
}
|
||||
/*
|
||||
* DRAM_IMR can be collected only for FW/HW error timepoint
|
||||
* when fw is not alive. In addition, it must be collected
|
||||
* lastly as it overwrites SRAM that can possibly contain
|
||||
* debug data which also need to be collected.
|
||||
*/
|
||||
if (reg_type == IWL_FW_INI_REGION_DRAM_IMR) {
|
||||
if (tp_id == IWL_FW_INI_TIME_POINT_FW_ASSERT ||
|
||||
tp_id == IWL_FW_INI_TIME_POINT_FW_HW_ERROR)
|
||||
imr_reg_data.reg_tlv = fwrt->trans->dbg.active_regions[i];
|
||||
else
|
||||
IWL_INFO(fwrt,
|
||||
"WRT: trying to collect DRAM_IMR at time point: %d, skipping\n",
|
||||
tp_id);
|
||||
/* continue to next region */
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
size += iwl_dump_ini_mem(fwrt, list, ®_data,
|
||||
&iwl_dump_ini_region_ops[reg_type]);
|
||||
}
|
||||
/* collect DRAM_IMR region in the last */
|
||||
if (imr_reg_data.reg_tlv)
|
||||
size += iwl_dump_ini_mem(fwrt, list, ®_data,
|
||||
&iwl_dump_ini_region_ops[IWL_FW_INI_REGION_DRAM_IMR]);
|
||||
|
||||
if (size)
|
||||
size += iwl_dump_ini_info(fwrt, trigger, list);
|
||||
@ -2897,6 +2922,11 @@ static void iwl_fw_dbg_collect_sync(struct iwl_fw_runtime *fwrt, u8 wk_idx)
|
||||
if (!test_bit(wk_idx, &fwrt->dump.active_wks))
|
||||
return;
|
||||
|
||||
if (!dump_data->trig) {
|
||||
IWL_ERR(fwrt, "dump trigger data is not set\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!test_bit(STATUS_DEVICE_ENABLED, &fwrt->trans->status)) {
|
||||
IWL_ERR(fwrt, "Device is not enabled - cannot dump error\n");
|
||||
goto out;
|
||||
@ -2984,10 +3014,10 @@ int iwl_fw_dbg_ini_collect(struct iwl_fw_runtime *fwrt,
|
||||
"WRT: Collecting data: ini trigger %d fired (delay=%dms).\n",
|
||||
tp_id, (u32)(delay / USEC_PER_MSEC));
|
||||
|
||||
schedule_delayed_work(&fwrt->dump.wks[idx].wk, usecs_to_jiffies(delay));
|
||||
|
||||
if (sync)
|
||||
iwl_fw_dbg_collect_sync(fwrt, idx);
|
||||
else
|
||||
schedule_delayed_work(&fwrt->dump.wks[idx].wk, usecs_to_jiffies(delay));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -181,7 +181,6 @@ struct iwl_ucode_capa {
|
||||
* @IWL_UCODE_TLV_FLAGS_NEW_NSOFFL_LARGE: new NS offload (large version)
|
||||
* @IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT: General support for uAPSD
|
||||
* @IWL_UCODE_TLV_FLAGS_P2P_PS_UAPSD: P2P client supports uAPSD power save
|
||||
* @IWL_UCODE_TLV_FLAGS_BCAST_FILTERING: uCode supports broadcast filtering.
|
||||
* @IWL_UCODE_TLV_FLAGS_EBS_SUPPORT: this uCode image supports EBS.
|
||||
*/
|
||||
enum iwl_ucode_tlv_flag {
|
||||
@ -196,7 +195,6 @@ enum iwl_ucode_tlv_flag {
|
||||
IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT = BIT(24),
|
||||
IWL_UCODE_TLV_FLAGS_EBS_SUPPORT = BIT(25),
|
||||
IWL_UCODE_TLV_FLAGS_P2P_PS_UAPSD = BIT(26),
|
||||
IWL_UCODE_TLV_FLAGS_BCAST_FILTERING = BIT(29),
|
||||
};
|
||||
|
||||
typedef unsigned int __bitwise iwl_ucode_tlv_api_t;
|
||||
@ -518,34 +516,6 @@ enum iwl_fw_phy_cfg {
|
||||
FW_PHY_CFG_SHARED_CLK = BIT(31),
|
||||
};
|
||||
|
||||
#define IWL_UCODE_MAX_CS 1
|
||||
|
||||
/**
|
||||
* struct iwl_fw_cipher_scheme - a cipher scheme supported by FW.
|
||||
* @cipher: a cipher suite selector
|
||||
* @flags: cipher scheme flags (currently reserved for a future use)
|
||||
* @hdr_len: a size of MPDU security header
|
||||
* @pn_len: a size of PN
|
||||
* @pn_off: an offset of pn from the beginning of the security header
|
||||
* @key_idx_off: an offset of key index byte in the security header
|
||||
* @key_idx_mask: a bit mask of key_idx bits
|
||||
* @key_idx_shift: bit shift needed to get key_idx
|
||||
* @mic_len: mic length in bytes
|
||||
* @hw_cipher: a HW cipher index used in host commands
|
||||
*/
|
||||
struct iwl_fw_cipher_scheme {
|
||||
__le32 cipher;
|
||||
u8 flags;
|
||||
u8 hdr_len;
|
||||
u8 pn_len;
|
||||
u8 pn_off;
|
||||
u8 key_idx_off;
|
||||
u8 key_idx_mask;
|
||||
u8 key_idx_shift;
|
||||
u8 mic_len;
|
||||
u8 hw_cipher;
|
||||
} __packed;
|
||||
|
||||
enum iwl_fw_dbg_reg_operator {
|
||||
CSR_ASSIGN,
|
||||
CSR_SETBIT,
|
||||
|
@ -133,16 +133,6 @@ struct iwl_fw_paging {
|
||||
u32 fw_offs;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct iwl_fw_cscheme_list - a cipher scheme list
|
||||
* @size: a number of entries
|
||||
* @cs: cipher scheme entries
|
||||
*/
|
||||
struct iwl_fw_cscheme_list {
|
||||
u8 size;
|
||||
struct iwl_fw_cipher_scheme cs[];
|
||||
} __packed;
|
||||
|
||||
/**
|
||||
* enum iwl_fw_type - iwlwifi firmware type
|
||||
* @IWL_FW_DVM: DVM firmware
|
||||
@ -197,7 +187,6 @@ struct iwl_dump_exclude {
|
||||
* @inst_evtlog_size: event log size for runtime ucode.
|
||||
* @inst_errlog_ptr: error log offfset for runtime ucode.
|
||||
* @type: firmware type (&enum iwl_fw_type)
|
||||
* @cipher_scheme: optional external cipher scheme.
|
||||
* @human_readable: human readable version
|
||||
* we get the ALIVE from the uCode
|
||||
* @phy_integration_ver: PHY integration version string
|
||||
@ -228,7 +217,6 @@ struct iwl_fw {
|
||||
|
||||
enum iwl_fw_type type;
|
||||
|
||||
struct iwl_fw_cipher_scheme cs[IWL_UCODE_MAX_CS];
|
||||
u8 human_readable[FW_VER_HUMAN_READABLE_SZ];
|
||||
|
||||
struct iwl_fw_dbg dbg;
|
||||
|
@ -91,6 +91,20 @@ const char *iwl_rs_pretty_bw(int bw)
|
||||
}
|
||||
IWL_EXPORT_SYMBOL(iwl_rs_pretty_bw);
|
||||
|
||||
static u32 iwl_legacy_rate_to_fw_idx(u32 rate_n_flags)
|
||||
{
|
||||
int rate = rate_n_flags & RATE_LEGACY_RATE_MSK_V1;
|
||||
int idx;
|
||||
bool ofdm = !(rate_n_flags & RATE_MCS_CCK_MSK_V1);
|
||||
int offset = ofdm ? IWL_FIRST_OFDM_RATE : 0;
|
||||
int last = ofdm ? IWL_RATE_COUNT_LEGACY : IWL_FIRST_OFDM_RATE;
|
||||
|
||||
for (idx = offset; idx < last; idx++)
|
||||
if (iwl_fw_rate_idx_to_plcp(idx) == rate)
|
||||
return idx - offset;
|
||||
return IWL_RATE_INVALID;
|
||||
}
|
||||
|
||||
u32 iwl_new_rate_from_v1(u32 rate_v1)
|
||||
{
|
||||
u32 rate_v2 = 0;
|
||||
@ -144,7 +158,10 @@ u32 iwl_new_rate_from_v1(u32 rate_v1)
|
||||
} else {
|
||||
u32 legacy_rate = iwl_legacy_rate_to_fw_idx(rate_v1);
|
||||
|
||||
WARN_ON(legacy_rate < 0);
|
||||
if (WARN_ON_ONCE(legacy_rate == IWL_RATE_INVALID))
|
||||
legacy_rate = (rate_v1 & RATE_MCS_CCK_MSK_V1) ?
|
||||
IWL_FIRST_CCK_RATE : IWL_FIRST_OFDM_RATE;
|
||||
|
||||
rate_v2 |= legacy_rate;
|
||||
if (!(rate_v1 & RATE_MCS_CCK_MSK_V1))
|
||||
rate_v2 |= RATE_MCS_LEGACY_OFDM_MSK;
|
||||
@ -172,20 +189,6 @@ u32 iwl_new_rate_from_v1(u32 rate_v1)
|
||||
}
|
||||
IWL_EXPORT_SYMBOL(iwl_new_rate_from_v1);
|
||||
|
||||
u32 iwl_legacy_rate_to_fw_idx(u32 rate_n_flags)
|
||||
{
|
||||
int rate = rate_n_flags & RATE_LEGACY_RATE_MSK_V1;
|
||||
int idx;
|
||||
bool ofdm = !(rate_n_flags & RATE_MCS_CCK_MSK_V1);
|
||||
int offset = ofdm ? IWL_FIRST_OFDM_RATE : 0;
|
||||
int last = ofdm ? IWL_RATE_COUNT_LEGACY : IWL_FIRST_OFDM_RATE;
|
||||
|
||||
for (idx = offset; idx < last; idx++)
|
||||
if (iwl_fw_rate_idx_to_plcp(idx) == rate)
|
||||
return idx - offset;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int rs_pretty_print_rate(char *buf, int bufsz, const u32 rate)
|
||||
{
|
||||
char *type;
|
||||
|
@ -1,7 +1,7 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
||||
/*
|
||||
* Copyright (C) 2017 Intel Deutschland GmbH
|
||||
* Copyright (C) 2018-2020 Intel Corporation
|
||||
* Copyright (C) 2018-2022 Intel Corporation
|
||||
*/
|
||||
#ifndef __iwl_fw_runtime_h__
|
||||
#define __iwl_fw_runtime_h__
|
||||
@ -163,6 +163,7 @@ struct iwl_fw_runtime {
|
||||
u32 ppag_ver;
|
||||
struct iwl_sar_offset_mapping_cmd sgom_table;
|
||||
bool sgom_enabled;
|
||||
u8 reduced_power_flags;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
@ -260,6 +260,7 @@ enum iwl_cfg_trans_ltr_delay {
|
||||
* @integrated: discrete or integrated
|
||||
* @low_latency_xtal: use the low latency xtal if supported
|
||||
* @ltr_delay: LTR delay parameter, &enum iwl_cfg_trans_ltr_delay.
|
||||
* @imr_enabled: use the IMR if supported.
|
||||
*/
|
||||
struct iwl_cfg_trans_params {
|
||||
const struct iwl_base_params *base_params;
|
||||
@ -274,7 +275,8 @@ struct iwl_cfg_trans_params {
|
||||
integrated:1,
|
||||
low_latency_xtal:1,
|
||||
bisr_workaround:1,
|
||||
ltr_delay:2;
|
||||
ltr_delay:2,
|
||||
imr_enabled:1;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -491,6 +493,7 @@ extern const struct iwl_cfg_trans_params iwl_ax200_trans_cfg;
|
||||
extern const struct iwl_cfg_trans_params iwl_snj_trans_cfg;
|
||||
extern const struct iwl_cfg_trans_params iwl_so_trans_cfg;
|
||||
extern const struct iwl_cfg_trans_params iwl_so_long_latency_trans_cfg;
|
||||
extern const struct iwl_cfg_trans_params iwl_so_long_latency_imr_trans_cfg;
|
||||
extern const struct iwl_cfg_trans_params iwl_ma_trans_cfg;
|
||||
extern const struct iwl_cfg_trans_params iwl_bz_trans_cfg;
|
||||
extern const char iwl9162_name[];
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
||||
/*
|
||||
* Copyright (C) 2018, 2020-2021 Intel Corporation
|
||||
* Copyright (C) 2018, 2020-2022 Intel Corporation
|
||||
*/
|
||||
#ifndef __iwl_context_info_file_gen3_h__
|
||||
#define __iwl_context_info_file_gen3_h__
|
||||
@ -34,6 +34,7 @@ enum iwl_prph_scratch_mtr_format {
|
||||
|
||||
/**
|
||||
* enum iwl_prph_scratch_flags - PRPH scratch control flags
|
||||
* @IWL_PRPH_SCRATCH_IMR_DEBUG_EN: IMR support for debug
|
||||
* @IWL_PRPH_SCRATCH_EARLY_DEBUG_EN: enable early debug conf
|
||||
* @IWL_PRPH_SCRATCH_EDBG_DEST_DRAM: use DRAM, with size allocated
|
||||
* in hwm config.
|
||||
@ -55,6 +56,7 @@ enum iwl_prph_scratch_mtr_format {
|
||||
* @IWL_PRPH_SCRATCH_RB_SIZE_EXT_16K: 16kB RB size
|
||||
*/
|
||||
enum iwl_prph_scratch_flags {
|
||||
IWL_PRPH_SCRATCH_IMR_DEBUG_EN = BIT(1),
|
||||
IWL_PRPH_SCRATCH_EARLY_DEBUG_EN = BIT(4),
|
||||
IWL_PRPH_SCRATCH_EDBG_DEST_DRAM = BIT(8),
|
||||
IWL_PRPH_SCRATCH_EDBG_DEST_INTERNAL = BIT(9),
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
||||
/*
|
||||
* Copyright (C) 2005-2014, 2018-2021 Intel Corporation
|
||||
* Copyright (C) 2005-2014, 2018-2022 Intel Corporation
|
||||
* Copyright (C) 2013-2014 Intel Mobile Communications GmbH
|
||||
* Copyright (C) 2016 Intel Deutschland GmbH
|
||||
*/
|
||||
@ -329,6 +329,7 @@ enum {
|
||||
#define CSR_HW_REV_TYPE_2x00 (0x0000100)
|
||||
#define CSR_HW_REV_TYPE_105 (0x0000110)
|
||||
#define CSR_HW_REV_TYPE_135 (0x0000120)
|
||||
#define CSR_HW_REV_TYPE_3160 (0x0000164)
|
||||
#define CSR_HW_REV_TYPE_7265D (0x0000210)
|
||||
#define CSR_HW_REV_TYPE_NONE (0x00001F0)
|
||||
#define CSR_HW_REV_TYPE_QNJ (0x0000360)
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
||||
/*
|
||||
* Copyright (C) 2018-2021 Intel Corporation
|
||||
* Copyright (C) 2018-2022 Intel Corporation
|
||||
*/
|
||||
#ifndef __iwl_dbg_tlv_h__
|
||||
#define __iwl_dbg_tlv_h__
|
||||
@ -10,6 +10,8 @@
|
||||
#include <fw/file.h>
|
||||
#include <fw/api/dbg-tlv.h>
|
||||
|
||||
#define IWL_DBG_TLV_MAX_PRESET 15
|
||||
|
||||
/**
|
||||
* struct iwl_dbg_tlv_node - debug TLV node
|
||||
* @list: list of &struct iwl_dbg_tlv_node
|
||||
|
@ -335,30 +335,6 @@ static void set_sec_offset(struct iwl_firmware_pieces *pieces,
|
||||
pieces->img[type].sec[sec].offset = offset;
|
||||
}
|
||||
|
||||
static int iwl_store_cscheme(struct iwl_fw *fw, const u8 *data, const u32 len)
|
||||
{
|
||||
int i, j;
|
||||
const struct iwl_fw_cscheme_list *l =
|
||||
(const struct iwl_fw_cscheme_list *)data;
|
||||
const struct iwl_fw_cipher_scheme *fwcs;
|
||||
|
||||
if (len < sizeof(*l) ||
|
||||
len < sizeof(l->size) + l->size * sizeof(l->cs[0]))
|
||||
return -EINVAL;
|
||||
|
||||
for (i = 0, j = 0; i < IWL_UCODE_MAX_CS && i < l->size; i++) {
|
||||
fwcs = &l->cs[j];
|
||||
|
||||
/* we skip schemes with zero cipher suite selector */
|
||||
if (!fwcs->cipher)
|
||||
continue;
|
||||
|
||||
fw->cs[j++] = *fwcs;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Gets uCode section from tlv.
|
||||
*/
|
||||
@ -937,10 +913,6 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv,
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
case IWL_UCODE_TLV_CSCHEME:
|
||||
if (iwl_store_cscheme(&drv->fw, tlv_data, tlv_len))
|
||||
goto invalid_tlv_len;
|
||||
break;
|
||||
case IWL_UCODE_TLV_N_SCAN_CHANNELS:
|
||||
if (tlv_len != sizeof(u32))
|
||||
goto invalid_tlv_len;
|
||||
@ -1732,6 +1704,8 @@ static void iwl_req_fw_callback(const struct firmware *ucode_raw, void *context)
|
||||
out_unbind:
|
||||
complete(&drv->request_firmware_complete);
|
||||
device_release_driver(drv->trans->dev);
|
||||
/* drv has just been freed by the release */
|
||||
failure = false;
|
||||
free:
|
||||
if (failure)
|
||||
iwl_dealloc_ucode(drv);
|
||||
@ -1819,6 +1793,7 @@ void iwl_drv_stop(struct iwl_drv *drv)
|
||||
kfree(drv);
|
||||
}
|
||||
|
||||
#define ENABLE_INI (IWL_DBG_TLV_MAX_PRESET + 1)
|
||||
|
||||
/* shared module parameters */
|
||||
struct iwl_mod_params iwlwifi_mod_params = {
|
||||
@ -1826,7 +1801,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,
|
||||
.enable_ini = ENABLE_INI,
|
||||
#if defined(__FreeBSD__)
|
||||
.disable_11n = 1,
|
||||
.disable_11ac = true,
|
||||
@ -1943,10 +1918,44 @@ MODULE_PARM_DESC(nvm_file, "NVM file name");
|
||||
module_param_named(uapsd_disable, iwlwifi_mod_params.uapsd_disable, uint, 0644);
|
||||
MODULE_PARM_DESC(uapsd_disable,
|
||||
"disable U-APSD functionality bitmap 1: BSS 2: P2P Client (default: 3)");
|
||||
module_param_named(enable_ini, iwlwifi_mod_params.enable_ini,
|
||||
bool, S_IRUGO | S_IWUSR);
|
||||
|
||||
#if defined(__linux__)
|
||||
static int enable_ini_set(const char *arg, const struct kernel_param *kp)
|
||||
{
|
||||
int ret = 0;
|
||||
bool res;
|
||||
__u32 new_enable_ini;
|
||||
|
||||
/* in case the argument type is a number */
|
||||
ret = kstrtou32(arg, 0, &new_enable_ini);
|
||||
if (!ret) {
|
||||
if (new_enable_ini > ENABLE_INI) {
|
||||
pr_err("enable_ini cannot be %d, in range 0-16\n", new_enable_ini);
|
||||
return -EINVAL;
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* in case the argument type is boolean */
|
||||
ret = kstrtobool(arg, &res);
|
||||
if (ret)
|
||||
return ret;
|
||||
new_enable_ini = (res ? ENABLE_INI : 0);
|
||||
|
||||
out:
|
||||
iwlwifi_mod_params.enable_ini = new_enable_ini;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct kernel_param_ops enable_ini_ops = {
|
||||
.set = enable_ini_set
|
||||
};
|
||||
|
||||
module_param_cb(enable_ini, &enable_ini_ops, &iwlwifi_mod_params.enable_ini, 0644);
|
||||
MODULE_PARM_DESC(enable_ini,
|
||||
"Enable debug INI TLV FW debug infrastructure (default: true");
|
||||
"0:disable, 1-15:FW_DBG_PRESET Values, 16:enabled without preset value defined,"
|
||||
"Debug INI TLV FW debug infrastructure (default: 16)");
|
||||
#endif
|
||||
|
||||
/*
|
||||
* set bt_coex_active to true, uCode will do kill/defer
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
||||
/*
|
||||
* Copyright (C) 2005-2014, 2018-2020 Intel Corporation
|
||||
* Copyright (C) 2005-2014, 2018-2022 Intel Corporation
|
||||
*/
|
||||
#ifndef __iwl_modparams_h__
|
||||
#define __iwl_modparams_h__
|
||||
@ -90,7 +90,8 @@ struct iwl_mod_params {
|
||||
*/
|
||||
bool disable_11ax;
|
||||
bool remove_when_gone;
|
||||
bool enable_ini;
|
||||
u32 enable_ini;
|
||||
bool disable_11be;
|
||||
};
|
||||
|
||||
static inline bool iwl_enable_rx_ampdu(void)
|
||||
|
@ -553,8 +553,7 @@ static const struct ieee80211_sband_iftype_data iwl_he_capa[] = {
|
||||
.has_he = true,
|
||||
.he_cap_elem = {
|
||||
.mac_cap_info[0] =
|
||||
IEEE80211_HE_MAC_CAP0_HTC_HE |
|
||||
IEEE80211_HE_MAC_CAP0_TWT_REQ,
|
||||
IEEE80211_HE_MAC_CAP0_HTC_HE,
|
||||
.mac_cap_info[1] =
|
||||
IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US |
|
||||
IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8,
|
||||
|
@ -5,6 +5,7 @@
|
||||
* Copyright (C) 2016-2017 Intel Deutschland GmbH
|
||||
*/
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/ieee80211.h>
|
||||
#include <linux/netdevice.h>
|
||||
|
||||
@ -1368,189 +1369,6 @@ static ssize_t iwl_dbgfs_dbg_time_point_write(struct iwl_mvm *mvm,
|
||||
return count;
|
||||
}
|
||||
|
||||
#define ADD_TEXT(...) pos += scnprintf(buf + pos, bufsz - pos, __VA_ARGS__)
|
||||
#ifdef CONFIG_IWLWIFI_BCAST_FILTERING
|
||||
static ssize_t iwl_dbgfs_bcast_filters_read(struct file *file,
|
||||
char __user *user_buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct iwl_mvm *mvm = file->private_data;
|
||||
struct iwl_bcast_filter_cmd cmd;
|
||||
const struct iwl_fw_bcast_filter *filter;
|
||||
char *buf;
|
||||
int bufsz = 1024;
|
||||
int i, j, pos = 0;
|
||||
ssize_t ret;
|
||||
|
||||
buf = kzalloc(bufsz, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
mutex_lock(&mvm->mutex);
|
||||
if (!iwl_mvm_bcast_filter_build_cmd(mvm, &cmd)) {
|
||||
ADD_TEXT("None\n");
|
||||
mutex_unlock(&mvm->mutex);
|
||||
goto out;
|
||||
}
|
||||
mutex_unlock(&mvm->mutex);
|
||||
|
||||
for (i = 0; cmd.filters[i].attrs[0].mask; i++) {
|
||||
filter = &cmd.filters[i];
|
||||
|
||||
ADD_TEXT("Filter [%d]:\n", i);
|
||||
ADD_TEXT("\tDiscard=%d\n", filter->discard);
|
||||
ADD_TEXT("\tFrame Type: %s\n",
|
||||
filter->frame_type ? "IPv4" : "Generic");
|
||||
|
||||
for (j = 0; j < ARRAY_SIZE(filter->attrs); j++) {
|
||||
const struct iwl_fw_bcast_filter_attr *attr;
|
||||
|
||||
attr = &filter->attrs[j];
|
||||
if (!attr->mask)
|
||||
break;
|
||||
|
||||
ADD_TEXT("\tAttr [%d]: offset=%d (from %s), mask=0x%x, value=0x%x reserved=0x%x\n",
|
||||
j, attr->offset,
|
||||
attr->offset_type ? "IP End" :
|
||||
"Payload Start",
|
||||
be32_to_cpu(attr->mask),
|
||||
be32_to_cpu(attr->val),
|
||||
le16_to_cpu(attr->reserved1));
|
||||
}
|
||||
}
|
||||
out:
|
||||
ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
|
||||
kfree(buf);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t iwl_dbgfs_bcast_filters_write(struct iwl_mvm *mvm, char *buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
int pos, next_pos;
|
||||
struct iwl_fw_bcast_filter filter = {};
|
||||
struct iwl_bcast_filter_cmd cmd;
|
||||
u32 filter_id, attr_id, mask, value;
|
||||
int err = 0;
|
||||
|
||||
if (sscanf(buf, "%d %hhi %hhi %n", &filter_id, &filter.discard,
|
||||
&filter.frame_type, &pos) != 3)
|
||||
return -EINVAL;
|
||||
|
||||
if (filter_id >= ARRAY_SIZE(mvm->dbgfs_bcast_filtering.cmd.filters) ||
|
||||
filter.frame_type > BCAST_FILTER_FRAME_TYPE_IPV4)
|
||||
return -EINVAL;
|
||||
|
||||
for (attr_id = 0; attr_id < ARRAY_SIZE(filter.attrs);
|
||||
attr_id++) {
|
||||
struct iwl_fw_bcast_filter_attr *attr =
|
||||
&filter.attrs[attr_id];
|
||||
|
||||
if (pos >= count)
|
||||
break;
|
||||
|
||||
if (sscanf(&buf[pos], "%hhi %hhi %i %i %n",
|
||||
&attr->offset, &attr->offset_type,
|
||||
&mask, &value, &next_pos) != 4)
|
||||
return -EINVAL;
|
||||
|
||||
attr->mask = cpu_to_be32(mask);
|
||||
attr->val = cpu_to_be32(value);
|
||||
if (mask)
|
||||
filter.num_attrs++;
|
||||
|
||||
pos += next_pos;
|
||||
}
|
||||
|
||||
mutex_lock(&mvm->mutex);
|
||||
memcpy(&mvm->dbgfs_bcast_filtering.cmd.filters[filter_id],
|
||||
&filter, sizeof(filter));
|
||||
|
||||
/* send updated bcast filtering configuration */
|
||||
if (iwl_mvm_firmware_running(mvm) &&
|
||||
mvm->dbgfs_bcast_filtering.override &&
|
||||
iwl_mvm_bcast_filter_build_cmd(mvm, &cmd))
|
||||
err = iwl_mvm_send_cmd_pdu(mvm, BCAST_FILTER_CMD, 0,
|
||||
sizeof(cmd), &cmd);
|
||||
mutex_unlock(&mvm->mutex);
|
||||
|
||||
return err ?: count;
|
||||
}
|
||||
|
||||
static ssize_t iwl_dbgfs_bcast_filters_macs_read(struct file *file,
|
||||
char __user *user_buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct iwl_mvm *mvm = file->private_data;
|
||||
struct iwl_bcast_filter_cmd cmd;
|
||||
char *buf;
|
||||
int bufsz = 1024;
|
||||
int i, pos = 0;
|
||||
ssize_t ret;
|
||||
|
||||
buf = kzalloc(bufsz, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
mutex_lock(&mvm->mutex);
|
||||
if (!iwl_mvm_bcast_filter_build_cmd(mvm, &cmd)) {
|
||||
ADD_TEXT("None\n");
|
||||
mutex_unlock(&mvm->mutex);
|
||||
goto out;
|
||||
}
|
||||
mutex_unlock(&mvm->mutex);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(cmd.macs); i++) {
|
||||
const struct iwl_fw_bcast_mac *mac = &cmd.macs[i];
|
||||
|
||||
ADD_TEXT("Mac [%d]: discard=%d attached_filters=0x%x\n",
|
||||
i, mac->default_discard, mac->attached_filters);
|
||||
}
|
||||
out:
|
||||
ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
|
||||
kfree(buf);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t iwl_dbgfs_bcast_filters_macs_write(struct iwl_mvm *mvm,
|
||||
char *buf, size_t count,
|
||||
loff_t *ppos)
|
||||
{
|
||||
struct iwl_bcast_filter_cmd cmd;
|
||||
struct iwl_fw_bcast_mac mac = {};
|
||||
u32 mac_id, attached_filters;
|
||||
int err = 0;
|
||||
|
||||
if (!mvm->bcast_filters)
|
||||
return -ENOENT;
|
||||
|
||||
if (sscanf(buf, "%d %hhi %i", &mac_id, &mac.default_discard,
|
||||
&attached_filters) != 3)
|
||||
return -EINVAL;
|
||||
|
||||
if (mac_id >= ARRAY_SIZE(cmd.macs) ||
|
||||
mac.default_discard > 1 ||
|
||||
attached_filters >= BIT(ARRAY_SIZE(cmd.filters)))
|
||||
return -EINVAL;
|
||||
|
||||
mac.attached_filters = cpu_to_le16(attached_filters);
|
||||
|
||||
mutex_lock(&mvm->mutex);
|
||||
memcpy(&mvm->dbgfs_bcast_filtering.cmd.macs[mac_id],
|
||||
&mac, sizeof(mac));
|
||||
|
||||
/* send updated bcast filtering configuration */
|
||||
if (iwl_mvm_firmware_running(mvm) &&
|
||||
mvm->dbgfs_bcast_filtering.override &&
|
||||
iwl_mvm_bcast_filter_build_cmd(mvm, &cmd))
|
||||
err = iwl_mvm_send_cmd_pdu(mvm, BCAST_FILTER_CMD, 0,
|
||||
sizeof(cmd), &cmd);
|
||||
mutex_unlock(&mvm->mutex);
|
||||
|
||||
return err ?: count;
|
||||
}
|
||||
#endif
|
||||
|
||||
#define MVM_DEBUGFS_WRITE_FILE_OPS(name, bufsz) \
|
||||
_MVM_DEBUGFS_WRITE_FILE_OPS(name, bufsz, struct iwl_mvm)
|
||||
#define MVM_DEBUGFS_READ_WRITE_FILE_OPS(name, bufsz) \
|
||||
@ -1881,11 +1699,6 @@ MVM_DEBUGFS_WRITE_FILE_OPS(inject_beacon_ie_restore, 512);
|
||||
|
||||
MVM_DEBUGFS_READ_FILE_OPS(uapsd_noagg_bssids);
|
||||
|
||||
#ifdef CONFIG_IWLWIFI_BCAST_FILTERING
|
||||
MVM_DEBUGFS_READ_WRITE_FILE_OPS(bcast_filters, 256);
|
||||
MVM_DEBUGFS_READ_WRITE_FILE_OPS(bcast_filters_macs, 256);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
MVM_DEBUGFS_READ_FILE_OPS(sar_geo_profile);
|
||||
#endif
|
||||
@ -2043,7 +1856,6 @@ void iwl_mvm_sta_add_debugfs(struct ieee80211_hw *hw,
|
||||
void iwl_mvm_dbgfs_register(struct iwl_mvm *mvm)
|
||||
{
|
||||
struct dentry *bcast_dir __maybe_unused;
|
||||
char buf[100];
|
||||
|
||||
spin_lock_init(&mvm->drv_stats_lock);
|
||||
|
||||
@ -2095,21 +1907,6 @@ void iwl_mvm_dbgfs_register(struct iwl_mvm *mvm)
|
||||
|
||||
MVM_DEBUGFS_ADD_FILE(uapsd_noagg_bssids, mvm->debugfs_dir, S_IRUSR);
|
||||
|
||||
#ifdef CONFIG_IWLWIFI_BCAST_FILTERING
|
||||
if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_BCAST_FILTERING) {
|
||||
bcast_dir = debugfs_create_dir("bcast_filtering",
|
||||
mvm->debugfs_dir);
|
||||
|
||||
debugfs_create_bool("override", 0600, bcast_dir,
|
||||
&mvm->dbgfs_bcast_filtering.override);
|
||||
|
||||
MVM_DEBUGFS_ADD_FILE_ALIAS("filters", bcast_filters,
|
||||
bcast_dir, 0600);
|
||||
MVM_DEBUGFS_ADD_FILE_ALIAS("macs", bcast_filters_macs,
|
||||
bcast_dir, 0600);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
MVM_DEBUGFS_ADD_FILE(d3_test, mvm->debugfs_dir, 0400);
|
||||
debugfs_create_bool("d3_wake_sysassert", 0600, mvm->debugfs_dir,
|
||||
@ -2140,6 +1937,11 @@ void iwl_mvm_dbgfs_register(struct iwl_mvm *mvm)
|
||||
* Create a symlink with mac80211. It will be removed when mac80211
|
||||
* exists (before the opmode exists which removes the target.)
|
||||
*/
|
||||
snprintf(buf, 100, "../../%pd2", mvm->debugfs_dir->d_parent);
|
||||
debugfs_create_symlink("iwlwifi", mvm->hw->wiphy->debugfsdir, buf);
|
||||
if (!IS_ERR(mvm->debugfs_dir)) {
|
||||
char buf[100];
|
||||
|
||||
snprintf(buf, 100, "../../%pd2", mvm->debugfs_dir->d_parent);
|
||||
debugfs_create_symlink("iwlwifi", mvm->hw->wiphy->debugfsdir,
|
||||
buf);
|
||||
}
|
||||
}
|
||||
|
@ -25,9 +25,6 @@
|
||||
#define MVM_UCODE_ALIVE_TIMEOUT (HZ)
|
||||
#define MVM_UCODE_CALIB_TIMEOUT (2 * HZ)
|
||||
|
||||
#define IWL_PPAG_MASK 3
|
||||
#define IWL_PPAG_ETSI_MASK BIT(0)
|
||||
|
||||
#define IWL_TAS_US_MCC 0x5553
|
||||
#define IWL_TAS_CANADA_MCC 0x4341
|
||||
|
||||
@ -124,6 +121,7 @@ static bool iwl_alive_fn(struct iwl_notif_wait_data *notif_wait,
|
||||
u32 lmac_error_event_table, umac_error_table;
|
||||
u32 version = iwl_fw_lookup_notif_ver(mvm->fw, LEGACY_GROUP,
|
||||
UCODE_ALIVE_NTFY, 0);
|
||||
u32 i;
|
||||
|
||||
if (version == 6) {
|
||||
struct iwl_alive_ntf_v6 *palive;
|
||||
@ -146,6 +144,28 @@ static bool iwl_alive_fn(struct iwl_notif_wait_data *notif_wait,
|
||||
mvm->trans->dbg.imr_data.imr_enable,
|
||||
mvm->trans->dbg.imr_data.imr_size,
|
||||
le64_to_cpu(mvm->trans->dbg.imr_data.imr_base_addr));
|
||||
|
||||
if (!mvm->trans->dbg.imr_data.imr_enable) {
|
||||
for (i = 0; i < ARRAY_SIZE(mvm->trans->dbg.active_regions); i++) {
|
||||
struct iwl_ucode_tlv *reg_tlv;
|
||||
struct iwl_fw_ini_region_tlv *reg;
|
||||
|
||||
reg_tlv = mvm->trans->dbg.active_regions[i];
|
||||
if (!reg_tlv)
|
||||
continue;
|
||||
|
||||
reg = (void *)reg_tlv->data;
|
||||
/*
|
||||
* We have only one DRAM IMR region, so we
|
||||
* can break as soon as we find the first
|
||||
* one.
|
||||
*/
|
||||
if (reg->type == IWL_FW_INI_REGION_DRAM_IMR) {
|
||||
mvm->trans->dbg.unsupported_region_msk |= BIT(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (version >= 5) {
|
||||
@ -806,8 +826,12 @@ int iwl_mvm_sar_select_profile(struct iwl_mvm *mvm, int prof_a, int prof_b)
|
||||
u32 n_subbands;
|
||||
u8 cmd_ver = iwl_fw_lookup_cmd_ver(mvm->fw, cmd_id,
|
||||
IWL_FW_CMD_VER_UNKNOWN);
|
||||
|
||||
if (cmd_ver == 6) {
|
||||
if (cmd_ver == 7) {
|
||||
len = sizeof(cmd.v7);
|
||||
n_subbands = IWL_NUM_SUB_BANDS_V2;
|
||||
per_chain = cmd.v7.per_chain[0][0];
|
||||
cmd.v7.flags = cpu_to_le32(mvm->fwrt.reduced_power_flags);
|
||||
} else if (cmd_ver == 6) {
|
||||
len = sizeof(cmd.v6);
|
||||
n_subbands = IWL_NUM_SUB_BANDS_V2;
|
||||
per_chain = cmd.v6.per_chain[0][0];
|
||||
@ -985,161 +1009,15 @@ static int iwl_mvm_sar_geo_init(struct iwl_mvm *mvm)
|
||||
return iwl_mvm_send_cmd_pdu(mvm, cmd_id, 0, len, &cmd);
|
||||
}
|
||||
|
||||
static int iwl_mvm_get_ppag_table(struct iwl_mvm *mvm)
|
||||
{
|
||||
union acpi_object *wifi_pkg, *data, *flags;
|
||||
int i, j, ret, tbl_rev, num_sub_bands;
|
||||
int idx = 2;
|
||||
|
||||
mvm->fwrt.ppag_flags = 0;
|
||||
|
||||
data = iwl_acpi_get_object(mvm->dev, ACPI_PPAG_METHOD);
|
||||
if (IS_ERR(data))
|
||||
return PTR_ERR(data);
|
||||
|
||||
/* try to read ppag table rev 2 or 1 (both have the same data size) */
|
||||
wifi_pkg = iwl_acpi_get_wifi_pkg(mvm->dev, data,
|
||||
ACPI_PPAG_WIFI_DATA_SIZE_V2, &tbl_rev);
|
||||
if (!IS_ERR(wifi_pkg)) {
|
||||
if (tbl_rev == 1 || tbl_rev == 2) {
|
||||
num_sub_bands = IWL_NUM_SUB_BANDS_V2;
|
||||
IWL_DEBUG_RADIO(mvm,
|
||||
"Reading PPAG table v2 (tbl_rev=%d)\n",
|
||||
tbl_rev);
|
||||
goto read_table;
|
||||
} else {
|
||||
ret = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
}
|
||||
|
||||
/* try to read ppag table revision 0 */
|
||||
wifi_pkg = iwl_acpi_get_wifi_pkg(mvm->dev, data,
|
||||
ACPI_PPAG_WIFI_DATA_SIZE_V1, &tbl_rev);
|
||||
if (!IS_ERR(wifi_pkg)) {
|
||||
if (tbl_rev != 0) {
|
||||
ret = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
num_sub_bands = IWL_NUM_SUB_BANDS_V1;
|
||||
IWL_DEBUG_RADIO(mvm, "Reading PPAG table v1 (tbl_rev=0)\n");
|
||||
goto read_table;
|
||||
}
|
||||
ret = PTR_ERR(wifi_pkg);
|
||||
goto out_free;
|
||||
|
||||
read_table:
|
||||
mvm->fwrt.ppag_ver = tbl_rev;
|
||||
flags = &wifi_pkg->package.elements[1];
|
||||
|
||||
if (flags->type != ACPI_TYPE_INTEGER) {
|
||||
ret = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
mvm->fwrt.ppag_flags = flags->integer.value & IWL_PPAG_MASK;
|
||||
|
||||
if (!mvm->fwrt.ppag_flags) {
|
||||
ret = 0;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
/*
|
||||
* read, verify gain values and save them into the PPAG table.
|
||||
* first sub-band (j=0) corresponds to Low-Band (2.4GHz), and the
|
||||
* following sub-bands to High-Band (5GHz).
|
||||
*/
|
||||
for (i = 0; i < IWL_NUM_CHAIN_LIMITS; i++) {
|
||||
for (j = 0; j < num_sub_bands; j++) {
|
||||
union acpi_object *ent;
|
||||
|
||||
ent = &wifi_pkg->package.elements[idx++];
|
||||
if (ent->type != ACPI_TYPE_INTEGER) {
|
||||
ret = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
mvm->fwrt.ppag_chains[i].subbands[j] = ent->integer.value;
|
||||
|
||||
if ((j == 0 &&
|
||||
(mvm->fwrt.ppag_chains[i].subbands[j] > ACPI_PPAG_MAX_LB ||
|
||||
mvm->fwrt.ppag_chains[i].subbands[j] < ACPI_PPAG_MIN_LB)) ||
|
||||
(j != 0 &&
|
||||
(mvm->fwrt.ppag_chains[i].subbands[j] > ACPI_PPAG_MAX_HB ||
|
||||
mvm->fwrt.ppag_chains[i].subbands[j] < ACPI_PPAG_MIN_HB))) {
|
||||
mvm->fwrt.ppag_flags = 0;
|
||||
ret = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
out_free:
|
||||
kfree(data);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int iwl_mvm_ppag_send_cmd(struct iwl_mvm *mvm)
|
||||
{
|
||||
union iwl_ppag_table_cmd cmd;
|
||||
u8 cmd_ver;
|
||||
int i, j, ret, num_sub_bands, cmd_size;
|
||||
s8 *gain;
|
||||
int ret, cmd_size;
|
||||
|
||||
if (!fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_SET_PPAG)) {
|
||||
IWL_DEBUG_RADIO(mvm,
|
||||
"PPAG capability not supported by FW, command not sent.\n");
|
||||
return 0;
|
||||
}
|
||||
if (!mvm->fwrt.ppag_flags) {
|
||||
IWL_DEBUG_RADIO(mvm, "PPAG not enabled, command not sent.\n");
|
||||
return 0;
|
||||
}
|
||||
ret = iwl_read_ppag_table(&mvm->fwrt, &cmd, &cmd_size);
|
||||
if(ret < 0)
|
||||
return ret;
|
||||
|
||||
/* The 'flags' field is the same in v1 and in v2 so we can just
|
||||
* use v1 to access it.
|
||||
*/
|
||||
cmd.v1.flags = cpu_to_le32(mvm->fwrt.ppag_flags);
|
||||
cmd_ver = iwl_fw_lookup_cmd_ver(mvm->fw,
|
||||
WIDE_ID(PHY_OPS_GROUP, PER_PLATFORM_ANT_GAIN_CMD),
|
||||
IWL_FW_CMD_VER_UNKNOWN);
|
||||
if (cmd_ver == 1) {
|
||||
num_sub_bands = IWL_NUM_SUB_BANDS_V1;
|
||||
gain = cmd.v1.gain[0];
|
||||
cmd_size = sizeof(cmd.v1);
|
||||
if (mvm->fwrt.ppag_ver == 1 || mvm->fwrt.ppag_ver == 2) {
|
||||
IWL_DEBUG_RADIO(mvm,
|
||||
"PPAG table rev is %d but FW supports v1, sending truncated table\n",
|
||||
mvm->fwrt.ppag_ver);
|
||||
cmd.v1.flags &= cpu_to_le32(IWL_PPAG_ETSI_MASK);
|
||||
}
|
||||
} else if (cmd_ver == 2 || cmd_ver == 3) {
|
||||
num_sub_bands = IWL_NUM_SUB_BANDS_V2;
|
||||
gain = cmd.v2.gain[0];
|
||||
cmd_size = sizeof(cmd.v2);
|
||||
if (mvm->fwrt.ppag_ver == 0) {
|
||||
IWL_DEBUG_RADIO(mvm,
|
||||
"PPAG table is v1 but FW supports v2, sending padded table\n");
|
||||
} else if (cmd_ver == 2 && mvm->fwrt.ppag_ver == 2) {
|
||||
IWL_DEBUG_RADIO(mvm,
|
||||
"PPAG table is v3 but FW supports v2, sending partial bitmap.\n");
|
||||
cmd.v1.flags &= cpu_to_le32(IWL_PPAG_ETSI_MASK);
|
||||
}
|
||||
} else {
|
||||
IWL_DEBUG_RADIO(mvm, "Unsupported PPAG command version\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < IWL_NUM_CHAIN_LIMITS; i++) {
|
||||
for (j = 0; j < num_sub_bands; j++) {
|
||||
gain[i * num_sub_bands + j] =
|
||||
mvm->fwrt.ppag_chains[i].subbands[j];
|
||||
IWL_DEBUG_RADIO(mvm,
|
||||
"PPAG table: chain[%d] band[%d]: gain = %d\n",
|
||||
i, j, gain[i * num_sub_bands + j]);
|
||||
}
|
||||
}
|
||||
IWL_DEBUG_RADIO(mvm, "Sending PER_PLATFORM_ANT_GAIN_CMD\n");
|
||||
ret = iwl_mvm_send_cmd_pdu(mvm, WIDE_ID(PHY_OPS_GROUP,
|
||||
PER_PLATFORM_ANT_GAIN_CMD),
|
||||
@ -1151,40 +1029,11 @@ int iwl_mvm_ppag_send_cmd(struct iwl_mvm *mvm)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct dmi_system_id dmi_ppag_approved_list[] = {
|
||||
{ .ident = "HP",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "HP"),
|
||||
},
|
||||
},
|
||||
{ .ident = "SAMSUNG",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD"),
|
||||
},
|
||||
},
|
||||
{ .ident = "MSFT",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
|
||||
},
|
||||
},
|
||||
{ .ident = "ASUS",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTek COMPUTER INC."),
|
||||
},
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
static int iwl_mvm_ppag_init(struct iwl_mvm *mvm)
|
||||
{
|
||||
/* no need to read the table, done in INIT stage */
|
||||
if (!dmi_check_system(dmi_ppag_approved_list)) {
|
||||
IWL_DEBUG_RADIO(mvm,
|
||||
"System vendor '%s' is not in the approved list, disabling PPAG.\n",
|
||||
dmi_get_system_info(DMI_SYS_VENDOR));
|
||||
mvm->fwrt.ppag_flags = 0;
|
||||
if (!(iwl_acpi_is_ppag_approved(&mvm->fwrt)))
|
||||
return 0;
|
||||
}
|
||||
|
||||
return iwl_mvm_ppag_send_cmd(mvm);
|
||||
}
|
||||
@ -1411,7 +1260,7 @@ void iwl_mvm_get_acpi_tables(struct iwl_mvm *mvm)
|
||||
int ret;
|
||||
|
||||
/* read PPAG table */
|
||||
ret = iwl_mvm_get_ppag_table(mvm);
|
||||
ret = iwl_acpi_get_ppag_table(&mvm->fwrt);
|
||||
if (ret < 0) {
|
||||
IWL_DEBUG_RADIO(mvm,
|
||||
"PPAG BIOS table invalid or unavailable. (%d)\n",
|
||||
@ -1794,7 +1643,7 @@ int iwl_mvm_up(struct iwl_mvm *mvm)
|
||||
ret = iwl_mvm_sar_init(mvm);
|
||||
if (ret == 0)
|
||||
ret = iwl_mvm_sar_geo_init(mvm);
|
||||
else if (ret < 0)
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
|
||||
ret = iwl_mvm_sgom_init(mvm);
|
||||
|
@ -63,79 +63,6 @@ static const struct ieee80211_iface_combination iwl_mvm_iface_combinations[] = {
|
||||
},
|
||||
};
|
||||
|
||||
#ifdef CONFIG_IWLWIFI_BCAST_FILTERING
|
||||
/*
|
||||
* Use the reserved field to indicate magic values.
|
||||
* these values will only be used internally by the driver,
|
||||
* and won't make it to the fw (reserved will be 0).
|
||||
* BC_FILTER_MAGIC_IP - configure the val of this attribute to
|
||||
* be the vif's ip address. in case there is not a single
|
||||
* ip address (0, or more than 1), this attribute will
|
||||
* be skipped.
|
||||
* BC_FILTER_MAGIC_MAC - set the val of this attribute to
|
||||
* the LSB bytes of the vif's mac address
|
||||
*/
|
||||
enum {
|
||||
BC_FILTER_MAGIC_NONE = 0,
|
||||
BC_FILTER_MAGIC_IP,
|
||||
BC_FILTER_MAGIC_MAC,
|
||||
};
|
||||
|
||||
static const struct iwl_fw_bcast_filter iwl_mvm_default_bcast_filters[] = {
|
||||
{
|
||||
/* arp */
|
||||
.discard = 0,
|
||||
.frame_type = BCAST_FILTER_FRAME_TYPE_ALL,
|
||||
.attrs = {
|
||||
{
|
||||
/* frame type - arp, hw type - ethernet */
|
||||
.offset_type =
|
||||
BCAST_FILTER_OFFSET_PAYLOAD_START,
|
||||
.offset = sizeof(rfc1042_header),
|
||||
.val = cpu_to_be32(0x08060001),
|
||||
.mask = cpu_to_be32(0xffffffff),
|
||||
},
|
||||
{
|
||||
/* arp dest ip */
|
||||
.offset_type =
|
||||
BCAST_FILTER_OFFSET_PAYLOAD_START,
|
||||
.offset = sizeof(rfc1042_header) + 2 +
|
||||
sizeof(struct arphdr) +
|
||||
ETH_ALEN + sizeof(__be32) +
|
||||
ETH_ALEN,
|
||||
.mask = cpu_to_be32(0xffffffff),
|
||||
/* mark it as special field */
|
||||
.reserved1 = cpu_to_le16(BC_FILTER_MAGIC_IP),
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
/* dhcp offer bcast */
|
||||
.discard = 0,
|
||||
.frame_type = BCAST_FILTER_FRAME_TYPE_IPV4,
|
||||
.attrs = {
|
||||
{
|
||||
/* udp dest port - 68 (bootp client)*/
|
||||
.offset_type = BCAST_FILTER_OFFSET_IP_END,
|
||||
.offset = offsetof(struct udphdr, dest),
|
||||
.val = cpu_to_be32(0x00440000),
|
||||
.mask = cpu_to_be32(0xffff0000),
|
||||
},
|
||||
{
|
||||
/* dhcp - lsb bytes of client hw address */
|
||||
.offset_type = BCAST_FILTER_OFFSET_IP_END,
|
||||
.offset = 38,
|
||||
.mask = cpu_to_be32(0xffffffff),
|
||||
/* mark it as special field */
|
||||
.reserved1 = cpu_to_le16(BC_FILTER_MAGIC_MAC),
|
||||
},
|
||||
},
|
||||
},
|
||||
/* last filter must be empty */
|
||||
{},
|
||||
};
|
||||
#endif
|
||||
|
||||
static const struct cfg80211_pmsr_capabilities iwl_mvm_pmsr_capa = {
|
||||
.max_peers = IWL_MVM_TOF_MAX_APS,
|
||||
.report_ap_tsf = 1,
|
||||
@ -307,7 +234,6 @@ static const u8 he_if_types_ext_capa_sta[] = {
|
||||
[0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
|
||||
[2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
|
||||
[7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
|
||||
[9] = WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT,
|
||||
};
|
||||
|
||||
static const struct wiphy_iftype_ext_capab he_iftypes_ext_capa[] = {
|
||||
@ -456,28 +382,6 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
|
||||
hw->wiphy->n_cipher_suites++;
|
||||
}
|
||||
|
||||
/* currently FW API supports only one optional cipher scheme */
|
||||
if (mvm->fw->cs[0].cipher) {
|
||||
const struct iwl_fw_cipher_scheme *fwcs = &mvm->fw->cs[0];
|
||||
struct ieee80211_cipher_scheme *cs = &mvm->cs[0];
|
||||
|
||||
mvm->hw->n_cipher_schemes = 1;
|
||||
|
||||
cs->cipher = le32_to_cpu(fwcs->cipher);
|
||||
cs->iftype = BIT(NL80211_IFTYPE_STATION);
|
||||
cs->hdr_len = fwcs->hdr_len;
|
||||
cs->pn_len = fwcs->pn_len;
|
||||
cs->pn_off = fwcs->pn_off;
|
||||
cs->key_idx_off = fwcs->key_idx_off;
|
||||
cs->key_idx_mask = fwcs->key_idx_mask;
|
||||
cs->key_idx_shift = fwcs->key_idx_shift;
|
||||
cs->mic_len = fwcs->mic_len;
|
||||
|
||||
mvm->hw->cipher_schemes = mvm->cs;
|
||||
mvm->ciphers[hw->wiphy->n_cipher_suites] = cs->cipher;
|
||||
hw->wiphy->n_cipher_suites++;
|
||||
}
|
||||
|
||||
if (fw_has_capa(&mvm->fw->ucode_capa,
|
||||
IWL_UCODE_TLV_CAPA_FTM_CALIBRATED)) {
|
||||
wiphy_ext_feature_set(hw->wiphy,
|
||||
@ -698,11 +602,6 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_IWLWIFI_BCAST_FILTERING
|
||||
/* assign default bcast filtering configuration */
|
||||
mvm->bcast_filters = iwl_mvm_default_bcast_filters;
|
||||
#endif
|
||||
|
||||
ret = iwl_mvm_leds_init(mvm);
|
||||
if (ret)
|
||||
return ret;
|
||||
@ -1344,7 +1243,9 @@ static int iwl_mvm_set_tx_power(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||
if (tx_power == IWL_DEFAULT_MAX_TX_POWER)
|
||||
cmd.common.pwr_restriction = cpu_to_le16(IWL_DEV_MAX_TX_POWER);
|
||||
|
||||
if (cmd_ver == 6)
|
||||
if (cmd_ver == 7)
|
||||
len = sizeof(cmd.v7);
|
||||
else if (cmd_ver == 6)
|
||||
len = sizeof(cmd.v6);
|
||||
else if (fw_has_api(&mvm->fw->ucode_capa,
|
||||
IWL_UCODE_TLV_API_REDUCE_TX_POWER))
|
||||
@ -1884,162 +1785,6 @@ static void iwl_mvm_config_iface_filter(struct ieee80211_hw *hw,
|
||||
mutex_unlock(&mvm->mutex);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_IWLWIFI_BCAST_FILTERING
|
||||
struct iwl_bcast_iter_data {
|
||||
struct iwl_mvm *mvm;
|
||||
struct iwl_bcast_filter_cmd *cmd;
|
||||
u8 current_filter;
|
||||
};
|
||||
|
||||
static void
|
||||
iwl_mvm_set_bcast_filter(struct ieee80211_vif *vif,
|
||||
const struct iwl_fw_bcast_filter *in_filter,
|
||||
struct iwl_fw_bcast_filter *out_filter)
|
||||
{
|
||||
struct iwl_fw_bcast_filter_attr *attr;
|
||||
int i;
|
||||
|
||||
memcpy(out_filter, in_filter, sizeof(*out_filter));
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(out_filter->attrs); i++) {
|
||||
attr = &out_filter->attrs[i];
|
||||
|
||||
if (!attr->mask)
|
||||
break;
|
||||
|
||||
switch (attr->reserved1) {
|
||||
case cpu_to_le16(BC_FILTER_MAGIC_IP):
|
||||
if (vif->bss_conf.arp_addr_cnt != 1) {
|
||||
attr->mask = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
attr->val = vif->bss_conf.arp_addr_list[0];
|
||||
break;
|
||||
case cpu_to_le16(BC_FILTER_MAGIC_MAC):
|
||||
attr->val = *(__be32 *)&vif->addr[2];
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
attr->reserved1 = 0;
|
||||
out_filter->num_attrs++;
|
||||
}
|
||||
}
|
||||
|
||||
static void iwl_mvm_bcast_filter_iterator(void *_data, u8 *mac,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
struct iwl_bcast_iter_data *data = _data;
|
||||
struct iwl_mvm *mvm = data->mvm;
|
||||
struct iwl_bcast_filter_cmd *cmd = data->cmd;
|
||||
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
|
||||
struct iwl_fw_bcast_mac *bcast_mac;
|
||||
int i;
|
||||
|
||||
if (WARN_ON(mvmvif->id >= ARRAY_SIZE(cmd->macs)))
|
||||
return;
|
||||
|
||||
bcast_mac = &cmd->macs[mvmvif->id];
|
||||
|
||||
/*
|
||||
* enable filtering only for associated stations, but not for P2P
|
||||
* Clients
|
||||
*/
|
||||
if (vif->type != NL80211_IFTYPE_STATION || vif->p2p ||
|
||||
!vif->bss_conf.assoc)
|
||||
return;
|
||||
|
||||
bcast_mac->default_discard = 1;
|
||||
|
||||
/* copy all configured filters */
|
||||
for (i = 0; mvm->bcast_filters[i].attrs[0].mask; i++) {
|
||||
/*
|
||||
* Make sure we don't exceed our filters limit.
|
||||
* if there is still a valid filter to be configured,
|
||||
* be on the safe side and just allow bcast for this mac.
|
||||
*/
|
||||
if (WARN_ON_ONCE(data->current_filter >=
|
||||
ARRAY_SIZE(cmd->filters))) {
|
||||
bcast_mac->default_discard = 0;
|
||||
bcast_mac->attached_filters = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
iwl_mvm_set_bcast_filter(vif,
|
||||
&mvm->bcast_filters[i],
|
||||
&cmd->filters[data->current_filter]);
|
||||
|
||||
/* skip current filter if it contains no attributes */
|
||||
if (!cmd->filters[data->current_filter].num_attrs)
|
||||
continue;
|
||||
|
||||
/* attach the filter to current mac */
|
||||
bcast_mac->attached_filters |=
|
||||
cpu_to_le16(BIT(data->current_filter));
|
||||
|
||||
data->current_filter++;
|
||||
}
|
||||
}
|
||||
|
||||
bool iwl_mvm_bcast_filter_build_cmd(struct iwl_mvm *mvm,
|
||||
struct iwl_bcast_filter_cmd *cmd)
|
||||
{
|
||||
struct iwl_bcast_iter_data iter_data = {
|
||||
.mvm = mvm,
|
||||
.cmd = cmd,
|
||||
};
|
||||
|
||||
if (IWL_MVM_FW_BCAST_FILTER_PASS_ALL)
|
||||
return false;
|
||||
|
||||
memset(cmd, 0, sizeof(*cmd));
|
||||
cmd->max_bcast_filters = ARRAY_SIZE(cmd->filters);
|
||||
cmd->max_macs = ARRAY_SIZE(cmd->macs);
|
||||
|
||||
#ifdef CONFIG_IWLWIFI_DEBUGFS
|
||||
/* use debugfs filters/macs if override is configured */
|
||||
if (mvm->dbgfs_bcast_filtering.override) {
|
||||
memcpy(cmd->filters, &mvm->dbgfs_bcast_filtering.cmd.filters,
|
||||
sizeof(cmd->filters));
|
||||
memcpy(cmd->macs, &mvm->dbgfs_bcast_filtering.cmd.macs,
|
||||
sizeof(cmd->macs));
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* if no filters are configured, do nothing */
|
||||
if (!mvm->bcast_filters)
|
||||
return false;
|
||||
|
||||
/* configure and attach these filters for each associated sta vif */
|
||||
ieee80211_iterate_active_interfaces(
|
||||
mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
|
||||
iwl_mvm_bcast_filter_iterator, &iter_data);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static int iwl_mvm_configure_bcast_filter(struct iwl_mvm *mvm)
|
||||
{
|
||||
struct iwl_bcast_filter_cmd cmd;
|
||||
|
||||
if (!(mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_BCAST_FILTERING))
|
||||
return 0;
|
||||
|
||||
if (!iwl_mvm_bcast_filter_build_cmd(mvm, &cmd))
|
||||
return 0;
|
||||
|
||||
return iwl_mvm_send_cmd_pdu(mvm, BCAST_FILTER_CMD, 0,
|
||||
sizeof(cmd), &cmd);
|
||||
}
|
||||
#else
|
||||
static inline int iwl_mvm_configure_bcast_filter(struct iwl_mvm *mvm)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int iwl_mvm_update_mu_groups(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
@ -2636,7 +2381,6 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
|
||||
}
|
||||
|
||||
iwl_mvm_recalc_multicast(mvm);
|
||||
iwl_mvm_configure_bcast_filter(mvm);
|
||||
|
||||
/* reset rssi values */
|
||||
mvmvif->bf_data.ave_beacon_signal = 0;
|
||||
@ -2683,11 +2427,6 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
|
||||
}
|
||||
}
|
||||
|
||||
if (changes & BSS_CHANGED_ARP_FILTER) {
|
||||
IWL_DEBUG_MAC80211(mvm, "arp filter changed\n");
|
||||
iwl_mvm_configure_bcast_filter(mvm);
|
||||
}
|
||||
|
||||
if (changes & BSS_CHANGED_BANDWIDTH)
|
||||
iwl_mvm_apply_fw_smps_request(vif);
|
||||
}
|
||||
@ -3767,12 +3506,7 @@ static int __iwl_mvm_mac_set_key(struct ieee80211_hw *hw,
|
||||
/* support HW crypto on TX */
|
||||
return 0;
|
||||
default:
|
||||
/* currently FW supports only one optional cipher scheme */
|
||||
if (hw->n_cipher_schemes &&
|
||||
hw->cipher_schemes->cipher == key->cipher)
|
||||
key->flags |= IEEE80211_KEY_FLAG_PUT_IV_SPACE;
|
||||
else
|
||||
return -EOPNOTSUPP;
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
switch (cmd) {
|
||||
|
@ -892,17 +892,6 @@ struct iwl_mvm {
|
||||
/* rx chain antennas set through debugfs for the scan command */
|
||||
u8 scan_rx_ant;
|
||||
|
||||
#ifdef CONFIG_IWLWIFI_BCAST_FILTERING
|
||||
/* broadcast filters to configure for each associated station */
|
||||
const struct iwl_fw_bcast_filter *bcast_filters;
|
||||
#ifdef CONFIG_IWLWIFI_DEBUGFS
|
||||
struct {
|
||||
bool override;
|
||||
struct iwl_bcast_filter_cmd cmd;
|
||||
} dbgfs_bcast_filtering;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Internal station */
|
||||
struct iwl_mvm_int_sta aux_sta;
|
||||
struct iwl_mvm_int_sta snif_sta;
|
||||
@ -1083,7 +1072,6 @@ struct iwl_mvm {
|
||||
|
||||
|
||||
u32 ciphers[IWL_MVM_NUM_CIPHERS];
|
||||
struct ieee80211_cipher_scheme cs[IWL_UCODE_MAX_CS];
|
||||
|
||||
struct cfg80211_ftm_responder_stats ftm_resp_stats;
|
||||
struct {
|
||||
@ -1602,8 +1590,6 @@ int iwl_mvm_up(struct iwl_mvm *mvm);
|
||||
int iwl_mvm_load_d3_fw(struct iwl_mvm *mvm);
|
||||
|
||||
int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm);
|
||||
bool iwl_mvm_bcast_filter_build_cmd(struct iwl_mvm *mvm,
|
||||
struct iwl_bcast_filter_cmd *cmd);
|
||||
|
||||
/*
|
||||
* FW notifications / CMD responses handlers
|
||||
@ -2233,7 +2219,7 @@ static inline void iwl_mvm_mei_device_down(struct iwl_mvm *mvm)
|
||||
static inline void iwl_mvm_mei_set_sw_rfkill_state(struct iwl_mvm *mvm)
|
||||
{
|
||||
bool sw_rfkill =
|
||||
mvm->hw_registered ? rfkill_blocked(mvm->hw->wiphy->rfkill) : false;
|
||||
mvm->hw_registered ? rfkill_soft_blocked(mvm->hw->wiphy->rfkill) : false;
|
||||
|
||||
if (mvm->mei_registered)
|
||||
iwl_mei_set_rfkill_state(iwl_mvm_is_radio_killed(mvm),
|
||||
|
@ -497,7 +497,6 @@ static const struct iwl_hcmd_names iwl_mvm_legacy_names[] = {
|
||||
HCMD_NAME(MCC_CHUB_UPDATE_CMD),
|
||||
HCMD_NAME(MARKER_CMD),
|
||||
HCMD_NAME(BT_PROFILE_NOTIFICATION),
|
||||
HCMD_NAME(BCAST_FILTER_CMD),
|
||||
HCMD_NAME(MCAST_FILTER_CMD),
|
||||
HCMD_NAME(REPLY_SF_CFG_CMD),
|
||||
HCMD_NAME(REPLY_BEACON_FILTERING_CMD),
|
||||
|
@ -1427,7 +1427,7 @@ static void iwl_mvm_hwrate_to_tx_status(const struct iwl_fw *fw,
|
||||
struct ieee80211_tx_rate *r = &info->status.rates[0];
|
||||
|
||||
if (iwl_fw_lookup_notif_ver(fw, LONG_GROUP,
|
||||
TX_CMD, 0) > 6)
|
||||
TX_CMD, 0) <= 6)
|
||||
rate_n_flags = iwl_new_rate_from_v1(rate_n_flags);
|
||||
|
||||
info->status.antenna =
|
||||
|
@ -1,6 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
/*
|
||||
* Copyright (C) 2018-2021 Intel Corporation
|
||||
* Copyright (C) 2018-2022 Intel Corporation
|
||||
*/
|
||||
#include "iwl-trans.h"
|
||||
#include "iwl-fh.h"
|
||||
@ -125,6 +125,9 @@ int iwl_pcie_ctxt_info_gen3_init(struct iwl_trans *trans,
|
||||
control_flags |= IWL_PRPH_SCRATCH_MTR_MODE;
|
||||
control_flags |= IWL_PRPH_MTR_FORMAT_256B & IWL_PRPH_SCRATCH_MTR_FORMAT;
|
||||
|
||||
if (trans->trans_cfg->imr_enabled)
|
||||
control_flags |= IWL_PRPH_SCRATCH_IMR_DEBUG_EN;
|
||||
|
||||
/* initialize RX default queue */
|
||||
prph_sc_ctrl->rbd_cfg.free_rbd_addr =
|
||||
cpu_to_le64(trans_pcie->rxq->bd_dma);
|
||||
|
@ -491,9 +491,10 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
|
||||
/* So devices */
|
||||
{IWL_PCI_DEVICE(0x2725, PCI_ANY_ID, iwl_so_trans_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2726, PCI_ANY_ID, iwl_snj_trans_cfg)},
|
||||
{IWL_PCI_DEVICE(0x7A70, PCI_ANY_ID, iwl_so_long_latency_trans_cfg)},
|
||||
{IWL_PCI_DEVICE(0x7A70, PCI_ANY_ID, iwl_so_long_latency_imr_trans_cfg)},
|
||||
{IWL_PCI_DEVICE(0x7AF0, PCI_ANY_ID, iwl_so_trans_cfg)},
|
||||
{IWL_PCI_DEVICE(0x51F0, PCI_ANY_ID, iwl_so_long_latency_trans_cfg)},
|
||||
{IWL_PCI_DEVICE(0x51F1, PCI_ANY_ID, iwl_so_long_latency_imr_trans_cfg)},
|
||||
{IWL_PCI_DEVICE(0x54F0, PCI_ANY_ID, iwl_so_long_latency_trans_cfg)},
|
||||
{IWL_PCI_DEVICE(0x7F70, PCI_ANY_ID, iwl_so_trans_cfg)},
|
||||
|
||||
|
@ -388,8 +388,7 @@ int iwl_trans_pcie_gen2_start_fw(struct iwl_trans *trans,
|
||||
/* This may fail if AMT took ownership of the device */
|
||||
if (iwl_pcie_prepare_card_hw(trans)) {
|
||||
IWL_WARN(trans, "Exit HW not ready\n");
|
||||
ret = -EIO;
|
||||
goto out;
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
iwl_enable_rfkill_int(trans);
|
||||
|
@ -1139,7 +1139,7 @@ static const struct iwl_causes_list causes_list_pre_bz[] = {
|
||||
};
|
||||
|
||||
static const struct iwl_causes_list causes_list_bz[] = {
|
||||
{MSIX_HW_INT_CAUSES_REG_SW_ERR_BZ, CSR_MSIX_HW_INT_MASK_AD, 0x29},
|
||||
{MSIX_HW_INT_CAUSES_REG_SW_ERR_BZ, CSR_MSIX_HW_INT_MASK_AD, 0x15},
|
||||
};
|
||||
|
||||
static void iwl_pcie_map_list(struct iwl_trans *trans,
|
||||
@ -1356,8 +1356,7 @@ static int iwl_trans_pcie_start_fw(struct iwl_trans *trans,
|
||||
/* This may fail if AMT took ownership of the device */
|
||||
if (iwl_pcie_prepare_card_hw(trans)) {
|
||||
IWL_WARN(trans, "Exit HW not ready\n");
|
||||
ret = -EIO;
|
||||
goto out;
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
iwl_enable_rfkill_int(trans);
|
||||
|
@ -1206,6 +1206,10 @@ int iwl_txq_dyn_alloc(struct iwl_trans *trans, u32 flags, u32 sta_mask,
|
||||
};
|
||||
int ret;
|
||||
|
||||
if (trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_BZ &&
|
||||
trans->hw_rev_step == SILICON_A_STEP)
|
||||
size = 4096;
|
||||
|
||||
txq = iwl_txq_dyn_alloc_dma(trans, size, timeout);
|
||||
if (IS_ERR(txq))
|
||||
return PTR_ERR(txq);
|
||||
|
@ -44,7 +44,6 @@ CFLAGS+= -DCONFIG_IWLMVM=1
|
||||
#CFLAGS+= -DCONFIG_ACPI=1
|
||||
#CFLAGS+= -DCONFIG_INET=1 # Need LKPI TSO implementation.
|
||||
#CFLAGS+= -DCONFIG_IPV6=1
|
||||
#CFLAGS+= -DCONFIG_IWLWIFI_BCAST_FILTERING=1
|
||||
CFLAGS+= -DCONFIG_IWLWIFI_DEBUG=1
|
||||
#CFLAGS+= -DCONFIG_IWLWIFI_DEBUGFS=1
|
||||
#CFLAGS+= -DCONFIG_IWLWIFI_LEDS=1
|
||||
|
Loading…
Reference in New Issue
Block a user