net: wireless: cnss2: Import xiaomi changes from mayfly-s-oss
This commit is contained in:
parent
ced9995b90
commit
d51f1e50b2
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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];
|
||||
};
|
||||
|
||||
|
@ -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");
|
||||
|
@ -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 ||
|
||||
|
Loading…
Reference in New Issue
Block a user