net: wireless: cnss2: Import xiaomi changes from mayfly-s-oss

This commit is contained in:
Arian 2023-03-07 18:00:30 +01:00 committed by Jens Reidel
parent ced9995b90
commit d51f1e50b2
No known key found for this signature in database
GPG Key ID: 23C1E5F512C12303
7 changed files with 179 additions and 15 deletions

View File

@ -19,6 +19,13 @@ config CNSS2_DEBUG
features, enabling kernel panic for certain cases to aid the
debugging, and enabling any other debug mechanisms.
config WIFI_THREE_ANTENNA
bool "CNSS2 Platform Driver for Wi-Fi Three Antenna"
depends on CNSS2
help
This option is to enable CNSS2 platform driver to support wifi
three antenna.
config CNSS2_QMI
bool "CNSS2 Platform Driver QMI support"
select CNSS_QMI_SVC

View File

@ -3,6 +3,7 @@
obj-$(CONFIG_CNSS2) += cnss2.o
ccflags-y += -I$(srctree)/drivers/net/wireless/cnss_utils/
ccflags-y += -I$(srctree)/drivers/misc/hwid/
cnss2-y := main.o
cnss2-y += bus.o
cnss2-y += debug.o

View File

@ -916,6 +916,14 @@ static int cnss_create_debug_only_node(struct cnss_plat_data *plat_priv)
#else
static int cnss_create_debug_only_node(struct cnss_plat_data *plat_priv)
{
#ifdef CONFIG_WIFI_THREE_ANTENNA
/* Create reg read/write for non-debug build as well */
struct dentry *root_dentry = plat_priv->root_dentry;
debugfs_create_file("reg_read", 0600, root_dentry, plat_priv,
&cnss_reg_read_debug_fops);
debugfs_create_file("reg_write", 0600, root_dentry, plat_priv,
&cnss_reg_write_debug_fops);
#endif
return 0;
}
#endif

View File

@ -623,7 +623,7 @@ static int cnss_setup_dms_mac(struct cnss_plat_data *plat_priv)
if (cfg) {
if (!cfg->dms_mac_addr_supported) {
cnss_pr_err("DMS MAC address not supported\n");
CNSS_ASSERT(0);
//CNSS_ASSERT(0);
return -EINVAL;
}
}
@ -632,13 +632,13 @@ static int cnss_setup_dms_mac(struct cnss_plat_data *plat_priv)
break;
ret = cnss_qmi_get_dms_mac(plat_priv);
if (ret == 0)
if (ret != -EAGAIN)
break;
msleep(CNSS_DMS_QMI_CONNECTION_WAIT_MS);
}
if (!plat_priv->dms.mac_valid) {
if (!plat_priv->dms.nv_mac_not_prov && !plat_priv->dms.mac_valid) {
cnss_pr_err("Unable to get MAC from DMS after retries\n");
CNSS_ASSERT(0);
//CNSS_ASSERT(0);
return -EINVAL;
}
}
@ -1683,6 +1683,20 @@ static const char *cnss_recovery_reason_to_str(enum cnss_recovery_reason reason)
return "UNKNOWN";
};
#ifdef CONFIG_CNSS2_DEBUG
static bool cnss_link_down_self_recovery(void)
{
/* Attempt self recovery only in production builds */
return false;
}
#else
static bool cnss_link_down_self_recovery(void)
{
cnss_pr_warn("PCI link down recovery failed. Force self recovery\n");
return true;
}
#endif
static int cnss_do_recovery(struct cnss_plat_data *plat_priv,
enum cnss_recovery_reason reason)
{
@ -1721,6 +1735,9 @@ static int cnss_do_recovery(struct cnss_plat_data *plat_priv,
clear_bit(CNSS_DRIVER_RECOVERY,
&plat_priv->driver_state);
return 0;
} else {
if (cnss_link_down_self_recovery())
goto self_recovery;
}
break;
case CNSS_REASON_RDDM:
@ -3361,9 +3378,12 @@ static ssize_t fs_ready_store(struct device *dev,
{
int fs_ready = 0;
struct cnss_plat_data *plat_priv = dev_get_drvdata(dev);
cnss_pr_err("fs_ready event!\n");
if (sscanf(buf, "%du", &fs_ready) != 1)
if (sscanf(buf, "%du", &fs_ready) != 1) {
cnss_pr_err("no parm to write to fs_ready!\n");
return -EINVAL;
}
cnss_pr_dbg("File system is ready, fs_ready is %d, count is %zu\n",
fs_ready, count);
@ -3380,6 +3400,8 @@ static ssize_t fs_ready_store(struct device *dev,
return count;
}
cnss_pr_dbg("device ID 0x%lx\n", plat_priv->device_id);
switch (plat_priv->device_id) {
case QCA6290_DEVICE_ID:
case QCA6390_DEVICE_ID:
@ -3508,6 +3530,8 @@ static int cnss_create_sysfs_link(struct cnss_plat_data *plat_priv)
struct device *dev = &plat_priv->plat_dev->dev;
int ret;
cnss_pr_err("start create cnss link\n");
ret = sysfs_create_link(kernel_kobj, &dev->kobj, "cnss");
if (ret) {
cnss_pr_err("Failed to create cnss link, err = %d\n",
@ -3985,6 +4009,7 @@ static int cnss_probe(struct platform_device *plat_dev)
const struct platform_device_id *device_id;
int retry = 0;
cnss_pr_err("cnss_probe!\n");
if (cnss_get_plat_priv(plat_dev)) {
cnss_pr_err("Driver is already initialized!\n");
ret = -EEXIST;

View File

@ -423,6 +423,7 @@ enum cnss_ce_index {
struct cnss_dms_data {
u32 mac_valid;
u8 nv_mac_not_prov;
u8 mac[QMI_WLFW_MAC_ADDR_SIZE_V01];
};

View File

@ -2904,6 +2904,10 @@ static void cnss_wlan_reg_driver_work(struct work_struct *work)
}
del_timer(&plat_priv->fw_boot_timer);
if (plat_priv->charger_mode) {
cnss_pr_err("Ignore calibration timeout in charger mode\n");
return;
}
if (test_bit(CNSS_IN_COLD_BOOT_CAL, &plat_priv->driver_state) &&
!test_bit(CNSS_IN_REBOOT, &plat_priv->driver_state)) {
cnss_pr_err("Timeout waiting for calibration to complete\n");

View File

@ -12,10 +12,29 @@
#include "main.h"
#include "qmi.h"
#include "genl.h"
#include "hwid.h"
#define WLFW_SERVICE_INS_ID_V01 1
#define WLFW_CLIENT_ID 0x4b4e454c
#define BDF_FILE_NAME_PREFIX "bdwlan"
#define ELF_BDF_FILE_NAME_L2S "bd_l2s.elf"
#define ELF_BDF_FILE_NAME_L2S_GF "bd_l2sgf.elf"
#define ELF_BDF_FILE_NAME_L3S "bd_l3s.elf"
#define ELF_BDF_FILE_NAME_L3S_GF "bd_l3sgf.elf"
#define ELF_BDF_FILE_NAME_L1 "bd_l1.elf"
#define ELF_BDF_FILE_NAME_L1_GF "bd_l1gf.elf"
#define ELF_BDF_FILE_NAME_L2 "bd_l2.elf"
#define ELF_BDF_FILE_NAME_L2_GF "bd_l2gf.elf"
#define ELF_BDF_FILE_NAME_L2_GLOBAL "bd_l2gl.elf"
#define ELF_BDF_FILE_NAME_L2_GF_GLOBAL "bd_l2gfgl.elf"
#define ELF_BDF_FILE_NAME_L3 "bd_l3.elf"
#define ELF_BDF_FILE_NAME_L3_GF "bd_l3gf.elf"
#define ELF_BDF_FILE_NAME_L3_GLOBAL "bd_l3gl.elf"
#define ELF_BDF_FILE_NAME_L3_GF_GLOBAL "bd_l3gfgl.elf"
#define ELF_BDF_FILE_NAME_L10 "bd_l10.elf"
#define ELF_BDF_FILE_NAME_L10_GF "bd_l10gf.elf"
#define ELF_BDF_FILE_NAME_L10_GLOBAL "bd_l10gl.elf"
#define ELF_BDF_FILE_NAME_L10_GF_GLOBAL "bd_l10gfgl.elf"
#define ELF_BDF_FILE_NAME "bdwlan.elf"
#define ELF_BDF_FILE_NAME_GF "bdwlang.elf"
#define ELF_BDF_FILE_NAME_PREFIX "bdwlan.e"
@ -25,6 +44,7 @@
#define BIN_BDF_FILE_NAME_PREFIX "bdwlan.b"
#define BIN_BDF_FILE_NAME_GF_PREFIX "bdwlang.b"
#define REGDB_FILE_NAME "regdb.bin"
#define REGDB_FILE_NAME_XIAOMI "regdb_xiaomi.bin"
#define HDS_FILE_NAME "hds.bin"
#define CHIP_ID_GF_MASK 0x10
@ -49,6 +69,7 @@
#define QMI_WLFW_MAX_RECV_BUF_SIZE SZ_8K
#define IMSPRIVATE_SERVICE_MAX_MSG_LEN SZ_8K
#define DMS_QMI_MAX_MSG_LEN SZ_256
#define DMS_MAC_NOT_PROVISIONED 16
#define MAX_SHADOW_REG_RESERVED 2
#define MAX_NUM_SHADOW_REG_V3 (QMI_WLFW_MAX_NUM_SHADOW_REG_V3_USAGE_V01 - \
MAX_SHADOW_REG_RESERVED)
@ -250,6 +271,30 @@ static int cnss_wlfw_host_cap_send_sync(struct cnss_plat_data *plat_priv)
req->wake_msi_valid = 1;
}
#ifdef CONFIG_WIFI_THREE_ANTENNA
req->gpios_valid = 1;
/* Format of GPIO configuration -
*
* A_UINT32 default_output_val:1, - GPIO default Output value if direction is output
* reserved1:7, - reserved bits
* sw_func:4, - GPIO pin software function selection
* pull:2, - GPIO Pull, TLMM_GPIO_CFGn.GPIO_PULL
* func:4, - GPIO pin function, TLMM_GPIO_CFGn.FUNC_SEL
* drive:3, - GPIO Drive, TLMM_GPIO_CFGn.DRV_STRENGTH
* dir:1, - GPIO pin direction: PLAT_GPIO_DIR_INPUT/PLAT_GPIO_DIR_OUTPUT,
* TLMM_GPIO_CFGn.GPIO_OE
* reserved0:2, - reserved bits
* gpio_num:8; - GPIO pin number
*/
/* 1st GPIO,set default GPIO config*/
req->gpios[0] = 0x38242F01;
/* The Nth GPIO if any, and update req->gpios_len accordingly
* Ensure gpios_len less than QMI_WLFW_MAX_NUM_GPIO_V01
*/
req->gpios_len = 1;
#endif
req->bdf_support_valid = 1;
req->bdf_support = 1;
@ -614,17 +659,84 @@ static int cnss_get_bdf_file_name(struct cnss_plat_data *plat_priv,
{
char filename_tmp[MAX_FIRMWARE_NAME_LEN];
int ret = 0;
uint32_t hw_platform_ver = 0;
uint32_t hw_country_ver = 0;
hw_country_ver = get_hw_country_version();
hw_platform_ver = get_hw_version_platform();
switch (bdf_type) {
case CNSS_BDF_ELF:
/* Board ID will be equal or less than 0xFF in GF mask case */
if (plat_priv->board_info.board_id == 0xFF) {
if (plat_priv->chip_info.chip_id & CHIP_ID_GF_MASK)
if (plat_priv->chip_info.chip_id & CHIP_ID_GF_MASK) {
if (hw_platform_ver == HARDWARE_PROJECT_L1 ||
hw_platform_ver == HARDWARE_PROJECT_L1A) {
snprintf(filename_tmp, filename_len,
ELF_BDF_FILE_NAME_L1_GF);
} else if (hw_platform_ver == HARDWARE_PROJECT_L2S) {
snprintf(filename_tmp, filename_len,
ELF_BDF_FILE_NAME_L2S_GF);
} else if (hw_platform_ver == HARDWARE_PROJECT_L3S) {
snprintf(filename_tmp, filename_len,
ELF_BDF_FILE_NAME_L3S_GF);
} else if (hw_platform_ver == HARDWARE_PROJECT_L2) {
if ((uint32_t)CountryGlobal == hw_country_ver)
snprintf(filename_tmp, filename_len,
ELF_BDF_FILE_NAME_L2_GF_GLOBAL);
else
snprintf(filename_tmp, filename_len,
ELF_BDF_FILE_NAME_L2_GF);
} else if (hw_platform_ver == HARDWARE_PROJECT_L3) {
if ((uint32_t)CountryGlobal == hw_country_ver)
snprintf(filename_tmp, filename_len,
ELF_BDF_FILE_NAME_L3_GF_GLOBAL);
else
snprintf(filename_tmp, filename_len,
ELF_BDF_FILE_NAME_L3_GF);
} else if (hw_platform_ver == HARDWARE_PROJECT_L10) {
if ((uint32_t)CountryGlobal == hw_country_ver)
snprintf(filename_tmp, filename_len,
ELF_BDF_FILE_NAME_L10_GF_GLOBAL);
else
snprintf(filename_tmp, filename_len,
ELF_BDF_FILE_NAME_L10_GF);
} else
snprintf(filename_tmp, filename_len,
ELF_BDF_FILE_NAME_GF);
} else if (hw_platform_ver == HARDWARE_PROJECT_L1 ||
hw_platform_ver == HARDWARE_PROJECT_L1A) {
snprintf(filename_tmp, filename_len,
ELF_BDF_FILE_NAME_L1);
} else if (hw_platform_ver == HARDWARE_PROJECT_L2S) {
snprintf(filename_tmp, filename_len,
ELF_BDF_FILE_NAME_L2S);
} else if (hw_platform_ver == HARDWARE_PROJECT_L3S) {
snprintf(filename_tmp, filename_len,
ELF_BDF_FILE_NAME_L3S);
} else if (hw_platform_ver == HARDWARE_PROJECT_L2) {
if ((uint32_t)CountryGlobal == hw_country_ver)
snprintf(filename_tmp, filename_len,
ELF_BDF_FILE_NAME_L2_GLOBAL);
else
snprintf(filename_tmp, filename_len,
ELF_BDF_FILE_NAME_L2);
} else if (hw_platform_ver == HARDWARE_PROJECT_L3) {
if ((uint32_t)CountryGlobal == hw_country_ver)
snprintf(filename_tmp, filename_len,
ELF_BDF_FILE_NAME_L3_GLOBAL);
else
snprintf(filename_tmp, filename_len,
ELF_BDF_FILE_NAME_L3);
} else if (hw_platform_ver == HARDWARE_PROJECT_L10) {
if ((uint32_t)CountryGlobal == hw_country_ver)
snprintf(filename_tmp, filename_len,
ELF_BDF_FILE_NAME_L10_GLOBAL);
else
snprintf(filename_tmp, filename_len,
ELF_BDF_FILE_NAME_L10);
} else
snprintf(filename_tmp, filename_len,
ELF_BDF_FILE_NAME_GF);
else
snprintf(filename_tmp, filename_len,
ELF_BDF_FILE_NAME);
ELF_BDF_FILE_NAME);
} else if (plat_priv->board_info.board_id < 0xFF) {
if (plat_priv->chip_info.chip_id & CHIP_ID_GF_MASK)
snprintf(filename_tmp, filename_len,
@ -666,7 +778,7 @@ static int cnss_get_bdf_file_name(struct cnss_plat_data *plat_priv,
}
break;
case CNSS_BDF_REGDB:
snprintf(filename_tmp, filename_len, REGDB_FILE_NAME);
snprintf(filename_tmp, filename_len, REGDB_FILE_NAME_XIAOMI);
break;
case CNSS_BDF_HDS:
snprintf(filename_tmp, filename_len, HDS_FILE_NAME);
@ -3243,7 +3355,7 @@ int cnss_qmi_get_dms_mac(struct cnss_plat_data *plat_priv)
if (!test_bit(CNSS_QMI_DMS_CONNECTED, &plat_priv->driver_state)) {
cnss_pr_err("DMS QMI connection not established\n");
return -EINVAL;
return -EAGAIN;
}
cnss_pr_dbg("Requesting DMS MAC address");
@ -3274,9 +3386,15 @@ int cnss_qmi_get_dms_mac(struct cnss_plat_data *plat_priv)
}
if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
cnss_pr_err("QMI_DMS_GET_MAC_ADDRESS_REQ_V01 failed, result: %d, err: %d\n",
resp.resp.result, resp.resp.error);
ret = -resp.resp.result;
if (resp.resp.error == DMS_MAC_NOT_PROVISIONED) {
cnss_pr_err("NV MAC address is not provisioned");
plat_priv->dms.nv_mac_not_prov = 1;
ret = -resp.resp.result;
} else {
cnss_pr_err("QMI_DMS_GET_MAC_ADDRESS_REQ_V01 failed, result: %d, err: %d\n",
resp.resp.result, resp.resp.error);
ret = -EAGAIN;
}
goto out;
}
if (!resp.mac_address_valid ||