diff options
author | Vinayak Pane <vpane@nvidia.com> | 2014-06-18 13:10:50 -0700 |
---|---|---|
committer | Mandar Padmawar <mpadmawar@nvidia.com> | 2014-07-10 02:05:12 -0700 |
commit | 16b1cb1fd94cdea4e1b18df59e908c4396cd36e1 (patch) | |
tree | 5f9ec03bbcc35fcba6e87ee4fd69beba619249a5 /drivers | |
parent | 688e12e0d7a7926a01447953c9811f51d87b365c (diff) |
Revert "staging: ozwpan: remove scheduling while atomic"
This reverts commit 3e6733bb4f62148b38af8ccbe56dc0e62a052138.
An improvised fix for this is provided by Atmel with patch
"staging: ozwpan: kobject_uevent_env() from process context"
which is submitted separately.
Reviewed-on: http://git-master/r/425001
(cherry picked from commit 2b0b08d23de2a59275c276df87f2b11237f833e9)
Change-Id: I91ded7b515dea4a9fd75a04fd98b66f67f789504
Signed-off-by: Vinayak Pane <vpane@nvidia.com>
Reviewed-on: http://git-master/r/426902
(cherry picked from commit 4cfff60103501540866dde35bd90e20fd721418f)
Reviewed-on: http://git-master/r/435715
GVS: Gerrit_Virtual_Submit
Reviewed-by: Anshul Jain (SW) <anshulj@nvidia.com>
Tested-by: Anshul Jain (SW) <anshulj@nvidia.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/staging/ozwpan/ozpd.c | 57 | ||||
-rw-r--r-- | drivers/staging/ozwpan/ozpd.h | 2 | ||||
-rw-r--r-- | drivers/staging/ozwpan/ozproto.c | 9 |
3 files changed, 20 insertions, 48 deletions
diff --git a/drivers/staging/ozwpan/ozpd.c b/drivers/staging/ozwpan/ozpd.c index 02bd478e9eed..ad4acb59e8d9 100644 --- a/drivers/staging/ozwpan/ozpd.c +++ b/drivers/staging/ozwpan/ozpd.c @@ -258,55 +258,16 @@ static void oz_pd_free(struct work_struct *work) */ void oz_pd_destroy(struct oz_pd *pd) { + int ret; + if (hrtimer_active(&pd->timeout)) hrtimer_cancel(&pd->timeout); if (hrtimer_active(&pd->heartbeat)) hrtimer_cancel(&pd->heartbeat); - if (in_softirq()) { - /* We are in softirq context, - * Should use work_queue to call free() in process context - */ - int ret; - memset(&pd->workitem, 0, sizeof(pd->workitem)); - INIT_WORK(&pd->workitem, oz_pd_free); - ret = schedule_work(&pd->workitem); - if (ret) - oz_trace("failed to schedule workitem\n"); - } else { - /* We are in process context. - * Call oz_pd_free() immediately. - */ - oz_pd_free(&pd->workitem); - } -} -/*------------------------------------------------------------------------------ - */ -static void oz_pd_uevent_workitem(struct work_struct *work) -{ - struct oz_pd *pd; - char mac_buf[20]; - char *envp[2]; - - 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); + memset(&pd->workitem, 0, sizeof(pd->workitem)); + INIT_WORK(&pd->workitem, oz_pd_free); + ret = schedule_work(&pd->workitem); if (ret) oz_trace("failed to schedule workitem\n"); @@ -413,6 +374,12 @@ 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(); @@ -422,7 +389,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); - oz_pd_notify_uevent(pd); + kobject_uevent_env(&g_oz_wpan_dev->kobj, KOBJ_CHANGE, envp); } else { do_stop = 1; } diff --git a/drivers/staging/ozwpan/ozpd.h b/drivers/staging/ozwpan/ozpd.h index 5f5e7241ff47..a4270fe69ee5 100644 --- a/drivers/staging/ozwpan/ozpd.h +++ b/drivers/staging/ozwpan/ozpd.h @@ -109,7 +109,6 @@ 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; }; @@ -135,6 +134,5 @@ 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 a9eea6e0692d..1066c4e49ad7 100644 --- a/drivers/staging/ozwpan/ozproto.c +++ b/drivers/staging/ozwpan/ozproto.c @@ -352,8 +352,15 @@ 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); - oz_pd_notify_uevent(pd); + kobject_uevent_env(&g_oz_wpan_dev->kobj, KOBJ_CHANGE, + envp); } getnstimeofday(¤t_time); if ((current_time.tv_sec != pd->last_rx_timestamp.tv_sec) || |