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:
committed by
Johannes Berg
parent
8131dd5281
commit
27c8f12e97
@@ -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.
|
||||
|
||||
@@ -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),
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user