|
@@ -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);
|
|
|
}
|