summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorS Tateno <shigekatsu.tateno@atmel.com>2014-06-17 15:50:57 +0100
committerMandar Padmawar <mpadmawar@nvidia.com>2014-07-10 02:05:13 -0700
commit2d988b0dd9beaa29aa92d3194608f0da445085fc (patch)
tree7fb784ca6d2d6c11ea9f8ed2d5e611873e014566
parent16b1cb1fd94cdea4e1b18df59e908c4396cd36e1 (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.c40
-rw-r--r--drivers/staging/ozwpan/ozpd.h2
-rw-r--r--drivers/staging/ozwpan/ozproto.c9
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(&current_time);
if ((current_time.tv_sec != pd->last_rx_timestamp.tv_sec) ||