diff options
author | S Tateno <shigekatsu.tateno@atmel.com> | 2014-06-17 15:50:57 +0100 |
---|---|---|
committer | Mandar Padmawar <mpadmawar@nvidia.com> | 2014-07-10 02:05:13 -0700 |
commit | 2d988b0dd9beaa29aa92d3194608f0da445085fc (patch) | |
tree | 7fb784ca6d2d6c11ea9f8ed2d5e611873e014566 | |
parent | 16b1cb1fd94cdea4e1b18df59e908c4396cd36e1 (diff) |
staging: ozwpan: kobject_uevent_env() from process context
Call kobject_uevent_env() always from process context.
Bug 1523226
Reviewed-on: http://git-master/r/425002
(cherry picked from commit a7168d798724a3049f6dc53cd0f35d2c34163e48)
Change-Id: I65e52eda1349b2a807c323d3f8768e1bda516a45
Signed-off-by: S Tateno <shigekatsu.tateno@atmel.com>
Signed-off-by: Vinayak Pane <vpane@nvidia.com>
Reviewed-on: http://git-master/r/426903
(cherry picked from commit aa608de59a483a9e868bb77b0e9460ec0eb551d6)
Reviewed-on: http://git-master/r/435716
GVS: Gerrit_Virtual_Submit
Reviewed-by: Anshul Jain (SW) <anshulj@nvidia.com>
Tested-by: Anshul Jain (SW) <anshulj@nvidia.com>
-rw-r--r-- | drivers/staging/ozwpan/ozpd.c | 40 | ||||
-rw-r--r-- | drivers/staging/ozwpan/ozpd.h | 2 | ||||
-rw-r--r-- | drivers/staging/ozwpan/ozproto.c | 9 |
3 files changed, 35 insertions, 16 deletions
diff --git a/drivers/staging/ozwpan/ozpd.c b/drivers/staging/ozwpan/ozpd.c index ad4acb59e8d9..def50af78132 100644 --- a/drivers/staging/ozwpan/ozpd.c +++ b/drivers/staging/ozwpan/ozpd.c @@ -268,8 +268,38 @@ void oz_pd_destroy(struct oz_pd *pd) memset(&pd->workitem, 0, sizeof(pd->workitem)); INIT_WORK(&pd->workitem, oz_pd_free); ret = schedule_work(&pd->workitem); + if (!ret) + pr_info("failed to schedule workitem\n"); +} +/*------------------------------------------------------------------------------ + */ +static void oz_pd_uevent_workitem(struct work_struct *work) +{ + struct oz_pd *pd; + char mac_buf[20]; + char *envp[2]; - if (ret) + pd = container_of(work, struct oz_pd, uevent_workitem); + + oz_trace_msg(D, "uevent ID_MAC:%pm\n", pd->mac_addr); + snprintf(mac_buf, sizeof(mac_buf), "ID_MAC=%pm", pd->mac_addr); + envp[0] = mac_buf; + envp[1] = NULL; + kobject_uevent_env(&g_oz_wpan_dev->kobj, KOBJ_CHANGE, envp); + oz_pd_put(pd); +} +/*------------------------------------------------------------------------------ + */ +void oz_pd_notify_uevent(struct oz_pd *pd) +{ + int ret; + + oz_pd_get(pd); + memset(&pd->uevent_workitem, 0, sizeof(pd->uevent_workitem)); + INIT_WORK(&pd->uevent_workitem, oz_pd_uevent_workitem); + ret = schedule_work(&pd->uevent_workitem); + + if (!ret) oz_trace("failed to schedule workitem\n"); } @@ -374,12 +404,6 @@ int oz_pd_sleep(struct oz_pd *pd) { int do_stop = 0; u16 stop_apps = 0; - char mac_buf[20]; - char *envp[2]; - - snprintf(mac_buf, sizeof(mac_buf), "ID_MAC=%pm", pd->mac_addr); - envp[0] = mac_buf; - envp[1] = NULL; oz_polling_lock_bh(); if (pd->state & (OZ_PD_S_SLEEP | OZ_PD_S_STOPPED)) { oz_polling_unlock_bh(); @@ -389,7 +413,7 @@ int oz_pd_sleep(struct oz_pd *pd) if (pd->keep_alive >= OZ_KALIVE_INFINITE) oz_pd_indicate_farewells(pd); oz_pd_set_state(pd, OZ_PD_S_SLEEP); - kobject_uevent_env(&g_oz_wpan_dev->kobj, KOBJ_CHANGE, envp); + oz_pd_notify_uevent(pd); } else { do_stop = 1; } diff --git a/drivers/staging/ozwpan/ozpd.h b/drivers/staging/ozwpan/ozpd.h index a4270fe69ee5..5f5e7241ff47 100644 --- a/drivers/staging/ozwpan/ozpd.h +++ b/drivers/staging/ozwpan/ozpd.h @@ -109,6 +109,7 @@ struct oz_pd { struct tasklet_struct timeout_tasklet; unsigned long tasklet_sched; struct work_struct workitem; + struct work_struct uevent_workitem; u8 up_audio_buf; }; @@ -134,5 +135,6 @@ int oz_send_isoc_unit(struct oz_pd *pd, u8 ep_num, const u8 *data, int len); void oz_handle_app_elt(struct oz_pd *pd, u8 app_id, struct oz_elt *elt); void oz_apps_init(void); void oz_apps_term(void); +void oz_pd_notify_uevent(struct oz_pd *pd); #endif /* Sentry */ diff --git a/drivers/staging/ozwpan/ozproto.c b/drivers/staging/ozwpan/ozproto.c index 1066c4e49ad7..a9eea6e0692d 100644 --- a/drivers/staging/ozwpan/ozproto.c +++ b/drivers/staging/ozwpan/ozproto.c @@ -352,15 +352,8 @@ static void oz_rx_frame(struct sk_buff *skb) pd = oz_pd_find(src_addr); if (pd) { if (!(pd->state & OZ_PD_S_CONNECTED)) { - char mac_buf[20]; - char *envp[2]; - snprintf(mac_buf, sizeof(mac_buf), "ID_MAC=%pm", - pd->mac_addr); - envp[0] = mac_buf; - envp[1] = NULL; oz_pd_set_state(pd, OZ_PD_S_CONNECTED); - kobject_uevent_env(&g_oz_wpan_dev->kobj, KOBJ_CHANGE, - envp); + oz_pd_notify_uevent(pd); } getnstimeofday(¤t_time); if ((current_time.tv_sec != pd->last_rx_timestamp.tv_sec) || |