Commit 424a6112 authored by Ajay Singh's avatar Ajay Singh Committed by Greg Kroah-Hartman

staging: wilc1000: handle p2p operations in caller context

Moved the handling of p2p related operation in the caller context instead
of using workqueue.
Signed-off-by: default avatarAjay Singh <ajay.kathat@microchip.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 95392b02
...@@ -965,11 +965,8 @@ static int handle_remain_on_chan(struct wilc_vif *vif, ...@@ -965,11 +965,8 @@ static int handle_remain_on_chan(struct wilc_vif *vif,
return 0; return 0;
} }
static void handle_listen_state_expired(struct work_struct *work) static int wilc_handle_roc_expired(struct wilc_vif *vif, u64 cookie)
{ {
struct host_if_msg *msg = container_of(work, struct host_if_msg, work);
struct wilc_vif *vif = msg->vif;
struct wilc_remain_ch *hif_remain_ch = &msg->body.remain_on_ch;
u8 remain_on_chan_flag; u8 remain_on_chan_flag;
struct wid wid; struct wid wid;
int result; int result;
...@@ -981,10 +978,10 @@ static void handle_listen_state_expired(struct work_struct *work) ...@@ -981,10 +978,10 @@ static void handle_listen_state_expired(struct work_struct *work)
wid.id = WID_REMAIN_ON_CHAN; wid.id = WID_REMAIN_ON_CHAN;
wid.type = WID_STR; wid.type = WID_STR;
wid.size = 2; wid.size = 2;
wid.val = kmalloc(wid.size, GFP_KERNEL);
wid.val = kmalloc(wid.size, GFP_KERNEL);
if (!wid.val) if (!wid.val)
goto free_msg; return -ENOMEM;
wid.val[0] = remain_on_chan_flag; wid.val[0] = remain_on_chan_flag;
wid.val[1] = WILC_FALSE_FRMWR_CHANNEL; wid.val[1] = WILC_FALSE_FRMWR_CHANNEL;
...@@ -994,18 +991,25 @@ static void handle_listen_state_expired(struct work_struct *work) ...@@ -994,18 +991,25 @@ static void handle_listen_state_expired(struct work_struct *work)
kfree(wid.val); kfree(wid.val);
if (result != 0) { if (result != 0) {
netdev_err(vif->ndev, "Failed to set remain channel\n"); netdev_err(vif->ndev, "Failed to set remain channel\n");
goto free_msg; return -EINVAL;
} }
if (hif_drv->remain_on_ch.expired) { if (hif_drv->remain_on_ch.expired) {
hif_drv->remain_on_ch.expired(hif_drv->remain_on_ch.arg, hif_drv->remain_on_ch.expired(hif_drv->remain_on_ch.arg,
hif_remain_ch->cookie); cookie);
} }
} else { } else {
netdev_dbg(vif->ndev, "Not in listen state\n"); netdev_dbg(vif->ndev, "Not in listen state\n");
} }
free_msg: return 0;
}
static void wilc_handle_listen_state_expired(struct work_struct *work)
{
struct host_if_msg *msg = container_of(work, struct host_if_msg, work);
wilc_handle_roc_expired(msg->vif, msg->body.remain_on_ch.cookie);
kfree(msg); kfree(msg);
} }
...@@ -1019,7 +1023,7 @@ static void listen_timer_cb(struct timer_list *t) ...@@ -1019,7 +1023,7 @@ static void listen_timer_cb(struct timer_list *t)
del_timer(&vif->hif_drv->remain_on_ch_timer); del_timer(&vif->hif_drv->remain_on_ch_timer);
msg = wilc_alloc_work(vif, handle_listen_state_expired, false); msg = wilc_alloc_work(vif, wilc_handle_listen_state_expired, false);
if (IS_ERR(msg)) if (IS_ERR(msg))
return; return;
...@@ -1841,30 +1845,14 @@ int wilc_remain_on_channel(struct wilc_vif *vif, u64 cookie, ...@@ -1841,30 +1845,14 @@ int wilc_remain_on_channel(struct wilc_vif *vif, u64 cookie,
int wilc_listen_state_expired(struct wilc_vif *vif, u64 cookie) int wilc_listen_state_expired(struct wilc_vif *vif, u64 cookie)
{ {
int result; if (!vif->hif_drv) {
struct host_if_msg *msg;
struct host_if_drv *hif_drv = vif->hif_drv;
if (!hif_drv) {
netdev_err(vif->ndev, "%s: hif driver is NULL", __func__); netdev_err(vif->ndev, "%s: hif driver is NULL", __func__);
return -EFAULT; return -EFAULT;
} }
del_timer(&hif_drv->remain_on_ch_timer); del_timer(&vif->hif_drv->remain_on_ch_timer);
msg = wilc_alloc_work(vif, handle_listen_state_expired, false);
if (IS_ERR(msg))
return PTR_ERR(msg);
msg->body.remain_on_ch.cookie = cookie;
result = wilc_enqueue_work(msg);
if (result) {
netdev_err(vif->ndev, "%s: enqueue work failed\n", __func__);
kfree(msg);
}
return result; return wilc_handle_roc_expired(vif, cookie);
} }
void wilc_frame_register(struct wilc_vif *vif, u16 frame_type, bool reg) void wilc_frame_register(struct wilc_vif *vif, u16 frame_type, bool reg)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment