Commit 147ccfd4 authored by Ajay Singh's avatar Ajay Singh Committed by Greg Kroah-Hartman

staging: wilc1000: handle mgmt_frame_register ops from cfg82011 context

Avoid handling of mgmt_frame_register operation callback in a deferred
manner. Now set the wid command to firmware directly from caller
context.
Signed-off-by: default avatarAjay Singh <ajay.kathat@microchip.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 976c89b5
...@@ -89,6 +89,12 @@ struct del_all_sta { ...@@ -89,6 +89,12 @@ struct del_all_sta {
u8 mac[WILC_MAX_NUM_STA][ETH_ALEN]; u8 mac[WILC_MAX_NUM_STA][ETH_ALEN];
}; };
struct wilc_reg_frame {
bool reg;
u8 reg_id;
__le32 frame_type;
} __packed;
struct set_ip_addr { struct set_ip_addr {
u8 *ip_addr; u8 *ip_addr;
u8 idx; u8 idx;
...@@ -115,7 +121,6 @@ union message_body { ...@@ -115,7 +121,6 @@ union message_body {
struct get_mac_addr get_mac_info; struct get_mac_addr get_mac_info;
struct ba_session_info session_info; struct ba_session_info session_info;
struct remain_ch remain_on_ch; struct remain_ch remain_on_ch;
struct reg_frame reg_frame;
char *data; char *data;
}; };
...@@ -1963,39 +1968,6 @@ static int handle_remain_on_chan(struct wilc_vif *vif, ...@@ -1963,39 +1968,6 @@ static int handle_remain_on_chan(struct wilc_vif *vif,
return result; return result;
} }
static void handle_register_frame(struct work_struct *work)
{
struct host_if_msg *msg = container_of(work, struct host_if_msg, work);
struct wilc_vif *vif = msg->vif;
struct reg_frame *hif_reg_frame = &msg->body.reg_frame;
int result;
struct wid wid;
u8 *cur_byte;
wid.id = WID_REGISTER_FRAME;
wid.type = WID_STR;
wid.val = kmalloc(sizeof(u16) + 2, GFP_KERNEL);
if (!wid.val)
goto out;
cur_byte = wid.val;
*cur_byte++ = hif_reg_frame->reg;
*cur_byte++ = hif_reg_frame->reg_id;
memcpy(cur_byte, &hif_reg_frame->frame_type, sizeof(u16));
wid.size = sizeof(u16) + 2;
result = wilc_send_config_pkt(vif, WILC_SET_CFG, &wid, 1,
wilc_get_vif_idx(vif));
kfree(wid.val);
if (result)
netdev_err(vif->ndev, "Failed to frame register\n");
out:
kfree(msg);
}
static void handle_listen_state_expired(struct work_struct *work) static void handle_listen_state_expired(struct work_struct *work)
{ {
struct host_if_msg *msg = container_of(work, struct host_if_msg, work); struct host_if_msg *msg = container_of(work, struct host_if_msg, work);
...@@ -3162,33 +3134,35 @@ int wilc_listen_state_expired(struct wilc_vif *vif, u32 session_id) ...@@ -3162,33 +3134,35 @@ int wilc_listen_state_expired(struct wilc_vif *vif, u32 session_id)
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)
{ {
struct wid wid;
int result; int result;
struct host_if_msg *msg; struct wilc_reg_frame reg_frame;
msg = wilc_alloc_work(vif, handle_register_frame, false); wid.id = WID_REGISTER_FRAME;
if (IS_ERR(msg)) wid.type = WID_STR;
return; wid.size = sizeof(reg_frame);
wid.val = (u8 *)&reg_frame;
memset(&reg_frame, 0x0, sizeof(reg_frame));
reg_frame.reg = reg;
switch (frame_type) { switch (frame_type) {
case IEEE80211_STYPE_ACTION: case IEEE80211_STYPE_ACTION:
msg->body.reg_frame.reg_id = WILC_FW_ACTION_FRM_IDX; reg_frame.reg_id = WILC_FW_ACTION_FRM_IDX;
break; break;
case IEEE80211_STYPE_PROBE_REQ: case IEEE80211_STYPE_PROBE_REQ:
msg->body.reg_frame.reg_id = WILC_FW_PROBE_REQ_IDX; reg_frame.reg_id = WILC_FW_PROBE_REQ_IDX;
break; break;
default: default:
break; break;
} }
msg->body.reg_frame.frame_type = frame_type; reg_frame.frame_type = cpu_to_le16(frame_type);
msg->body.reg_frame.reg = reg; result = wilc_send_config_pkt(vif, WILC_SET_CFG, &wid, 1,
wilc_get_vif_idx(vif));
result = wilc_enqueue_work(msg); if (result)
if (result) { netdev_err(vif->ndev, "Failed to frame register\n");
netdev_err(vif->ndev, "%s: enqueue work failed\n", __func__);
kfree(msg);
}
} }
int wilc_add_beacon(struct wilc_vif *vif, u32 interval, u32 dtim_period, int wilc_add_beacon(struct wilc_vif *vif, u32 interval, u32 dtim_period,
......
...@@ -244,12 +244,6 @@ struct remain_ch { ...@@ -244,12 +244,6 @@ struct remain_ch {
u32 id; u32 id;
}; };
struct reg_frame {
bool reg;
u16 frame_type;
u8 reg_id;
};
struct wilc; struct wilc;
struct host_if_drv { struct host_if_drv {
struct user_scan_req usr_scan_req; struct user_scan_req usr_scan_req;
......
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