summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorVinayak Pane <vpane@nvidia.com>2014-06-18 13:10:50 -0700
committerMandar Padmawar <mpadmawar@nvidia.com>2014-07-10 02:05:12 -0700
commit16b1cb1fd94cdea4e1b18df59e908c4396cd36e1 (patch)
tree5f9ec03bbcc35fcba6e87ee4fd69beba619249a5 /drivers
parent688e12e0d7a7926a01447953c9811f51d87b365c (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.c57
-rw-r--r--drivers/staging/ozwpan/ozpd.h2
-rw-r--r--drivers/staging/ozwpan/ozproto.c9
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(&current_time);
if ((current_time.tv_sec != pd->last_rx_timestamp.tv_sec) ||