Revert "msm: ipc: Trigger loading only the default subsystem"
This reverts commit 0424710ca8fa552977b82454607bb3c04a70cf66 to
resolve 8064 Liquid Bootup issue temporarily.
Signed-off-by: Karthikeyan Ramasubramanian <kramasub@codeaurora.org>
diff --git a/arch/arm/mach-msm/ipc_router.h b/arch/arm/mach-msm/ipc_router.h
index a90be23..462543e 100644
--- a/arch/arm/mach-msm/ipc_router.h
+++ b/arch/arm/mach-msm/ipc_router.h
@@ -138,7 +138,7 @@
struct msm_ipc_sock {
struct sock sk;
struct msm_ipc_port *port;
- void *default_pil;
+ void *modem_pil;
};
enum write_data_type {
@@ -206,15 +206,4 @@
int msm_ipc_router_init_sockets(void);
void msm_ipc_router_exit_sockets(void);
-#if defined CONFIG_MSM_IPC_ROUTER_SMD_XPRT
-extern void *msm_ipc_load_default_node(void);
-
-extern void msm_ipc_unload_default_node(void *pil);
-#else
-static inline void *msm_ipc_load_default_node(void)
-{ return NULL; }
-
-static inline void msm_ipc_unload_default_node(void *pil) { }
-#endif
-
#endif
diff --git a/arch/arm/mach-msm/ipc_router_smd_xprt.c b/arch/arm/mach-msm/ipc_router_smd_xprt.c
index 307b6ae..0cde393 100644
--- a/arch/arm/mach-msm/ipc_router_smd_xprt.c
+++ b/arch/arm/mach-msm/ipc_router_smd_xprt.c
@@ -19,7 +19,6 @@
#include <linux/types.h>
#include <mach/msm_smd.h>
-#include <mach/peripheral-loader.h>
#include "ipc_router.h"
#include "smd_private.h"
@@ -443,31 +442,6 @@
return 0;
}
-void *msm_ipc_load_default_node(void)
-{
- void *pil = NULL;
- const char *peripheral;
-
- peripheral = smd_edge_to_subsystem(SMD_APPS_MODEM);
- if (peripheral && !strncmp(peripheral, "modem", 6)) {
- pil = pil_get(peripheral);
- if (IS_ERR(pil)) {
- pr_err("%s: Failed to load %s\n",
- __func__, peripheral);
- pil = NULL;
- }
- }
- return pil;
-}
-EXPORT_SYMBOL(msm_ipc_load_default_node);
-
-void msm_ipc_unload_default_node(void *pil)
-{
- if (pil)
- pil_put(pil);
-}
-EXPORT_SYMBOL(msm_ipc_unload_default_node);
-
static struct platform_driver msm_ipc_router_smd_remote_driver[] = {
{
.probe = msm_ipc_router_smd_remote_probe,
diff --git a/arch/arm/mach-msm/ipc_socket.c b/arch/arm/mach-msm/ipc_socket.c
index d1ed538..6e8c99e 100644
--- a/arch/arm/mach-msm/ipc_socket.c
+++ b/arch/arm/mach-msm/ipc_socket.c
@@ -26,15 +26,58 @@
#include <net/sock.h>
+#include <mach/peripheral-loader.h>
+#include <mach/socinfo.h>
+
#include "ipc_router.h"
#define msm_ipc_sk(sk) ((struct msm_ipc_sock *)(sk))
#define msm_ipc_sk_port(sk) ((struct msm_ipc_port *)(msm_ipc_sk(sk)->port))
+#define MODEM_LOAD_TIMEOUT (10 * HZ)
static int sockets_enabled;
static struct proto msm_ipc_proto;
static const struct proto_ops msm_ipc_proto_ops;
+static void msm_ipc_router_unload_modem(void *pil)
+{
+ if (pil)
+ pil_put(pil);
+}
+
+static void *msm_ipc_router_load_modem(void)
+{
+ void *pil = NULL;
+ int rc;
+
+ /* Load GNSS for Standalone 8064 but not for Fusion 3 */
+ if (cpu_is_apq8064()) {
+ if (socinfo_get_platform_subtype() == 0x0)
+ pil = pil_get("gss");
+ } else {
+ pil = pil_get("modem");
+ }
+
+ if (IS_ERR(pil) || !pil) {
+ pr_debug("%s: modem load failed\n", __func__);
+ pil = NULL;
+ } else {
+ rc = wait_for_completion_interruptible_timeout(
+ &msm_ipc_remote_router_up,
+ MODEM_LOAD_TIMEOUT);
+ if (!rc)
+ rc = -ETIMEDOUT;
+ if (rc < 0) {
+ pr_err("%s: wait for remote router failed %d\n",
+ __func__, rc);
+ msm_ipc_router_unload_modem(pil);
+ pil = NULL;
+ }
+ }
+
+ return pil;
+}
+
static struct sk_buff_head *msm_ipc_router_build_msg(unsigned int num_sect,
struct iovec const *msg_sect,
size_t total_len)
@@ -201,9 +244,9 @@
sock_init_data(sock, sk);
sk->sk_rcvtimeo = DEFAULT_RCV_TIMEO;
- pil = msm_ipc_load_default_node();
+ pil = msm_ipc_router_load_modem();
msm_ipc_sk(sk)->port = port_ptr;
- msm_ipc_sk(sk)->default_pil = pil;
+ msm_ipc_sk(sk)->modem_pil = pil;
return 0;
}
@@ -452,12 +495,12 @@
{
struct sock *sk = sock->sk;
struct msm_ipc_port *port_ptr = msm_ipc_sk_port(sk);
- void *pil = msm_ipc_sk(sk)->default_pil;
+ void *pil = msm_ipc_sk(sk)->modem_pil;
int ret;
lock_sock(sk);
ret = msm_ipc_router_close_port(port_ptr);
- msm_ipc_unload_default_node(pil);
+ msm_ipc_router_unload_modem(pil);
release_sock(sk);
sock_put(sk);
sock->sk = NULL;