/* * Context: softirq */ int oz_pd_sleep(struct oz_pd *pd) { int do_stop = 0; u16 stop_apps; oz_polling_lock_bh(); if (pd->state & (OZ_PD_S_SLEEP | OZ_PD_S_STOPPED)) { oz_polling_unlock_bh(); return 0; } if (pd->keep_alive && pd->session_id) oz_pd_set_state(pd, OZ_PD_S_SLEEP); else do_stop = 1; stop_apps = pd->total_apps; oz_polling_unlock_bh(); if (do_stop) { oz_pd_stop(pd); } else { oz_services_stop(pd, stop_apps, 1); oz_timer_add(pd, OZ_TIMER_STOP, pd->keep_alive); } return do_stop; }
/*------------------------------------------------------------------------------ * Context: softirq */ int oz_pd_sleep(struct oz_pd *pd) { int do_stop = 0; u16 stop_apps = 0; oz_polling_lock_bh(); if (pd->state & (OZ_PD_S_SLEEP | OZ_PD_S_STOPPED)) { oz_polling_unlock_bh(); return 0; } if (pd->keep_alive_j && pd->session_id) { oz_pd_set_state(pd, OZ_PD_S_SLEEP); pd->pulse_time_j = jiffies + pd->keep_alive_j; oz_trace("Sleep Now %lu until %lu\n", jiffies, pd->pulse_time_j); } else { do_stop = 1; } stop_apps = pd->total_apps; oz_polling_unlock_bh(); if (do_stop) { oz_pd_stop(pd); } else { oz_services_stop(pd, stop_apps, 1); oz_timer_add(pd, OZ_TIMER_STOP, jiffies + pd->keep_alive_j, 1); } return do_stop; }
/*------------------------------------------------------------------------------ * Context: softirq */ int oz_pd_sleep(struct oz_pd *pd) { int do_stop = 0; u16 stop_apps = 0; oz_polling_lock_bh(); if (pd->state & (OZ_PD_S_SLEEP | OZ_PD_S_STOPPED)) { oz_polling_unlock_bh(); return 0; } if (pd->keep_alive && pd->session_id) { if (pd->keep_alive >= OZ_KALIVE_INFINITE) oz_pd_indicate_farewells(pd); oz_pd_set_state(pd, OZ_PD_S_SLEEP); oz_pd_notify_uevent(pd); } else { do_stop = 1; } stop_apps = pd->total_apps; oz_polling_unlock_bh(); if (do_stop) { oz_pd_stop(pd); } else { oz_services_stop(pd, stop_apps, 1); oz_timer_add(pd, OZ_TIMER_STOP, pd->keep_alive); } return do_stop; }
/*------------------------------------------------------------------------------ * Context: softirq or process */ void oz_pd_stop(struct oz_pd *pd) { u16 stop_apps = 0; oz_trace_msg(M, "oz_pd_stop() State = 0x%x\n", pd->state); oz_polling_lock_bh(); oz_pd_indicate_farewells(pd); stop_apps = pd->total_apps; pd->total_apps = 0; pd->paused_apps = 0; oz_polling_unlock_bh(); oz_services_stop(pd, stop_apps, 0); oz_polling_lock_bh(); oz_pd_set_state(pd, OZ_PD_S_STOPPED); if (hrtimer_active(&pd->timeout)) { oz_trace_msg(M, "hrtimer timeout active\n"); hrtimer_cancel(&pd->timeout); } if (hrtimer_active(&pd->heartbeat)) { oz_trace_msg(M, "hrtimer heartbeat active\n"); hrtimer_cancel(&pd->heartbeat); } /* connect_req will restart timers */ /* Remove from PD list.*/ list_del(&pd->link); oz_polling_unlock_bh(); oz_trace_msg(M, "pd ref count = %d\n", atomic_read(&pd->ref_count)); oz_pd_put(pd); }
/*------------------------------------------------------------------------------ * Context: softirq or process */ void oz_pd_stop(struct oz_pd *pd) { u16 stop_apps = 0; oz_trace("oz_pd_stop() State = 0x%x\n", pd->state); oz_pd_indicate_farewells(pd); oz_polling_lock_bh(); stop_apps = pd->total_apps; pd->total_apps = 0; pd->paused_apps = 0; oz_polling_unlock_bh(); oz_services_stop(pd, stop_apps, 0); oz_polling_lock_bh(); oz_pd_set_state(pd, OZ_PD_S_STOPPED); /* Remove from PD list.*/ list_del(&pd->link); oz_polling_unlock_bh(); oz_trace("pd ref count = %d\n", atomic_read(&pd->ref_count)); oz_timer_delete(pd, 0); oz_pd_put(pd); }
/*------------------------------------------------------------------------------ * Context: softirq or process */ void oz_services_stop(struct oz_pd *pd, u16 apps, int pause) { struct oz_app_if *ai; oz_trace("oz_stop_services(0x%x) pause(%d)\n", apps, pause); for (ai = g_app_if; ai < &g_app_if[OZ_APPID_MAX]; ai++) { if (apps & (1<<ai->app_id)) { oz_polling_lock_bh(); if (pause) { pd->paused_apps |= (1<<ai->app_id); } else { pd->total_apps &= ~(1<<ai->app_id); pd->paused_apps &= ~(1<<ai->app_id); } oz_polling_unlock_bh(); ai->stop(pd, pause); } } }
/*------------------------------------------------------------------------------ * Context: softirq-serialized */ int oz_services_start(struct oz_pd *pd, u16 apps, int resume) { struct oz_app_if *ai; int rc = 0; oz_trace("oz_services_start(0x%x) resume(%d)\n", apps, resume); for (ai = g_app_if; ai < &g_app_if[OZ_APPID_MAX]; ai++) { if (apps & (1<<ai->app_id)) { if (ai->start(pd, resume)) { rc = -1; oz_trace("Unabled to start service %d\n", ai->app_id); break; } oz_polling_lock_bh(); pd->total_apps |= (1<<ai->app_id); if (resume) pd->paused_apps &= ~(1<<ai->app_id); oz_polling_unlock_bh(); } } return rc; }