msm: smd: Fix Modem-FW subsystem restart support
Completely close Modem SW<->Modem FW edge in SMD
if the modem is restarted since Modem SW and
Modem FW are considered to be a single subsystem
for subsystem restart.
Signed-off-by: Eric Holmberg <eholmber@codeaurora.org>
diff --git a/arch/arm/mach-msm/smd.c b/arch/arm/mach-msm/smd.c
index 3db19b6..7dec32a 100644
--- a/arch/arm/mach-msm/smd.c
+++ b/arch/arm/mach-msm/smd.c
@@ -591,6 +591,16 @@
return ret;
}
+static void smd_reset_edge(struct smd_half_channel *ch, unsigned new_state)
+{
+ if (ch->state != SMD_SS_CLOSED) {
+ ch->state = new_state;
+ ch->fDSR = 0;
+ ch->fCTS = 0;
+ ch->fCD = 0;
+ ch->fSTATE = 1;
+ }
+}
static void smd_channel_reset_state(struct smd_alloc_elm *shared,
unsigned new_state, unsigned pid)
@@ -612,20 +622,17 @@
if (!shared2)
continue;
- if (pid_is_on_edge(shared2, type, pid, &local_ch, &remote_ch) ||
- (pid == SMSM_MODEM &&
- pid_is_on_edge(shared2, type, SMD_MODEM_Q6_FW,
- &local_ch, &remote_ch))) {
+ if (pid_is_on_edge(shared2, type, pid, &local_ch, &remote_ch))
+ smd_reset_edge(local_ch, new_state);
- /* force remote state for processor being restarted */
- if (local_ch->state != SMD_SS_CLOSED) {
- local_ch->state = new_state;
- local_ch->fDSR = 0;
- local_ch->fCTS = 0;
- local_ch->fCD = 0;
- local_ch->fSTATE = 1;
- }
- }
+ /*
+ * ModemFW is in the same subsystem as ModemSW, but has
+ * separate SMD edges that need to be reset.
+ */
+ if (pid == SMSM_MODEM &&
+ pid_is_on_edge(shared2, type, SMD_MODEM_Q6_FW,
+ &local_ch, &remote_ch))
+ smd_reset_edge(local_ch, new_state);
}
}