Loading drivers/bus/mhi/core/mhi_init.c +22 −0 Original line number Diff line number Diff line Loading @@ -1188,6 +1188,7 @@ int of_register_mhi_controller(struct mhi_controller *mhi_cntrl) struct mhi_chan *mhi_chan; struct mhi_cmd *mhi_cmd; struct mhi_device *mhi_dev; u32 soc_info; if (!mhi_cntrl->of_node) return -EINVAL; Loading Loading @@ -1253,6 +1254,27 @@ int of_register_mhi_controller(struct mhi_controller *mhi_cntrl) mhi_cntrl->unmap_single = mhi_unmap_single_no_bb; } /* read the device info if possible */ if (mhi_cntrl->regs) { ret = mhi_read_reg(mhi_cntrl, mhi_cntrl->regs, SOC_HW_VERSION_OFFS, &soc_info); if (ret) goto error_alloc_dev; mhi_cntrl->family_number = (soc_info & SOC_HW_VERSION_FAM_NUM_BMSK) >> SOC_HW_VERSION_FAM_NUM_SHFT; mhi_cntrl->device_number = (soc_info & SOC_HW_VERSION_DEV_NUM_BMSK) >> SOC_HW_VERSION_DEV_NUM_SHFT; mhi_cntrl->major_version = (soc_info & SOC_HW_VERSION_MAJOR_VER_BMSK) >> SOC_HW_VERSION_MAJOR_VER_SHFT; mhi_cntrl->minor_version = (soc_info & SOC_HW_VERSION_MINOR_VER_BMSK) >> SOC_HW_VERSION_MINOR_VER_SHFT; } /* register controller with mhi_bus */ mhi_dev = mhi_alloc_device(mhi_cntrl); if (!mhi_dev) { Loading drivers/bus/mhi/core/mhi_internal.h +10 −0 Original line number Diff line number Diff line Loading @@ -215,6 +215,16 @@ extern struct bus_type mhi_bus_type; #define BHIE_RXVECSTATUS_STATUS_XFER_COMPL (0x02) #define BHIE_RXVECSTATUS_STATUS_ERROR (0x03) #define SOC_HW_VERSION_OFFS (0x224) #define SOC_HW_VERSION_FAM_NUM_BMSK (0xF0000000) #define SOC_HW_VERSION_FAM_NUM_SHFT (28) #define SOC_HW_VERSION_DEV_NUM_BMSK (0x0FFF0000) #define SOC_HW_VERSION_DEV_NUM_SHFT (16) #define SOC_HW_VERSION_MAJOR_VER_BMSK (0x0000FF00) #define SOC_HW_VERSION_MAJOR_VER_SHFT (8) #define SOC_HW_VERSION_MINOR_VER_BMSK (0x000000FF) #define SOC_HW_VERSION_MINOR_VER_SHFT (0) /* convert ticks to micro seconds by dividing by 19.2 */ #define TIME_TICKS_TO_US(x) (div_u64((x) * 10, 192)) Loading drivers/net/wireless/cnss2/main.h +1 −0 Original line number Diff line number Diff line Loading @@ -275,6 +275,7 @@ struct cnss_plat_data { struct notifier_block modem_nb; struct cnss_platform_cap cap; struct pm_qos_request qos_request; struct cnss_device_version device_version; unsigned long device_id; enum cnss_driver_status driver_status; u32 recovery_count; Loading drivers/net/wireless/cnss2/pci.c +38 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,8 @@ #define MAX_M3_FILE_NAME_LENGTH 13 #define DEFAULT_M3_FILE_NAME "m3.bin" #define DEFAULT_FW_FILE_NAME "amss.bin" #define FW_V2_FILE_NAME "amss20.bin" #define FW_V2_NUMBER 2 #define WAKE_MSI_NAME "WAKE" Loading Loading @@ -1950,13 +1952,21 @@ EXPORT_SYMBOL(cnss_smmu_map); int cnss_get_soc_info(struct device *dev, struct cnss_soc_info *info) { struct cnss_pci_data *pci_priv = cnss_get_pci_priv(to_pci_dev(dev)); struct cnss_plat_data *plat_priv; if (!pci_priv) return -ENODEV; plat_priv = pci_priv->plat_priv; if (!plat_priv) return -ENODEV; info->va = pci_priv->bar; info->pa = pci_resource_start(pci_priv->pci_dev, PCI_BAR_NUM); memcpy(&info->device_version, &plat_priv->device_version, sizeof(info->device_version)); return 0; } EXPORT_SYMBOL(cnss_get_soc_info); Loading Loading @@ -2546,6 +2556,32 @@ static int cnss_pci_get_mhi_msi(struct cnss_pci_data *pci_priv) return 0; } static void 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); if (pci_priv->device_id == QCA6390_DEVICE_ID && plat_priv->device_version.major_version >= FW_V2_NUMBER) { scnprintf(plat_priv->firmware_name, sizeof(plat_priv->firmware_name), FW_V2_FILE_NAME); mhi_ctrl->fw_image = plat_priv->firmware_name; } cnss_pr_dbg("Firmware name is %s\n", mhi_ctrl->fw_image); } static int cnss_pci_register_mhi(struct cnss_pci_data *pci_priv) { int ret = 0; Loading Loading @@ -2611,6 +2647,8 @@ static int cnss_pci_register_mhi(struct cnss_pci_data *pci_priv) return ret; } cnss_pci_update_fw_name(pci_priv); return 0; } Loading include/linux/mhi.h +4 −0 Original line number Diff line number Diff line Loading @@ -201,6 +201,10 @@ struct mhi_controller { u32 domain; u32 bus; u32 slot; u32 family_number; u32 device_number; u32 major_version; u32 minor_version; /* addressing window */ dma_addr_t iova_start; Loading Loading
drivers/bus/mhi/core/mhi_init.c +22 −0 Original line number Diff line number Diff line Loading @@ -1188,6 +1188,7 @@ int of_register_mhi_controller(struct mhi_controller *mhi_cntrl) struct mhi_chan *mhi_chan; struct mhi_cmd *mhi_cmd; struct mhi_device *mhi_dev; u32 soc_info; if (!mhi_cntrl->of_node) return -EINVAL; Loading Loading @@ -1253,6 +1254,27 @@ int of_register_mhi_controller(struct mhi_controller *mhi_cntrl) mhi_cntrl->unmap_single = mhi_unmap_single_no_bb; } /* read the device info if possible */ if (mhi_cntrl->regs) { ret = mhi_read_reg(mhi_cntrl, mhi_cntrl->regs, SOC_HW_VERSION_OFFS, &soc_info); if (ret) goto error_alloc_dev; mhi_cntrl->family_number = (soc_info & SOC_HW_VERSION_FAM_NUM_BMSK) >> SOC_HW_VERSION_FAM_NUM_SHFT; mhi_cntrl->device_number = (soc_info & SOC_HW_VERSION_DEV_NUM_BMSK) >> SOC_HW_VERSION_DEV_NUM_SHFT; mhi_cntrl->major_version = (soc_info & SOC_HW_VERSION_MAJOR_VER_BMSK) >> SOC_HW_VERSION_MAJOR_VER_SHFT; mhi_cntrl->minor_version = (soc_info & SOC_HW_VERSION_MINOR_VER_BMSK) >> SOC_HW_VERSION_MINOR_VER_SHFT; } /* register controller with mhi_bus */ mhi_dev = mhi_alloc_device(mhi_cntrl); if (!mhi_dev) { Loading
drivers/bus/mhi/core/mhi_internal.h +10 −0 Original line number Diff line number Diff line Loading @@ -215,6 +215,16 @@ extern struct bus_type mhi_bus_type; #define BHIE_RXVECSTATUS_STATUS_XFER_COMPL (0x02) #define BHIE_RXVECSTATUS_STATUS_ERROR (0x03) #define SOC_HW_VERSION_OFFS (0x224) #define SOC_HW_VERSION_FAM_NUM_BMSK (0xF0000000) #define SOC_HW_VERSION_FAM_NUM_SHFT (28) #define SOC_HW_VERSION_DEV_NUM_BMSK (0x0FFF0000) #define SOC_HW_VERSION_DEV_NUM_SHFT (16) #define SOC_HW_VERSION_MAJOR_VER_BMSK (0x0000FF00) #define SOC_HW_VERSION_MAJOR_VER_SHFT (8) #define SOC_HW_VERSION_MINOR_VER_BMSK (0x000000FF) #define SOC_HW_VERSION_MINOR_VER_SHFT (0) /* convert ticks to micro seconds by dividing by 19.2 */ #define TIME_TICKS_TO_US(x) (div_u64((x) * 10, 192)) Loading
drivers/net/wireless/cnss2/main.h +1 −0 Original line number Diff line number Diff line Loading @@ -275,6 +275,7 @@ struct cnss_plat_data { struct notifier_block modem_nb; struct cnss_platform_cap cap; struct pm_qos_request qos_request; struct cnss_device_version device_version; unsigned long device_id; enum cnss_driver_status driver_status; u32 recovery_count; Loading
drivers/net/wireless/cnss2/pci.c +38 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,8 @@ #define MAX_M3_FILE_NAME_LENGTH 13 #define DEFAULT_M3_FILE_NAME "m3.bin" #define DEFAULT_FW_FILE_NAME "amss.bin" #define FW_V2_FILE_NAME "amss20.bin" #define FW_V2_NUMBER 2 #define WAKE_MSI_NAME "WAKE" Loading Loading @@ -1950,13 +1952,21 @@ EXPORT_SYMBOL(cnss_smmu_map); int cnss_get_soc_info(struct device *dev, struct cnss_soc_info *info) { struct cnss_pci_data *pci_priv = cnss_get_pci_priv(to_pci_dev(dev)); struct cnss_plat_data *plat_priv; if (!pci_priv) return -ENODEV; plat_priv = pci_priv->plat_priv; if (!plat_priv) return -ENODEV; info->va = pci_priv->bar; info->pa = pci_resource_start(pci_priv->pci_dev, PCI_BAR_NUM); memcpy(&info->device_version, &plat_priv->device_version, sizeof(info->device_version)); return 0; } EXPORT_SYMBOL(cnss_get_soc_info); Loading Loading @@ -2546,6 +2556,32 @@ static int cnss_pci_get_mhi_msi(struct cnss_pci_data *pci_priv) return 0; } static void 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); if (pci_priv->device_id == QCA6390_DEVICE_ID && plat_priv->device_version.major_version >= FW_V2_NUMBER) { scnprintf(plat_priv->firmware_name, sizeof(plat_priv->firmware_name), FW_V2_FILE_NAME); mhi_ctrl->fw_image = plat_priv->firmware_name; } cnss_pr_dbg("Firmware name is %s\n", mhi_ctrl->fw_image); } static int cnss_pci_register_mhi(struct cnss_pci_data *pci_priv) { int ret = 0; Loading Loading @@ -2611,6 +2647,8 @@ static int cnss_pci_register_mhi(struct cnss_pci_data *pci_priv) return ret; } cnss_pci_update_fw_name(pci_priv); return 0; } Loading
include/linux/mhi.h +4 −0 Original line number Diff line number Diff line Loading @@ -201,6 +201,10 @@ struct mhi_controller { u32 domain; u32 bus; u32 slot; u32 family_number; u32 device_number; u32 major_version; u32 minor_version; /* addressing window */ dma_addr_t iova_start; Loading