mirror of
https://github.com/torvalds/linux.git
synced 2026-06-01 02:53:36 +02:00
An additional set of patches intended for v6.2.
It contains: * Adjustments for the new HW * Adjustments for FW API update * A few small fixes and cleanups * Improvements for debug dumps mechanism -----BEGIN PGP SIGNATURE----- iQJPBAABCAA5FiEE9cg2NujikJ5EMZusCDCCYA5zdzwFAmOQtIcbHGdyZWdvcnku Z3JlZW5tYW5AaW50ZWwuY29tAAoJEAgwgmAOc3c8FuoP/1BvraKBW1XB6IEv00jF 77EEUGdOoetJNxpSitNdXPv7zr7K/nd88FTRkktFmE0F6h0egADl7ZGsMrJ5FFJ4 b1EHTH/HoZa3TfaaxUyOZrk0icsO+vsQ2hXiiVWqLMdpo6pg8ydMSPiFhShaJWK9 JfZao6htS2HKo4h8SoVlxcpxOcifvZxmdDqEEsAmqOtTLTsoiszBoWuUWE/OTdg2 mjA9jH9M8DvwijbHOjuqBB4+DHjjwNq2yJs1nF3jaFRpw+Z/lkI2CWO25Cm34r7f 5PujYBbmGAVlKxeAjR4A90VKH3eWbjCKLn4aBNNUsm0FOiZ7AwMCqnatwDcvfBNl GPZBC4tGH0ts9fwmKo06jbZb/G1Yue4pQ0pWep3S7LBUwgtyGdVoGqNPDPOzHft3 28g7/GN8GnVaEQ5Vy8IiwCIaLdm2kWEYl8kEYLBR6Yfd1mrcV1QTDGibBgjxIi2J qUphuW/YRzl/0tQTTjKUXb6yBQrGlMs4zd2kcsbvzWpi/LSHVXxaCcJrnuKxDkEs rRb+UNEdqNluUGqZehnUXOAxniXXBwxk/S03nRxCpLKBFDf2OPasWgmSjjOleQKb d73Yfmyhvp/pbLUMWVFondSRuhEEX7aU3SWBKuP5HEHYVei2p/wPxpealfruvPzZ mDUbwksqorojs8f32nVc1eJ6 =b+L+ -----END PGP SIGNATURE----- Merge tag 'iwlwifi-next-for-kalle-2022-12-07' of http://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-next An additional set of patches intended for v6.2. It contains: * Adjustments for the new HW * Adjustments for FW API update * A few small fixes and cleanups * Improvements for debug dumps mechanism
This commit is contained in:
commit
832c3f66f5
|
|
@ -382,9 +382,11 @@ enum iwl_scd_queue_cfg_operation {
|
|||
* @u.add.cb_size: size code
|
||||
* @u.add.bc_dram_addr: byte-count table IOVA
|
||||
* @u.add.tfdq_dram_addr: TFD queue IOVA
|
||||
* @u.remove.queue: queue ID for removal
|
||||
* @u.modify.sta_mask: new station mask for modify
|
||||
* @u.modify.queue: queue ID to modify
|
||||
* @u.remove.sta_mask: station mask of queue to remove
|
||||
* @u.remove.tid: TID of queue to remove
|
||||
* @u.modify.old_sta_mask: old station mask for modify
|
||||
* @u.modify.tid: TID of queue to modify
|
||||
* @u.modify.new_sta_mask: new station mask for modify
|
||||
*/
|
||||
struct iwl_scd_queue_cfg_cmd {
|
||||
__le32 operation;
|
||||
|
|
@ -399,11 +401,13 @@ struct iwl_scd_queue_cfg_cmd {
|
|||
__le64 tfdq_dram_addr;
|
||||
} __packed add; /* TX_QUEUE_CFG_CMD_ADD_API_S_VER_1 */
|
||||
struct {
|
||||
__le32 queue;
|
||||
__le32 sta_mask;
|
||||
__le32 tid;
|
||||
} __packed remove; /* TX_QUEUE_CFG_CMD_REMOVE_API_S_VER_1 */
|
||||
struct {
|
||||
__le32 sta_mask;
|
||||
__le32 queue;
|
||||
__le32 old_sta_mask;
|
||||
__le32 tid;
|
||||
__le32 new_sta_mask;
|
||||
} __packed modify; /* TX_QUEUE_CFG_CMD_MODIFY_API_S_VER_1 */
|
||||
} __packed u; /* TX_QUEUE_CFG_CMD_OPERATION_API_U_VER_1 */
|
||||
} __packed; /* TX_QUEUE_CFG_CMD_API_S_VER_3 */
|
||||
|
|
|
|||
|
|
@ -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
|
||||
*/
|
||||
|
|
@ -157,7 +157,8 @@ static void iwl_fwrt_dump_lmac_error_log(struct iwl_fw_runtime *fwrt, u8 lmac_nu
|
|||
base = fwrt->fw->inst_errlog_ptr;
|
||||
}
|
||||
|
||||
if (base < 0x400000) {
|
||||
if ((fwrt->trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_BZ && !base) ||
|
||||
(fwrt->trans->trans_cfg->device_family < IWL_DEVICE_FAMILY_BZ && base < 0x400000)) {
|
||||
IWL_ERR(fwrt,
|
||||
"Not valid error log pointer 0x%08X for %s uCode\n",
|
||||
base,
|
||||
|
|
@ -376,7 +377,7 @@ static void iwl_fwrt_dump_iml_error_log(struct iwl_fw_runtime *fwrt)
|
|||
return;
|
||||
}
|
||||
|
||||
error = iwl_read_umac_prph(trans, UMAG_SB_CPU_2_STATUS);
|
||||
error = iwl_read_umac_prph(trans, error);
|
||||
|
||||
IWL_ERR(trans, "IML/ROM dump:\n");
|
||||
|
||||
|
|
|
|||
|
|
@ -1964,6 +1964,8 @@ struct iwl_nvm_data *iwl_get_nvm(struct iwl_trans *trans,
|
|||
!!(mac_flags & NVM_MAC_SKU_FLAGS_BAND_5_2_ENABLED);
|
||||
nvm->sku_cap_mimo_disabled =
|
||||
!!(mac_flags & NVM_MAC_SKU_FLAGS_MIMO_DISABLED);
|
||||
if (CSR_HW_RFID_TYPE(trans->hw_rf_id) == IWL_CFG_RF_TYPE_FM)
|
||||
nvm->sku_cap_11be_enable = true;
|
||||
|
||||
/* Initialize PHY sku data */
|
||||
nvm->valid_tx_ant = (u8)le32_to_cpu(rsp->phy_sku.tx_chains);
|
||||
|
|
|
|||
|
|
@ -976,6 +976,8 @@ struct iwl_trans_txqs {
|
|||
* @max_skb_frags: maximum number of fragments an SKB can have when transmitted.
|
||||
* 0 indicates that frag SKBs (NETIF_F_SG) aren't supported.
|
||||
* @hw_rf_id a u32 with the device RF ID
|
||||
* @hw_crf_id a u32 with the device CRF ID
|
||||
* @hw_cdb_id a u32 with the device CDB ID
|
||||
* @hw_id: a u32 with the ID of the device / sub-device.
|
||||
* Set during transport allocation.
|
||||
* @hw_id_str: a string with info about HW ID. Set during transport allocation.
|
||||
|
|
@ -1015,6 +1017,8 @@ struct iwl_trans {
|
|||
u32 hw_rev;
|
||||
u32 hw_rev_step;
|
||||
u32 hw_rf_id;
|
||||
u32 hw_crf_id;
|
||||
u32 hw_cdb_id;
|
||||
u32 hw_id;
|
||||
char hw_id_str[52];
|
||||
u32 sku_id[3];
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (C) 2021 Intel Corporation
|
||||
*/
|
||||
|
|
@ -13,7 +13,7 @@
|
|||
/**
|
||||
* DOC: Introduction
|
||||
*
|
||||
* iwlmei is the kernel module that is in charge of the commnunication between
|
||||
* iwlmei is the kernel module that is in charge of the communication between
|
||||
* the iwlwifi driver and the CSME firmware's WLAN driver. This communication
|
||||
* uses the SAP protocol defined in another file.
|
||||
* iwlwifi can request or release ownership on the WiFi device through iwlmei.
|
||||
|
|
@ -348,7 +348,7 @@ void iwl_mei_set_rfkill_state(bool hw_rfkill, bool sw_rfkill);
|
|||
/**
|
||||
* iwl_mei_set_nic_info() - set mac address
|
||||
* @mac_address: mac address to set
|
||||
* @nvm_address: NVM mac adsress to set
|
||||
* @nvm_address: NVM mac address to set
|
||||
*
|
||||
* This function must be called upon mac address change.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -1963,7 +1963,7 @@ static int iwl_mei_probe(struct mei_cl_device *cldev,
|
|||
iwl_mei_dbgfs_register(mei);
|
||||
|
||||
/*
|
||||
* We now have a Rx function in place, start the SAP procotol
|
||||
* We now have a Rx function in place, start the SAP protocol
|
||||
* we expect to get the SAP_ME_MSG_START_OK response later on.
|
||||
*/
|
||||
mutex_lock(&iwl_mei_mutex);
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (C) 2021 - 2022 Intel Corporation
|
||||
*/
|
||||
|
|
@ -25,7 +25,7 @@
|
|||
*
|
||||
* Since this messaging system cannot support high amounts of
|
||||
* traffic, iwlwifi and the CSME firmware's WLAN driver have an
|
||||
* addtional communication pipe to exchange information. The body
|
||||
* additional communication pipe to exchange information. The body
|
||||
* of the message is copied to a shared area and the message that
|
||||
* goes over the ME interface just signals the other side
|
||||
* that a new message is waiting in the shared area. The ME
|
||||
|
|
@ -55,7 +55,7 @@
|
|||
/**
|
||||
* DOC: Host and driver state messages
|
||||
*
|
||||
* In order to let CSME konw about the host state and the host driver state,
|
||||
* In order to let CSME know about the host state and the host driver state,
|
||||
* the host sends messages that let CSME know about the host's state.
|
||||
* When the host driver is loaded, the host sends %SAP_MSG_NOTIF_WIFIDR_UP.
|
||||
* When the host driver is unloaded, the host sends %SAP_MSG_NOTIF_WIFIDR_DOWN.
|
||||
|
|
@ -76,7 +76,7 @@
|
|||
* DOC: Ownership
|
||||
*
|
||||
* The device can be controlled either by the CSME firmware or
|
||||
* by the host driver: iwlwifi. There is a negotiaion between
|
||||
* by the host driver: iwlwifi. There is a negotiation between
|
||||
* those two entities to determine who controls (or owns) the
|
||||
* device. Since the CSME can control the device even when the
|
||||
* OS is not working or even missing, the CSME can request the
|
||||
|
|
@ -136,7 +136,7 @@ enum iwl_sap_me_msg_id {
|
|||
* struct iwl_sap_me_msg_hdr - the header of the ME message
|
||||
* @type: the type of the message, see &enum iwl_sap_me_msg_id.
|
||||
* @seq_num: a sequence number used for debug only.
|
||||
* @len: the length of the mssage.
|
||||
* @len: the length of the message.
|
||||
*/
|
||||
struct iwl_sap_me_msg_hdr {
|
||||
__le32 type;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright(c) 2021 Intel Corporation
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright(c) 2021 Intel Corporation
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -599,6 +599,11 @@ static void iwl_mvm_wowlan_gtk_type_iter(struct ieee80211_hw *hw,
|
|||
switch (key->cipher) {
|
||||
default:
|
||||
return;
|
||||
case WLAN_CIPHER_SUITE_TKIP:
|
||||
if (!sta)
|
||||
data->kek_kck_cmd->gtk_cipher =
|
||||
cpu_to_le32(STA_KEY_FLG_TKIP);
|
||||
return;
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_256:
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_128:
|
||||
data->kek_kck_cmd->igtk_cipher = cpu_to_le32(STA_KEY_FLG_GCMP);
|
||||
|
|
@ -610,13 +615,13 @@ static void iwl_mvm_wowlan_gtk_type_iter(struct ieee80211_hw *hw,
|
|||
if (!sta)
|
||||
data->kek_kck_cmd->gtk_cipher =
|
||||
cpu_to_le32(STA_KEY_FLG_CCM);
|
||||
break;
|
||||
return;
|
||||
case WLAN_CIPHER_SUITE_GCMP:
|
||||
case WLAN_CIPHER_SUITE_GCMP_256:
|
||||
if (!sta)
|
||||
data->kek_kck_cmd->gtk_cipher =
|
||||
cpu_to_le32(STA_KEY_FLG_GCMP);
|
||||
break;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1010,11 +1010,10 @@ static int iwl_mvm_ftm_range_resp_valid(struct iwl_mvm *mvm, u8 request_id,
|
|||
static void iwl_mvm_ftm_rtt_smoothing(struct iwl_mvm *mvm,
|
||||
struct cfg80211_pmsr_result *res)
|
||||
{
|
||||
struct iwl_mvm_smooth_entry *resp;
|
||||
struct iwl_mvm_smooth_entry *resp = NULL, *iter;
|
||||
s64 rtt_avg, rtt = res->ftm.rtt_avg;
|
||||
u32 undershoot, overshoot;
|
||||
u8 alpha;
|
||||
bool found;
|
||||
|
||||
if (!IWL_MVM_FTM_INITIATOR_ENABLE_SMOOTH)
|
||||
return;
|
||||
|
|
@ -1028,15 +1027,14 @@ static void iwl_mvm_ftm_rtt_smoothing(struct iwl_mvm *mvm,
|
|||
return;
|
||||
}
|
||||
|
||||
found = false;
|
||||
list_for_each_entry(resp, &mvm->ftm_initiator.smooth.resp, list) {
|
||||
if (!memcmp(res->addr, resp->addr, ETH_ALEN)) {
|
||||
found = true;
|
||||
list_for_each_entry(iter, &mvm->ftm_initiator.smooth.resp, list) {
|
||||
if (!memcmp(res->addr, iter->addr, ETH_ALEN)) {
|
||||
resp = iter;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
if (!resp) {
|
||||
resp = kzalloc(sizeof(*resp), GFP_KERNEL);
|
||||
if (!resp)
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -122,6 +122,9 @@ static bool iwl_alive_fn(struct iwl_notif_wait_data *notif_wait,
|
|||
u32 version = iwl_fw_lookup_notif_ver(mvm->fw, LEGACY_GROUP,
|
||||
UCODE_ALIVE_NTFY, 0);
|
||||
u32 i;
|
||||
struct iwl_trans *trans = mvm->trans;
|
||||
enum iwl_device_family device_family = trans->trans_cfg->device_family;
|
||||
|
||||
|
||||
if (version == 6) {
|
||||
struct iwl_alive_ntf_v6 *palive;
|
||||
|
|
@ -230,7 +233,8 @@ static bool iwl_alive_fn(struct iwl_notif_wait_data *notif_wait,
|
|||
|
||||
if (umac_error_table) {
|
||||
if (umac_error_table >=
|
||||
mvm->trans->cfg->min_umac_error_event_table) {
|
||||
mvm->trans->cfg->min_umac_error_event_table ||
|
||||
device_family >= IWL_DEVICE_FAMILY_BZ) {
|
||||
iwl_fw_umac_set_alive_err_table(mvm->trans,
|
||||
umac_error_table);
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -92,6 +92,12 @@ static void iwl_mvm_nic_config(struct iwl_op_mode *op_mode)
|
|||
radio_cfg_dash = (phy_config & FW_PHY_CFG_RADIO_DASH) >>
|
||||
FW_PHY_CFG_RADIO_DASH_POS;
|
||||
|
||||
IWL_DEBUG_INFO(mvm, "Radio type=0x%x-0x%x-0x%x\n", radio_cfg_type,
|
||||
radio_cfg_step, radio_cfg_dash);
|
||||
|
||||
if (mvm->trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_AX210)
|
||||
return;
|
||||
|
||||
/* SKU control */
|
||||
reg_val = CSR_HW_REV_STEP_DASH(mvm->trans->hw_rev);
|
||||
|
||||
|
|
@ -127,9 +133,6 @@ static void iwl_mvm_nic_config(struct iwl_op_mode *op_mode)
|
|||
CSR_HW_IF_CONFIG_REG_D3_DEBUG,
|
||||
reg_val);
|
||||
|
||||
IWL_DEBUG_INFO(mvm, "Radio type=0x%x-0x%x-0x%x\n", radio_cfg_type,
|
||||
radio_cfg_step, radio_cfg_dash);
|
||||
|
||||
/*
|
||||
* W/A : NIC is stuck in a reset state after Early PCIe power off
|
||||
* (PCIe power is lost before PERST# is asserted), causing ME FW
|
||||
|
|
|
|||
|
|
@ -2066,22 +2066,30 @@ void iwl_mvm_rx_monitor_no_data(struct iwl_mvm *mvm, struct napi_struct *napi,
|
|||
struct ieee80211_rx_status *rx_status;
|
||||
struct iwl_rx_packet *pkt = rxb_addr(rxb);
|
||||
struct iwl_rx_no_data *desc = (void *)pkt->data;
|
||||
u32 rssi = le32_to_cpu(desc->rssi);
|
||||
u32 info_type = le32_to_cpu(desc->info) & RX_NO_DATA_INFO_TYPE_MSK;
|
||||
u32 rssi;
|
||||
u32 info_type;
|
||||
struct ieee80211_sta *sta = NULL;
|
||||
struct sk_buff *skb;
|
||||
struct iwl_mvm_rx_phy_data phy_data = {
|
||||
.d0 = desc->phy_info[0],
|
||||
.d1 = desc->phy_info[1],
|
||||
.phy_info = IWL_RX_MPDU_PHY_TSF_OVERLOAD,
|
||||
.gp2_on_air_rise = le32_to_cpu(desc->on_air_rise_time),
|
||||
.rate_n_flags = le32_to_cpu(desc->rate),
|
||||
.energy_a = u32_get_bits(rssi, RX_NO_DATA_CHAIN_A_MSK),
|
||||
.energy_b = u32_get_bits(rssi, RX_NO_DATA_CHAIN_B_MSK),
|
||||
.channel = u32_get_bits(rssi, RX_NO_DATA_CHANNEL_MSK),
|
||||
};
|
||||
struct iwl_mvm_rx_phy_data phy_data;
|
||||
u32 format;
|
||||
|
||||
if (unlikely(test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)))
|
||||
return;
|
||||
|
||||
if (unlikely(iwl_rx_packet_payload_len(pkt) < sizeof(struct iwl_rx_no_data)))
|
||||
return;
|
||||
|
||||
rssi = le32_to_cpu(desc->rssi);
|
||||
info_type = le32_to_cpu(desc->info) & RX_NO_DATA_INFO_TYPE_MSK;
|
||||
phy_data.d0 = desc->phy_info[0];
|
||||
phy_data.d1 = desc->phy_info[1];
|
||||
phy_data.phy_info = IWL_RX_MPDU_PHY_TSF_OVERLOAD;
|
||||
phy_data.gp2_on_air_rise = le32_to_cpu(desc->on_air_rise_time);
|
||||
phy_data.rate_n_flags = le32_to_cpu(desc->rate);
|
||||
phy_data.energy_a = u32_get_bits(rssi, RX_NO_DATA_CHAIN_A_MSK);
|
||||
phy_data.energy_b = u32_get_bits(rssi, RX_NO_DATA_CHAIN_B_MSK);
|
||||
phy_data.channel = u32_get_bits(rssi, RX_NO_DATA_CHANNEL_MSK);
|
||||
|
||||
if (iwl_fw_lookup_notif_ver(mvm->fw, DATA_PATH_GROUP,
|
||||
RX_NO_DATA_NOTIF, 0) < 2) {
|
||||
IWL_DEBUG_DROP(mvm, "Got an old rate format. Old rate: 0x%x\n",
|
||||
|
|
@ -2093,12 +2101,6 @@ void iwl_mvm_rx_monitor_no_data(struct iwl_mvm *mvm, struct napi_struct *napi,
|
|||
|
||||
format = phy_data.rate_n_flags & RATE_MCS_MOD_TYPE_MSK;
|
||||
|
||||
if (unlikely(iwl_rx_packet_payload_len(pkt) < sizeof(*desc)))
|
||||
return;
|
||||
|
||||
if (unlikely(test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)))
|
||||
return;
|
||||
|
||||
/* Dont use dev_alloc_skb(), we'll have enough headroom once
|
||||
* ieee80211_hdr pulled.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -316,7 +316,7 @@ static int iwl_mvm_invalidate_sta_queue(struct iwl_mvm *mvm, int queue,
|
|||
}
|
||||
|
||||
static int iwl_mvm_disable_txq(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
||||
u16 *queueptr, u8 tid)
|
||||
int sta_id, u16 *queueptr, u8 tid)
|
||||
{
|
||||
int queue = *queueptr;
|
||||
struct iwl_scd_txq_cfg_cmd cmd = {
|
||||
|
|
@ -333,7 +333,8 @@ static int iwl_mvm_disable_txq(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
|||
SCD_QUEUE_CONFIG_CMD);
|
||||
struct iwl_scd_queue_cfg_cmd remove_cmd = {
|
||||
.operation = cpu_to_le32(IWL_SCD_QUEUE_REMOVE),
|
||||
.u.remove.queue = cpu_to_le32(queue),
|
||||
.u.remove.tid = cpu_to_le32(tid),
|
||||
.u.remove.sta_mask = cpu_to_le32(BIT(sta_id)),
|
||||
};
|
||||
|
||||
ret = iwl_mvm_send_cmd_pdu(mvm, cmd_id, 0,
|
||||
|
|
@ -531,7 +532,7 @@ static int iwl_mvm_free_inactive_queue(struct iwl_mvm *mvm, int queue,
|
|||
iwl_mvm_invalidate_sta_queue(mvm, queue,
|
||||
disable_agg_tids, false);
|
||||
|
||||
ret = iwl_mvm_disable_txq(mvm, old_sta, &queue_tmp, tid);
|
||||
ret = iwl_mvm_disable_txq(mvm, old_sta, sta_id, &queue_tmp, tid);
|
||||
if (ret) {
|
||||
IWL_ERR(mvm,
|
||||
"Failed to free inactive queue %d (ret=%d)\n",
|
||||
|
|
@ -1408,7 +1409,7 @@ static int iwl_mvm_sta_alloc_queue(struct iwl_mvm *mvm,
|
|||
|
||||
out_err:
|
||||
queue_tmp = queue;
|
||||
iwl_mvm_disable_txq(mvm, sta, &queue_tmp, tid);
|
||||
iwl_mvm_disable_txq(mvm, sta, mvmsta->sta_id, &queue_tmp, tid);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -1854,7 +1855,8 @@ static void iwl_mvm_disable_sta_queues(struct iwl_mvm *mvm,
|
|||
if (mvm_sta->tid_data[i].txq_id == IWL_MVM_INVALID_QUEUE)
|
||||
continue;
|
||||
|
||||
iwl_mvm_disable_txq(mvm, sta, &mvm_sta->tid_data[i].txq_id, i);
|
||||
iwl_mvm_disable_txq(mvm, sta, mvm_sta->sta_id,
|
||||
&mvm_sta->tid_data[i].txq_id, i);
|
||||
mvm_sta->tid_data[i].txq_id = IWL_MVM_INVALID_QUEUE;
|
||||
}
|
||||
|
||||
|
|
@ -2065,7 +2067,7 @@ static int iwl_mvm_add_int_sta_with_queue(struct iwl_mvm *mvm, int macidx,
|
|||
ret = iwl_mvm_add_int_sta_common(mvm, sta, addr, macidx, maccolor);
|
||||
if (ret) {
|
||||
if (!iwl_mvm_has_new_tx_api(mvm))
|
||||
iwl_mvm_disable_txq(mvm, NULL, queue,
|
||||
iwl_mvm_disable_txq(mvm, NULL, sta->sta_id, queue,
|
||||
IWL_MAX_TID_COUNT);
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -2138,7 +2140,8 @@ int iwl_mvm_rm_snif_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
|
|||
if (WARN_ON_ONCE(mvm->snif_sta.sta_id == IWL_MVM_INVALID_STA))
|
||||
return -EINVAL;
|
||||
|
||||
iwl_mvm_disable_txq(mvm, NULL, &mvm->snif_queue, IWL_MAX_TID_COUNT);
|
||||
iwl_mvm_disable_txq(mvm, NULL, mvm->snif_sta.sta_id,
|
||||
&mvm->snif_queue, IWL_MAX_TID_COUNT);
|
||||
ret = iwl_mvm_rm_sta_common(mvm, mvm->snif_sta.sta_id);
|
||||
if (ret)
|
||||
IWL_WARN(mvm, "Failed sending remove station\n");
|
||||
|
|
@ -2155,7 +2158,8 @@ int iwl_mvm_rm_aux_sta(struct iwl_mvm *mvm)
|
|||
if (WARN_ON_ONCE(mvm->aux_sta.sta_id == IWL_MVM_INVALID_STA))
|
||||
return -EINVAL;
|
||||
|
||||
iwl_mvm_disable_txq(mvm, NULL, &mvm->aux_queue, IWL_MAX_TID_COUNT);
|
||||
iwl_mvm_disable_txq(mvm, NULL, mvm->aux_sta.sta_id,
|
||||
&mvm->aux_queue, IWL_MAX_TID_COUNT);
|
||||
ret = iwl_mvm_rm_sta_common(mvm, mvm->aux_sta.sta_id);
|
||||
if (ret)
|
||||
IWL_WARN(mvm, "Failed sending remove station\n");
|
||||
|
|
@ -2272,7 +2276,8 @@ static void iwl_mvm_free_bcast_sta_queues(struct iwl_mvm *mvm,
|
|||
}
|
||||
|
||||
queue = *queueptr;
|
||||
iwl_mvm_disable_txq(mvm, NULL, queueptr, IWL_MAX_TID_COUNT);
|
||||
iwl_mvm_disable_txq(mvm, NULL, mvmvif->bcast_sta.sta_id,
|
||||
queueptr, IWL_MAX_TID_COUNT);
|
||||
if (iwl_mvm_has_new_tx_api(mvm))
|
||||
return;
|
||||
|
||||
|
|
@ -2507,7 +2512,8 @@ int iwl_mvm_rm_mcast_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
|
|||
|
||||
iwl_mvm_flush_sta(mvm, &mvmvif->mcast_sta, true);
|
||||
|
||||
iwl_mvm_disable_txq(mvm, NULL, &mvmvif->cab_queue, 0);
|
||||
iwl_mvm_disable_txq(mvm, NULL, mvmvif->mcast_sta.sta_id,
|
||||
&mvmvif->cab_queue, 0);
|
||||
|
||||
ret = iwl_mvm_rm_sta_common(mvm, mvmvif->mcast_sta.sta_id);
|
||||
if (ret)
|
||||
|
|
|
|||
|
|
@ -376,12 +376,11 @@ static void iwl_mvm_te_handle_notif(struct iwl_mvm *mvm,
|
|||
static int iwl_mvm_aux_roc_te_handle_notif(struct iwl_mvm *mvm,
|
||||
struct iwl_time_event_notif *notif)
|
||||
{
|
||||
struct iwl_mvm_time_event_data *te_data, *tmp;
|
||||
bool aux_roc_te = false;
|
||||
struct iwl_mvm_time_event_data *aux_roc_te = NULL, *te_data;
|
||||
|
||||
list_for_each_entry_safe(te_data, tmp, &mvm->aux_roc_te_list, list) {
|
||||
list_for_each_entry(te_data, &mvm->aux_roc_te_list, list) {
|
||||
if (le32_to_cpu(notif->unique_id) == te_data->uid) {
|
||||
aux_roc_te = true;
|
||||
aux_roc_te = te_data;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1350,15 +1350,13 @@ static const struct iwl_dev_info iwl_dev_info_table[] = {
|
|||
};
|
||||
|
||||
/*
|
||||
* In case that there is no OTP on the NIC, get the rf id and cdb info
|
||||
* from the prph registers.
|
||||
* Read rf id and cdb info from prph register and store it
|
||||
*/
|
||||
static int get_crf_id(struct iwl_trans *iwl_trans)
|
||||
{
|
||||
int ret = 0;
|
||||
u32 sd_reg_ver_addr;
|
||||
u32 cdb = 0;
|
||||
u32 val;
|
||||
u32 val = 0;
|
||||
|
||||
if (iwl_trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_AX210)
|
||||
sd_reg_ver_addr = SD_REG_VER_GEN2;
|
||||
|
|
@ -1377,10 +1375,26 @@ static int get_crf_id(struct iwl_trans *iwl_trans)
|
|||
iwl_write_umac_prph_no_grab(iwl_trans, WFPM_CTRL_REG, val);
|
||||
|
||||
/* Read crf info */
|
||||
val = iwl_read_prph_no_grab(iwl_trans, sd_reg_ver_addr);
|
||||
iwl_trans->hw_crf_id = iwl_read_prph_no_grab(iwl_trans, sd_reg_ver_addr);
|
||||
|
||||
/* Read cdb info (also contains the jacket info if needed in the future */
|
||||
cdb = iwl_read_umac_prph_no_grab(iwl_trans, WFPM_OTP_CFG1_ADDR);
|
||||
iwl_trans->hw_cdb_id = iwl_read_umac_prph_no_grab(iwl_trans, WFPM_OTP_CFG1_ADDR);
|
||||
|
||||
iwl_trans_release_nic_access(iwl_trans);
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* In case that there is no OTP on the NIC, map the rf id and cdb info
|
||||
* from the prph registers.
|
||||
*/
|
||||
static int map_crf_id(struct iwl_trans *iwl_trans)
|
||||
{
|
||||
int ret = 0;
|
||||
u32 val = iwl_trans->hw_crf_id;
|
||||
u32 cdb = iwl_trans->hw_cdb_id;
|
||||
|
||||
/* Map between crf id to rf id */
|
||||
switch (REG_CRF_ID_TYPE(val)) {
|
||||
|
|
@ -1410,7 +1424,7 @@ static int get_crf_id(struct iwl_trans *iwl_trans)
|
|||
IWL_ERR(iwl_trans,
|
||||
"Can find a correct rfid for crf id 0x%x\n",
|
||||
REG_CRF_ID_TYPE(val));
|
||||
goto out_release;
|
||||
goto out;
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -1423,8 +1437,6 @@ static int get_crf_id(struct iwl_trans *iwl_trans)
|
|||
IWL_INFO(iwl_trans, "Detected RF 0x%x from crf id 0x%x\n",
|
||||
iwl_trans->hw_rf_id, REG_CRF_ID_TYPE(val));
|
||||
|
||||
out_release:
|
||||
iwl_trans_release_nic_access(iwl_trans);
|
||||
|
||||
out:
|
||||
return ret;
|
||||
|
|
@ -1544,6 +1556,7 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
}
|
||||
|
||||
iwl_trans->hw_rf_id = iwl_read32(iwl_trans, CSR_HW_RF_ID);
|
||||
get_crf_id(iwl_trans);
|
||||
|
||||
/*
|
||||
* The RF_ID is set to zero in blank OTP so read version to
|
||||
|
|
@ -1552,7 +1565,7 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
*/
|
||||
if (iwl_trans->trans_cfg->rf_id &&
|
||||
iwl_trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_9000 &&
|
||||
!CSR_HW_RFID_TYPE(iwl_trans->hw_rf_id) && get_crf_id(iwl_trans)) {
|
||||
!CSR_HW_RFID_TYPE(iwl_trans->hw_rf_id) && map_crf_id(iwl_trans)) {
|
||||
ret = -EINVAL;
|
||||
goto out_free_trans;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user