Przeglądaj źródła

Merge 2ec2768bfcde41dce4ed82caf8522a27eb4b8080 on remote branch

Change-Id: I10b34446fc3d9c813818d1665925a19c0b170891
Linux Build Service Account 2 lat temu
rodzic
commit
84d0a7d5d1

+ 9 - 0
Android.mk

@@ -13,6 +13,15 @@ ifeq ($(ENABLE_WLAN_PLATFORM_DLKM), true)
 
 # LOCAL_PATH is a relative path to root build directory.
 LOCAL_PATH := $(call my-dir)
+LOCAL_MODULE_DDK_BUILD := true
+LOCAL_MODULE_DDK_ALLOW_UNSAFE_HEADERS := true
+LOCAL_MODULE_KO_DIRS := cnss2/cnss2.ko
+LOCAL_MODULE_KO_DIRS += cnss_utils/cnss_plat_ipc_qmi_svc.ko
+LOCAL_MODULE_KO_DIRS += cnss_utils/wlan_firmware_service.ko
+LOCAL_MODULE_KO_DIRS += cnss_genl/cnss_nl.ko
+LOCAL_MODULE_KO_DIRS += cnss_prealloc/cnss_prealloc.ko
+LOCAL_MODULE_KO_DIRS += cnss_utils/cnss_utils.ko
+LOCAL_MODULE_KO_DIRS += icnss2/icnss2.ko
 DLKM_DIR := $(TOP)/device/qcom/common/dlkm
 
 # WLAN_PLATFORM_ROOT needs to be a absolute since it will be used

+ 5 - 6
build/pineapple_consolidate_defconfig → cnss2/pineapple_consolidate_defconfig

@@ -1,12 +1,11 @@
-CONFIG_CNSS2=y
+CONFIG_CNSS2=m
 CONFIG_CNSS_OUT_OF_TREE=y
 CONFIG_CNSS2_QMI=y
-CONFIG_CNSS_QMI_SVC=y
-CONFIG_CNSS_GENL=y
+CONFIG_CNSS_QMI_SVC=m
 CONFIG_BUS_AUTO_SUSPEND=y
 CONFIG_CNSS2_SSR_DRIVER_DUMP=y
 CONFIG_CNSS_HW_SECURE_DISABLE=y
 CONFIG_CNSS2_SMMU_DB_SUPPORT=y
-CONFIG_CNSS_PLAT_IPC_QMI_SVC=y
-CONFIG_WCNSS_MEM_PRE_ALLOC=y
-CONFIG_CNSS_UTILS=y
+CONFIG_CNSS_PLAT_IPC_QMI_SVC=m
+CONFIG_WCNSS_MEM_PRE_ALLOC=m
+CONFIG_CNSS2_DEBUG=y

+ 5 - 6
build/pineapple_gki_defconfig → cnss2/pineapple_gki_defconfig

@@ -1,12 +1,11 @@
-CONFIG_CNSS2=y
+CONFIG_CNSS2=m
 CONFIG_CNSS_OUT_OF_TREE=y
 CONFIG_CNSS2_QMI=y
-CONFIG_CNSS_QMI_SVC=y
-CONFIG_CNSS_GENL=y
+CONFIG_CNSS_QMI_SVC=m
 CONFIG_BUS_AUTO_SUSPEND=y
 CONFIG_CNSS2_SSR_DRIVER_DUMP=y
 CONFIG_CNSS_HW_SECURE_DISABLE=y
 CONFIG_CNSS2_SMMU_DB_SUPPORT=y
-CONFIG_CNSS_PLAT_IPC_QMI_SVC=y
-CONFIG_WCNSS_MEM_PRE_ALLOC=y
-CONFIG_CNSS_UTILS=y
+CONFIG_CNSS_PLAT_IPC_QMI_SVC=m
+CONFIG_WCNSS_MEM_PRE_ALLOC=m
+CONFIG_CNSS2_DEBUG=y

+ 2 - 0
cnss_genl/pineapple_consolidate_defconfig

@@ -0,0 +1,2 @@
+CONFIG_CNSS_GENL=m
+CONFIG_CNSS_OUT_OF_TREE=y

+ 2 - 0
cnss_genl/pineapple_gki_defconfig

@@ -0,0 +1,2 @@
+CONFIG_CNSS_GENL=m
+CONFIG_CNSS_OUT_OF_TREE=y

+ 2 - 0
cnss_prealloc/pineapple_consolidate_defconfig

@@ -0,0 +1,2 @@
+CONFIG_WCNSS_MEM_PRE_ALLOC=m
+CONFIG_CNSS_OUT_OF_TREE=y

+ 2 - 0
cnss_prealloc/pineapple_gki_defconfig

@@ -0,0 +1,2 @@
+CONFIG_WCNSS_MEM_PRE_ALLOC=m
+CONFIG_CNSS_OUT_OF_TREE=y

+ 4 - 0
cnss_utils/pineapple_consolidate_defconfig

@@ -0,0 +1,4 @@
+CONFIG_CNSS_UTILS=m
+CONFIG_CNSS_QMI_SVC=m
+CONFIG_CNSS_PLAT_IPC_QMI_SVC=m
+CONFIG_CNSS_OUT_OF_TREE=y

+ 4 - 0
cnss_utils/pineapple_gki_defconfig

@@ -0,0 +1,4 @@
+CONFIG_CNSS_UTILS=m
+CONFIG_CNSS_QMI_SVC=m
+CONFIG_CNSS_PLAT_IPC_QMI_SVC=m
+CONFIG_CNSS_OUT_OF_TREE=y

+ 6 - 0
icnss2/debug.c

@@ -315,6 +315,12 @@ static int icnss_stats_show_capability(struct seq_file *s,
 			   priv->fw_version_info.fw_build_timestamp);
 		seq_printf(s, "Firmware Build ID: %s\n",
 			   priv->fw_build_id);
+		seq_printf(s, "RD card chain cap: %d\n",
+			   priv->rd_card_chain_cap);
+		seq_printf(s, "PHY HE channel width cap: %d\n",
+			   priv->phy_he_channel_width_cap);
+		seq_printf(s, "PHY QAM cap: %d\n",
+			   priv->phy_qam_cap);
 	}
 
 	return 0;

+ 33 - 12
icnss2/main.c

@@ -854,7 +854,7 @@ static void icnss_send_wlan_boot_complete(void)
 	icnss_pr_info("sent wlan boot complete command\n");
 }
 
-static void icnss_wait_for_slate_complete(struct icnss_priv *priv)
+static int icnss_wait_for_slate_complete(struct icnss_priv *priv)
 {
 	if (!test_bit(ICNSS_SLATE_UP, &priv->state)) {
 		reinit_completion(&priv->slate_boot_complete);
@@ -863,15 +863,21 @@ static void icnss_wait_for_slate_complete(struct icnss_priv *priv)
 		wait_for_completion(&priv->slate_boot_complete);
 	}
 
+	if (!test_bit(ICNSS_SLATE_UP, &priv->state))
+		return -EINVAL;
+
 	icnss_send_wlan_boot_init();
+
+	return 0;
 }
 #else
 static void icnss_send_wlan_boot_complete(void)
 {
 }
 
-static void icnss_wait_for_slate_complete(struct icnss_priv *priv)
+static int icnss_wait_for_slate_complete(struct icnss_priv *priv)
 {
+	return 0;
 }
 #endif
 
@@ -890,6 +896,14 @@ static int icnss_driver_event_server_arrive(struct icnss_priv *priv,
 	clear_bit(ICNSS_FW_DOWN, &priv->state);
 	clear_bit(ICNSS_FW_READY, &priv->state);
 
+	if (priv->is_slate_rfa) {
+		ret = icnss_wait_for_slate_complete(priv);
+		if (ret == -EINVAL) {
+			icnss_pr_err("Slate complete failed\n");
+			return ret;
+		}
+	}
+
 	icnss_ignore_fw_timeout(false);
 
 	if (test_bit(ICNSS_WLFW_CONNECTED, &priv->state)) {
@@ -903,9 +917,6 @@ static int icnss_driver_event_server_arrive(struct icnss_priv *priv,
 
 	set_bit(ICNSS_WLFW_CONNECTED, &priv->state);
 
-	if (priv->is_slate_rfa)
-		icnss_wait_for_slate_complete(priv);
-
 	ret = wlfw_ind_register_send_sync_msg(priv);
 	if (ret < 0) {
 		if (ret == -EALREADY) {
@@ -2224,6 +2235,9 @@ static int icnss_modem_notifier_nb(struct notifier_block *nb,
 
 	switch (code) {
 	case QCOM_SSR_BEFORE_SHUTDOWN:
+		if (priv->is_slate_rfa)
+			complete(&priv->slate_boot_complete);
+
 		if (!notif->crashed &&
 		    priv->low_power_support) { /* Hibernate */
 			if (test_bit(ICNSS_MODE_ON, &priv->state))
@@ -3342,6 +3356,9 @@ int icnss_get_soc_info(struct device *dev, struct icnss_soc_info *info)
 		WLFW_MAX_TIMESTAMP_LEN + 1);
 	strlcpy(info->fw_build_id, priv->fw_build_id,
 	        ICNSS_WLFW_MAX_BUILD_ID_LEN + 1);
+	info->rd_card_chain_cap = priv->rd_card_chain_cap;
+	info->phy_he_channel_width_cap = priv->phy_he_channel_width_cap;
+	info->phy_qam_cap = priv->phy_qam_cap;
 
 	return 0;
 }
@@ -4168,7 +4185,7 @@ static void icnss_sysfs_destroy(struct icnss_priv *priv)
 
 static int icnss_resource_parse(struct icnss_priv *priv)
 {
-	int ret = 0, i = 0;
+	int ret = 0, i = 0, irq = 0;
 	struct platform_device *pdev = priv->pdev;
 	struct device *dev = &pdev->dev;
 	struct resource *res;
@@ -4216,14 +4233,13 @@ static int icnss_resource_parse(struct icnss_priv *priv)
 			     priv->mem_base_va);
 
 		for (i = 0; i < ICNSS_MAX_IRQ_REGISTRATIONS; i++) {
-			res = platform_get_resource(priv->pdev,
-						    IORESOURCE_IRQ, i);
-			if (!res) {
+			irq = platform_get_irq(pdev, i);
+			if (irq < 0) {
 				icnss_pr_err("Fail to get IRQ-%d\n", i);
 				ret = -ENODEV;
 				goto put_clk;
 			} else {
-				priv->ce_irqs[i] = res->start;
+				priv->ce_irqs[i] = irq;
 			}
 		}
 
@@ -4398,8 +4414,8 @@ static int icnss_smmu_fault_handler(struct iommu_domain *domain,
 
 	icnss_trigger_recovery(&priv->pdev->dev);
 
-	/* IOMMU driver requires non-zero return value to print debug info. */
-	return -EINVAL;
+	/* IOMMU driver requires -ENOSYS return value to print debug info. */
+	return -ENOSYS;
 }
 
 static int icnss_smmu_dt_parse(struct icnss_priv *priv)
@@ -4830,6 +4846,7 @@ static int icnss_remove(struct platform_device *pdev)
 	complete_all(&priv->unblock_shutdown);
 
 	if (priv->is_slate_rfa) {
+		complete(&priv->slate_boot_complete);
 		icnss_slate_ssr_unregister_notifier(priv);
 		icnss_unregister_slate_event_notifier(priv);
 	}
@@ -4886,6 +4903,10 @@ void icnss_recovery_timeout_hdlr(struct timer_list *t)
 {
 	struct icnss_priv *priv = from_timer(priv, t, recovery_timer);
 
+	/* This is to handle if slate is not up and modem SSR is triggered */
+	if (priv->is_slate_rfa && !test_bit(ICNSS_SLATE_UP, &priv->state))
+		return;
+
 	icnss_pr_err("Timeout waiting for FW Ready 0x%lx\n", priv->state);
 	ICNSS_ASSERT(0);
 }

+ 3 - 0
icnss2/main.h

@@ -513,6 +513,9 @@ struct icnss_priv {
 	struct timer_list recovery_timer;
 	struct timer_list wpss_ssr_timer;
 	bool wpss_self_recovery_enabled;
+	enum icnss_rd_card_chain_cap rd_card_chain_cap;
+	enum icnss_phy_he_channel_width_cap phy_he_channel_width_cap;
+	enum icnss_phy_qam_cap phy_qam_cap;
 };
 
 struct icnss_reg_info {

+ 7 - 0
icnss2/pineapple_consolidate_defconfig

@@ -0,0 +1,7 @@
+CONFIG_ICNSS2=m
+CONFIG_ICNSS2_DEBUG=y
+CONFIG_ICNSS2_QMI=y
+CONFIG_CNSS_QMI_SVC=m
+CONFIG_CNSS_QCA6750=y
+CONFIG_CNSS_OUT_OF_TREE=y
+CONFIG_WCNSS_MEM_PRE_ALLOC=m

+ 7 - 0
icnss2/pineapple_gki_defconfig

@@ -0,0 +1,7 @@
+CONFIG_ICNSS2=m
+CONFIG_ICNSS2_DEBUG=y
+CONFIG_ICNSS2_QMI=y
+CONFIG_CNSS_QMI_SVC=m
+CONFIG_CNSS_QCA6750=y
+CONFIG_CNSS_OUT_OF_TREE=y
+CONFIG_WCNSS_MEM_PRE_ALLOC=m

+ 16 - 3
icnss2/qmi.c

@@ -784,15 +784,24 @@ int wlfw_cap_send_sync_msg(struct icnss_priv *priv)
 		strlcpy(priv->fw_build_id, resp->fw_build_id,
 			QMI_WLFW_MAX_BUILD_ID_LEN_V01 + 1);
 
-	if (resp->rd_card_chain_cap_valid &&
-	    resp->rd_card_chain_cap == WLFW_RD_CARD_CHAIN_CAP_1x1_V01)
-		priv->is_chain1_supported = false;
+	if (resp->rd_card_chain_cap_valid) {
+		priv->rd_card_chain_cap = (enum icnss_rd_card_chain_cap)resp->rd_card_chain_cap;
+		if (resp->rd_card_chain_cap == WLFW_RD_CARD_CHAIN_CAP_1x1_V01)
+			priv->is_chain1_supported = false;
+	}
 
 	if (resp->foundry_name_valid)
 		priv->foundry_name = resp->foundry_name[0];
 	else if (resp->chip_info_valid && priv->chip_info.chip_id == UMC_CHIP_ID)
 		priv->foundry_name = 'u';
 
+	if (resp->he_channel_width_cap_valid)
+		priv->phy_he_channel_width_cap =
+			(enum icnss_phy_he_channel_width_cap)resp->he_channel_width_cap;
+
+	if (resp->phy_qam_cap_valid)
+		priv->phy_qam_cap = (enum icnss_phy_qam_cap)resp->phy_qam_cap;
+
 	icnss_pr_dbg("Capability, chip_id: 0x%x, chip_family: 0x%x, board_id: 0x%x, soc_id: 0x%x",
 		     priv->chip_info.chip_id, priv->chip_info.chip_family,
 		     priv->board_id, priv->soc_id);
@@ -802,6 +811,10 @@ int wlfw_cap_send_sync_msg(struct icnss_priv *priv)
 		     priv->fw_version_info.fw_build_timestamp,
 		     priv->fw_build_id);
 
+	icnss_pr_dbg("RD card chain cap: %d, PHY HE channel width cap: %d, PHY QAM cap: %d",
+		     priv->rd_card_chain_cap, priv->phy_he_channel_width_cap,
+		     priv->phy_qam_cap);
+
 	kfree(resp);
 	kfree(req);
 	return 0;

+ 24 - 0
inc/icnss2.h

@@ -131,6 +131,27 @@ enum icnss_driver_mode {
 	ICNSS_CALIBRATION,
 };
 
+enum icnss_rd_card_chain_cap {
+	ICNSS_RD_CARD_CHAIN_CAP_UNSPECIFIED,
+	ICNSS_RD_CARD_CHAIN_CAP_1x1,
+	ICNSS_RD_CARD_CHAIN_CAP_2x2,
+	ICNSS_RD_CARD_CHAIN_CAP_MAX_VAL,
+};
+
+enum icnss_phy_he_channel_width_cap {
+	ICNSS_PHY_HE_CHANNEL_WIDTH_CAP_UNSPECIFIED,
+	ICNSS_PHY_HE_CHANNEL_WIDTH_CAP_80MHZ,
+	ICNSS_PHY_HE_CHANNEL_WIDTH_CAP_160MHZ,
+	ICNSS_PHY_HE_CHANNEL_WIDTH_CAP_MAX_VAL,
+};
+
+enum icnss_phy_qam_cap {
+	ICNSS_PHY_QAM_CAP_UNSPECIFIED,
+	ICNSS_PHY_QAM_CAP_1K,
+	ICNSS_PHY_QAM_CAP_4K,
+	ICNSS_PHY_QAM_CAP_MAX_VAL,
+};
+
 struct icnss_soc_info {
 	void __iomem *v_addr;
 	phys_addr_t p_addr;
@@ -141,6 +162,9 @@ struct icnss_soc_info {
 	uint32_t fw_version;
 	char fw_build_timestamp[ICNSS_MAX_TIMESTAMP_LEN + 1];
 	char fw_build_id[ICNSS_WLFW_MAX_BUILD_ID_LEN + 1];
+	enum icnss_rd_card_chain_cap rd_card_chain_cap;
+	enum icnss_phy_he_channel_width_cap phy_he_channel_width_cap;
+	enum icnss_phy_qam_cap phy_qam_cap;
 };
 
 #define icnss_register_driver(ops)		\

+ 8 - 11
wlan_platform_modules.bzl

@@ -9,10 +9,7 @@ _module_enablement_map = {
     "icnss2": [],
     "cnss_nl": ["ALL"],
     "cnss_prealloc": ["ALL"],
-    # List specific target/variants if needed
-    "cnss_utils": [
-        "pineapple_consolidate",
-    ],
+    "cnss_utils": ["ALL"],
     "wlan_firmware_service": ["ALL"],
     "cnss_plat_ipc_qmi_svc": ["ALL"],
 }
@@ -47,7 +44,7 @@ def _define_modules_for_target_variant(target, variant):
         ]),
         includes = ["cnss", "cnss_utils"],
         kconfig = "cnss2/Kconfig",
-        defconfig = "build/{}_defconfig".format(tv),
+        defconfig = "cnss2/{}_defconfig".format(tv),
         conditional_srcs =  {
             "CONFIG_CNSS2_QMI": {
                 True: [
@@ -87,7 +84,7 @@ def _define_modules_for_target_variant(target, variant):
         ]),
         includes = ["icnss2", "cnss_utils"],
         kconfig = "icnss2/Kconfig",
-        defconfig = "build/{}_defconfig".format(tv),
+        defconfig = "icnss2/{}_defconfig".format(tv),
         conditional_srcs = {
             "CONFIG_ICNSS2_QMI": {
                 True: [
@@ -112,7 +109,7 @@ def _define_modules_for_target_variant(target, variant):
             "cnss_genl/cnss_nl.c",
         ],
         kconfig = "cnss_genl/Kconfig",
-        defconfig = "build/{}_defconfig".format(tv),
+        defconfig = "cnss_genl/{}_defconfig".format(tv),
         out = "cnss_nl.ko",
         kernel_build = "//msm-kernel:{}".format(tv),
         deps = [
@@ -129,7 +126,7 @@ def _define_modules_for_target_variant(target, variant):
         ]),
         includes = ["cnss_utils"],
         kconfig = "cnss_prealloc/Kconfig",
-        defconfig = "build/{}_defconfig".format(tv),
+        defconfig = "cnss_prealloc/{}_defconfig".format(tv),
         out = "cnss_prealloc.ko",
         kernel_build = "//msm-kernel:{}".format(tv),
         deps = [
@@ -145,7 +142,7 @@ def _define_modules_for_target_variant(target, variant):
             "cnss_utils/*.h"
         ]),
         kconfig = "cnss_utils/Kconfig",
-        defconfig = "build/{}_defconfig".format(tv),
+        defconfig = "cnss_utils/{}_defconfig".format(tv),
         out = "cnss_utils.ko",
         kernel_build = "//msm-kernel:{}".format(tv),
         deps = [
@@ -162,7 +159,7 @@ def _define_modules_for_target_variant(target, variant):
             "cnss_utils/*.h"
         ]),
         kconfig = "cnss_utils/Kconfig",
-        defconfig = "build/{}_defconfig".format(tv),
+        defconfig = "cnss_utils/{}_defconfig".format(tv),
         out = "wlan_firmware_service.ko",
         kernel_build = "//msm-kernel:{}".format(tv),
         deps = ["//msm-kernel:all_headers"],
@@ -176,7 +173,7 @@ def _define_modules_for_target_variant(target, variant):
             "cnss_utils/*.h"
         ]),
         kconfig = "cnss_utils/Kconfig",
-        defconfig = "build/{}_defconfig".format(tv),
+        defconfig = "cnss_utils/{}_defconfig".format(tv),
         out = "cnss_plat_ipc_qmi_svc.ko",
         kernel_build = "//msm-kernel:{}".format(tv),
         deps = ["//msm-kernel:all_headers"],