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: Ajay Singh <ajay.kathat@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
976c89b562
commit
147ccfd451
@ -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 {
|
|||||||
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 @@ error:
|
|||||||
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)
|
|||||||
|
|
||||||
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 *)®_frame;
|
||||||
|
|
||||||
|
memset(®_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 {
|
|||||||
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;
|
||||||
|
Loading…
Reference in New Issue
Block a user