Merge "cnss2: Add fallback support for device specific path loading"

This commit is contained in:
qctecmdr 2020-12-18 08:04:01 -08:00 • committed by Gerrit - the friendly Code Review server
commit b6116d39ae
2 changed files with 71 additions and 52 deletions

View file

@ -448,6 +448,7 @@ struct cnss_plat_data {
u8 powered_on;
u8 use_fw_path_with_prefix;
char firmware_name[MAX_FIRMWARE_NAME_LEN];
char fw_fallback_name[MAX_FIRMWARE_NAME_LEN];
struct completion rddm_complete;
struct completion recovery_complete;
struct cnss_control_params ctrl_params;

View file

@ -4590,6 +4590,69 @@ void cnss_pci_add_fw_prefix_name(struct cnss_pci_data *pci_priv,
cnss_pr_dbg("FW name added with prefix: %s\n", prefix_name);
}
static int cnss_pci_update_fw_name(struct cnss_pci_data *pci_priv)
{
struct cnss_plat_data *plat_priv = pci_priv->plat_priv;
struct mhi_controller *mhi_ctrl = pci_priv->mhi_ctrl;
plat_priv->device_version.family_number = mhi_ctrl->family_number;
plat_priv->device_version.device_number = mhi_ctrl->device_number;
plat_priv->device_version.major_version = mhi_ctrl->major_version;
plat_priv->device_version.minor_version = mhi_ctrl->minor_version;
cnss_pr_dbg("Get device version info, family number: 0x%x, device number: 0x%x, major version: 0x%x, minor version: 0x%x\n",
plat_priv->device_version.family_number,
plat_priv->device_version.device_number,
plat_priv->device_version.major_version,
plat_priv->device_version.minor_version);
switch (pci_priv->device_id) {
case QCA6390_DEVICE_ID:
if (plat_priv->device_version.major_version < FW_V2_NUMBER) {
cnss_pr_dbg("Device ID:version (0x%lx:%d) is not supported\n",
pci_priv->device_id,
plat_priv->device_version.major_version);
return -EINVAL;
}
cnss_pci_add_fw_prefix_name(pci_priv, plat_priv->firmware_name,
FW_V2_FILE_NAME);
snprintf(plat_priv->fw_fallback_name, MAX_FIRMWARE_NAME_LEN,
FW_V2_FILE_NAME);
break;
case QCA6490_DEVICE_ID:
switch (plat_priv->device_version.major_version) {
case FW_V2_NUMBER:
cnss_pci_add_fw_prefix_name(pci_priv,
plat_priv->firmware_name,
FW_V2_FILE_NAME);
snprintf(plat_priv->fw_fallback_name,
MAX_FIRMWARE_NAME_LEN,
FW_V2_FILE_NAME);
break;
default:
cnss_pci_add_fw_prefix_name(pci_priv,
plat_priv->firmware_name,
DEFAULT_FW_FILE_NAME);
snprintf(plat_priv->fw_fallback_name,
MAX_FIRMWARE_NAME_LEN,
DEFAULT_FW_FILE_NAME);
break;
}
break;
default:
cnss_pci_add_fw_prefix_name(pci_priv, plat_priv->firmware_name,
DEFAULT_FW_FILE_NAME);
snprintf(plat_priv->fw_fallback_name, MAX_FIRMWARE_NAME_LEN,
DEFAULT_FW_FILE_NAME);
break;
}
cnss_pr_dbg("FW name is %s, FW fallback name is %s\n",
mhi_ctrl->fw_image, mhi_ctrl->fw_image_fallback);
return 0;
}
static char *cnss_mhi_notify_status_to_str(enum MHI_CB status)
{
switch (status) {
@ -4603,6 +4666,8 @@ static char *cnss_mhi_notify_status_to_str(enum MHI_CB status)
return "FATAL_ERROR";
case MHI_CB_EE_MISSION_MODE:
return "MISSION_MODE";
case MHI_CB_FW_FALLBACK_IMG:
return "FW_FALLBACK";
default:
return "UNKNOWN";
}
@ -4683,6 +4748,10 @@ static void cnss_mhi_notify_status(struct mhi_controller *mhi_ctrl, void *priv,
cnss_pci_update_status(pci_priv, CNSS_FW_DOWN);
cnss_reason = CNSS_REASON_RDDM;
break;
case MHI_CB_FW_FALLBACK_IMG:
plat_priv->use_fw_path_with_prefix = false;
cnss_pci_update_fw_name(pci_priv);
return;
default:
cnss_pr_err("Unsupported MHI status cb reason: %d\n", reason);
return;
@ -4720,58 +4789,6 @@ static int cnss_pci_get_mhi_msi(struct cnss_pci_data *pci_priv)
return 0;
}
static int cnss_pci_update_fw_name(struct cnss_pci_data *pci_priv)
{
struct cnss_plat_data *plat_priv = pci_priv->plat_priv;
struct mhi_controller *mhi_ctrl = pci_priv->mhi_ctrl;
plat_priv->device_version.family_number = mhi_ctrl->family_number;
plat_priv->device_version.device_number = mhi_ctrl->device_number;
plat_priv->device_version.major_version = mhi_ctrl->major_version;
plat_priv->device_version.minor_version = mhi_ctrl->minor_version;
cnss_pr_dbg("Get device version info, family number: 0x%x, device number: 0x%x, major version: 0x%x, minor version: 0x%x\n",
plat_priv->device_version.family_number,
plat_priv->device_version.device_number,
plat_priv->device_version.major_version,
plat_priv->device_version.minor_version);
switch (pci_priv->device_id) {
case QCA6390_DEVICE_ID:
if (plat_priv->device_version.major_version < FW_V2_NUMBER) {
cnss_pr_dbg("Device ID:version (0x%lx:%d) is not supported\n",
pci_priv->device_id,
plat_priv->device_version.major_version);
return -EINVAL;
}
cnss_pci_add_fw_prefix_name(pci_priv, plat_priv->firmware_name,
FW_V2_FILE_NAME);
break;
case QCA6490_DEVICE_ID:
switch (plat_priv->device_version.major_version) {
case FW_V2_NUMBER:
cnss_pci_add_fw_prefix_name(pci_priv,
plat_priv->firmware_name,
FW_V2_FILE_NAME);
break;
default:
cnss_pci_add_fw_prefix_name(pci_priv,
plat_priv->firmware_name,
DEFAULT_FW_FILE_NAME);
break;
}
break;
default:
cnss_pci_add_fw_prefix_name(pci_priv, plat_priv->firmware_name,
DEFAULT_FW_FILE_NAME);
break;
}
cnss_pr_dbg("Firmware name is %s\n", mhi_ctrl->fw_image);
return 0;
}
static int cnss_mhi_bw_scale(struct mhi_controller *mhi_ctrl,
struct mhi_link_info *link_info)
{
@ -4819,6 +4836,7 @@ static int cnss_pci_register_mhi(struct cnss_pci_data *pci_priv)
mhi_ctrl->slot = PCI_SLOT(pci_dev->devfn);
mhi_ctrl->fw_image = plat_priv->firmware_name;
mhi_ctrl->fw_image_fallback = plat_priv->fw_fallback_name;
mhi_ctrl->regs = pci_priv->bar;
mhi_ctrl->len = pci_resource_len(pci_priv->pci_dev, PCI_BAR_NUM);