wifi: iwlwifi: mei: add support for SAP version 4

SAP version 4 uses larger Host to MEI notification queue.
Since it is unknown which SAP version is used by the CSME firmware
when the driver loads, try version 4 first. In case the CSME firmware
uses version 3, the memory allocation will fail. In this case the
driver will try again to allocate the memory for version 3.

Signed-off-by: Avraham Stern <avraham.stern@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20240729201718.8372e040282f.Ia0085784e08a35159c9293f986c3d2774038f4c4@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
Avraham Stern
2024-07-29 20:20:08 +03:00
committed by Johannes Berg
parent 8131dd5281
commit 27c8f12e97
2 changed files with 53 additions and 15 deletions
@@ -283,6 +283,16 @@ struct iwl_mei_colloc_info {
u8 bssid[ETH_ALEN];
};
/**
* enum iwl_mei_sap_version - SAP version
* @IWL_MEI_SAP_VERSION_3: SAP version 3
* @IWL_MEI_SAP_VERSION_4: SAP version 4
*/
enum iwl_mei_sap_version {
IWL_MEI_SAP_VERSION_3 = 3,
IWL_MEI_SAP_VERSION_4 = 4,
};
/*
* struct iwl_mei_ops - driver's operations called by iwlmei
* Operations will not be called more than once concurrently.
+43 -15
View File
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (C) 2021-2023 Intel Corporation
* Copyright (C) 2021-2024 Intel Corporation
*/
#include <linux/etherdevice.h>
@@ -58,7 +58,6 @@ bool iwl_mei_is_connected(void)
}
EXPORT_SYMBOL_GPL(iwl_mei_is_connected);
#define SAP_VERSION 3
#define SAP_CONTROL_BLOCK_ID 0x21504153 /* SAP! in ASCII */
struct iwl_sap_q_ctrl_blk {
@@ -110,16 +109,19 @@ struct iwl_sap_shared_mem_ctrl_blk {
#define SAP_H2M_DATA_Q_SZ 48256
#define SAP_M2H_DATA_Q_SZ 24128
#define SAP_H2M_NOTIF_Q_SZ 2240
#define SAP_H2M_NOTIF_Q_SZ_VER3 2240
#define SAP_H2M_NOTIF_Q_SZ_VER4 32768
#define SAP_M2H_NOTIF_Q_SZ 62720
#define _IWL_MEI_SAP_SHARED_MEM_SZ \
#define _IWL_MEI_SAP_SHARED_MEM_SZ_VER3 \
(sizeof(struct iwl_sap_shared_mem_ctrl_blk) + \
SAP_H2M_DATA_Q_SZ + SAP_H2M_NOTIF_Q_SZ + \
SAP_H2M_DATA_Q_SZ + SAP_H2M_NOTIF_Q_SZ_VER3 + \
SAP_M2H_DATA_Q_SZ + SAP_M2H_NOTIF_Q_SZ + 4)
#define IWL_MEI_SAP_SHARED_MEM_SZ \
(roundup(_IWL_MEI_SAP_SHARED_MEM_SZ, PAGE_SIZE))
#define _IWL_MEI_SAP_SHARED_MEM_SZ_VER4 \
(sizeof(struct iwl_sap_shared_mem_ctrl_blk) + \
SAP_H2M_DATA_Q_SZ + SAP_H2M_NOTIF_Q_SZ_VER4 + \
SAP_M2H_DATA_Q_SZ + SAP_M2H_NOTIF_Q_SZ + 4)
struct iwl_mei_shared_mem_ptrs {
struct iwl_sap_shared_mem_ctrl_blk *ctrl;
@@ -206,6 +208,7 @@ struct iwl_mei {
* @mac_address: interface MAC address.
* @nvm_address: NVM MAC address.
* @priv: A pointer to iwlwifi.
* @sap_version: The SAP version to use. enum iwl_mei_sap_version.
*
* This used to cache the configurations coming from iwlwifi's way. The data
* is cached here so that we can buffer the configuration even if we don't have
@@ -220,6 +223,7 @@ struct iwl_mei_cache {
u16 mcc;
u8 mac_address[6];
u8 nvm_address[6];
enum iwl_mei_sap_version sap_version;
void *priv;
};
@@ -238,14 +242,17 @@ static void iwl_mei_free_shared_mem(struct mei_cl_device *cldev)
#define HBM_DMA_BUF_ID_WLAN 1
static int iwl_mei_alloc_shared_mem(struct mei_cl_device *cldev)
static int iwl_mei_alloc_mem_for_version(struct mei_cl_device *cldev,
enum iwl_mei_sap_version version)
{
struct iwl_mei *mei = mei_cldev_get_drvdata(cldev);
struct iwl_mei_shared_mem_ptrs *mem = &mei->shared_mem;
u32 mem_size = roundup(version == IWL_MEI_SAP_VERSION_4 ?
_IWL_MEI_SAP_SHARED_MEM_SZ_VER4 :
_IWL_MEI_SAP_SHARED_MEM_SZ_VER3, PAGE_SIZE);
mem->ctrl = mei_cldev_dma_map(cldev, HBM_DMA_BUF_ID_WLAN,
IWL_MEI_SAP_SHARED_MEM_SZ);
iwl_mei_cache.sap_version = version;
mem->ctrl = mei_cldev_dma_map(cldev, HBM_DMA_BUF_ID_WLAN, mem_size);
if (IS_ERR(mem->ctrl)) {
int ret = PTR_ERR(mem->ctrl);
@@ -254,11 +261,30 @@ static int iwl_mei_alloc_shared_mem(struct mei_cl_device *cldev)
return ret;
}
memset(mem->ctrl, 0, IWL_MEI_SAP_SHARED_MEM_SZ);
memset(mem->ctrl, 0, mem_size);
return 0;
}
static int iwl_mei_alloc_shared_mem(struct mei_cl_device *cldev)
{
int ret;
/*
* SAP version 4 uses a larger Host to MEI notif queue.
* Since it is unknown at this stage which SAP version is used by the
* CSME firmware on this platform, try to allocate the version 4 first.
* If the CSME firmware uses version 3, this allocation is expected to
* fail because the CSME firmware allocated less memory for our driver.
*/
ret = iwl_mei_alloc_mem_for_version(cldev, IWL_MEI_SAP_VERSION_4);
if (ret)
ret = iwl_mei_alloc_mem_for_version(cldev,
IWL_MEI_SAP_VERSION_3);
return ret;
}
static void iwl_mei_init_shared_mem(struct iwl_mei *mei)
{
struct iwl_mei_shared_mem_ptrs *mem = &mei->shared_mem;
@@ -277,7 +303,9 @@ static void iwl_mei_init_shared_mem(struct iwl_mei *mei)
h2m->q_ctrl_blk[SAP_QUEUE_IDX_DATA].size =
cpu_to_le32(SAP_H2M_DATA_Q_SZ);
h2m->q_ctrl_blk[SAP_QUEUE_IDX_NOTIF].size =
cpu_to_le32(SAP_H2M_NOTIF_Q_SZ);
iwl_mei_cache.sap_version == IWL_MEI_SAP_VERSION_3 ?
cpu_to_le32(SAP_H2M_NOTIF_Q_SZ_VER3) :
cpu_to_le32(SAP_H2M_NOTIF_Q_SZ_VER4);
m2h->q_ctrl_blk[SAP_QUEUE_IDX_DATA].size =
cpu_to_le32(SAP_M2H_DATA_Q_SZ);
m2h->q_ctrl_blk[SAP_QUEUE_IDX_NOTIF].size =
@@ -647,7 +675,7 @@ iwl_mei_handle_rx_start_ok(struct mei_cl_device *cldev,
return;
}
if (rsp->supported_version != SAP_VERSION) {
if (rsp->supported_version != iwl_mei_cache.sap_version) {
dev_err(&cldev->dev,
"didn't get the expected version: got %d\n",
rsp->supported_version);
@@ -1281,7 +1309,7 @@ static int iwl_mei_send_start(struct mei_cl_device *cldev)
.hdr.type = cpu_to_le32(SAP_ME_MSG_START),
.hdr.seq_num = cpu_to_le32(atomic_inc_return(&mei->seq_no)),
.hdr.len = cpu_to_le32(sizeof(msg)),
.supported_versions[0] = SAP_VERSION,
.supported_versions[0] = iwl_mei_cache.sap_version,
.init_data_seq_num = cpu_to_le16(0x100),
.init_notif_seq_num = cpu_to_le16(0x800),
};