Commit 976c89b5 authored by Ajay Singh's avatar Ajay Singh Committed by Greg Kroah-Hartman

staging: wilc1000: handle add beacon operation callback from cfg80211 context

Refactor add/change beacon cfg80211 operation callback to handle from
cfg context. Also avoided extra copy of information by packing directly
in firmware expected format.
Signed-off-by: default avatarAjay Singh <ajay.kathat@microchip.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 38b3ffa0
...@@ -78,15 +78,6 @@ struct channel_attr { ...@@ -78,15 +78,6 @@ struct channel_attr {
u8 set_ch; u8 set_ch;
}; };
struct beacon_attr {
u32 interval;
u32 dtim_period;
u32 head_len;
u8 *head;
u32 tail_len;
u8 *tail;
};
struct set_multicast { struct set_multicast {
bool enabled; bool enabled;
u32 cnt; u32 cnt;
...@@ -116,7 +107,6 @@ union message_body { ...@@ -116,7 +107,6 @@ union message_body {
struct key_attr key_info; struct key_attr key_info;
struct cfg_param_attr cfg_info; struct cfg_param_attr cfg_info;
struct channel_attr channel_info; struct channel_attr channel_info;
struct beacon_attr beacon_info;
struct sta_inactive_t mac_info; struct sta_inactive_t mac_info;
struct set_ip_addr ip_info; struct set_ip_addr ip_info;
struct drv_handler drv; struct drv_handler drv;
...@@ -1878,62 +1868,6 @@ static void handle_get_inactive_time(struct work_struct *work) ...@@ -1878,62 +1868,6 @@ static void handle_get_inactive_time(struct work_struct *work)
complete(&msg->work_comp); complete(&msg->work_comp);
} }
static void handle_add_beacon(struct work_struct *work)
{
struct host_if_msg *msg = container_of(work, struct host_if_msg, work);
struct wilc_vif *vif = msg->vif;
struct beacon_attr *param = &msg->body.beacon_info;
int result;
struct wid wid;
u8 *cur_byte;
wid.id = WID_ADD_BEACON;
wid.type = WID_BIN;
wid.size = param->head_len + param->tail_len + 16;
wid.val = kmalloc(wid.size, GFP_KERNEL);
if (!wid.val)
goto error;
cur_byte = wid.val;
*cur_byte++ = (param->interval & 0xFF);
*cur_byte++ = ((param->interval >> 8) & 0xFF);
*cur_byte++ = ((param->interval >> 16) & 0xFF);
*cur_byte++ = ((param->interval >> 24) & 0xFF);
*cur_byte++ = (param->dtim_period & 0xFF);
*cur_byte++ = ((param->dtim_period >> 8) & 0xFF);
*cur_byte++ = ((param->dtim_period >> 16) & 0xFF);
*cur_byte++ = ((param->dtim_period >> 24) & 0xFF);
*cur_byte++ = (param->head_len & 0xFF);
*cur_byte++ = ((param->head_len >> 8) & 0xFF);
*cur_byte++ = ((param->head_len >> 16) & 0xFF);
*cur_byte++ = ((param->head_len >> 24) & 0xFF);
memcpy(cur_byte, param->head, param->head_len);
cur_byte += param->head_len;
*cur_byte++ = (param->tail_len & 0xFF);
*cur_byte++ = ((param->tail_len >> 8) & 0xFF);
*cur_byte++ = ((param->tail_len >> 16) & 0xFF);
*cur_byte++ = ((param->tail_len >> 24) & 0xFF);
if (param->tail)
memcpy(cur_byte, param->tail, param->tail_len);
cur_byte += param->tail_len;
result = wilc_send_config_pkt(vif, WILC_SET_CFG, &wid, 1,
wilc_get_vif_idx(vif));
if (result)
netdev_err(vif->ndev, "Failed to send add beacon\n");
error:
kfree(wid.val);
kfree(param->head);
kfree(param->tail);
kfree(msg);
}
static void wilc_hif_pack_sta_param(u8 *cur_byte, const u8 *mac, static void wilc_hif_pack_sta_param(u8 *cur_byte, const u8 *mac,
struct station_parameters *params) struct station_parameters *params)
{ {
...@@ -3258,47 +3192,43 @@ void wilc_frame_register(struct wilc_vif *vif, u16 frame_type, bool reg) ...@@ -3258,47 +3192,43 @@ void wilc_frame_register(struct wilc_vif *vif, u16 frame_type, bool reg)
} }
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,
u32 head_len, u8 *head, u32 tail_len, u8 *tail) struct cfg80211_beacon_data *params)
{ {
struct wid wid;
int result; int result;
struct host_if_msg *msg; u8 *cur_byte;
struct beacon_attr *beacon_info;
msg = wilc_alloc_work(vif, handle_add_beacon, false); wid.id = WID_ADD_BEACON;
if (IS_ERR(msg)) wid.type = WID_BIN;
return PTR_ERR(msg); wid.size = params->head_len + params->tail_len + 16;
wid.val = kzalloc(wid.size, GFP_KERNEL);
if (!wid.val)
return -ENOMEM;
beacon_info = &msg->body.beacon_info; cur_byte = wid.val;
beacon_info->interval = interval; put_unaligned_le32(interval, cur_byte);
beacon_info->dtim_period = dtim_period; cur_byte += 4;
beacon_info->head_len = head_len; put_unaligned_le32(dtim_period, cur_byte);
beacon_info->head = kmemdup(head, head_len, GFP_KERNEL); cur_byte += 4;
if (!beacon_info->head) { put_unaligned_le32(params->head_len, cur_byte);
result = -ENOMEM; cur_byte += 4;
goto error;
}
beacon_info->tail_len = tail_len;
if (tail_len > 0) { if (params->head_len > 0)
beacon_info->tail = kmemdup(tail, tail_len, GFP_KERNEL); memcpy(cur_byte, params->head, params->head_len);
if (!beacon_info->tail) { cur_byte += params->head_len;
result = -ENOMEM;
goto error;
}
} else {
beacon_info->tail = NULL;
}
result = wilc_enqueue_work(msg); put_unaligned_le32(params->tail_len, cur_byte);
cur_byte += 4;
if (params->tail_len > 0)
memcpy(cur_byte, params->tail, params->tail_len);
result = wilc_send_config_pkt(vif, WILC_SET_CFG, &wid, 1,
wilc_get_vif_idx(vif));
if (result) if (result)
netdev_err(vif->ndev, "%s: enqueue work failed\n", __func__); netdev_err(vif->ndev, "Failed to send add beacon\n");
error: kfree(wid.val);
if (result) {
kfree(beacon_info->head);
kfree(beacon_info->tail);
kfree(msg);
}
return result; return result;
} }
......
...@@ -324,7 +324,7 @@ int wilc_hif_set_cfg(struct wilc_vif *vif, ...@@ -324,7 +324,7 @@ int wilc_hif_set_cfg(struct wilc_vif *vif,
int wilc_init(struct net_device *dev, struct host_if_drv **hif_drv_handler); int wilc_init(struct net_device *dev, struct host_if_drv **hif_drv_handler);
int wilc_deinit(struct wilc_vif *vif); int wilc_deinit(struct wilc_vif *vif);
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,
u32 head_len, u8 *head, u32 tail_len, u8 *tail); struct cfg80211_beacon_data *params);
int wilc_del_beacon(struct wilc_vif *vif); int wilc_del_beacon(struct wilc_vif *vif);
int wilc_add_station(struct wilc_vif *vif, const u8 *mac, int wilc_add_station(struct wilc_vif *vif, const u8 *mac,
struct station_parameters *params); struct station_parameters *params);
......
...@@ -1768,11 +1768,9 @@ static int start_ap(struct wiphy *wiphy, struct net_device *dev, ...@@ -1768,11 +1768,9 @@ static int start_ap(struct wiphy *wiphy, struct net_device *dev,
{ {
struct wilc_vif *vif = netdev_priv(dev); struct wilc_vif *vif = netdev_priv(dev);
struct wilc *wl = vif->wilc; struct wilc *wl = vif->wilc;
struct cfg80211_beacon_data *beacon = &settings->beacon;
int ret; int ret;
ret = set_channel(wiphy, &settings->chandef); ret = set_channel(wiphy, &settings->chandef);
if (ret != 0) if (ret != 0)
netdev_err(dev, "Error in setting channel\n"); netdev_err(dev, "Error in setting channel\n");
...@@ -1780,9 +1778,7 @@ static int start_ap(struct wiphy *wiphy, struct net_device *dev, ...@@ -1780,9 +1778,7 @@ static int start_ap(struct wiphy *wiphy, struct net_device *dev,
wilc_set_power_mgmt(vif, 0, 0); wilc_set_power_mgmt(vif, 0, 0);
return wilc_add_beacon(vif, settings->beacon_interval, return wilc_add_beacon(vif, settings->beacon_interval,
settings->dtim_period, beacon->head_len, settings->dtim_period, &settings->beacon);
(u8 *)beacon->head, beacon->tail_len,
(u8 *)beacon->tail);
} }
static int change_beacon(struct wiphy *wiphy, struct net_device *dev, static int change_beacon(struct wiphy *wiphy, struct net_device *dev,
...@@ -1791,9 +1787,7 @@ static int change_beacon(struct wiphy *wiphy, struct net_device *dev, ...@@ -1791,9 +1787,7 @@ static int change_beacon(struct wiphy *wiphy, struct net_device *dev,
struct wilc_priv *priv = wiphy_priv(wiphy); struct wilc_priv *priv = wiphy_priv(wiphy);
struct wilc_vif *vif = netdev_priv(priv->dev); struct wilc_vif *vif = netdev_priv(priv->dev);
return wilc_add_beacon(vif, 0, 0, beacon->head_len, return wilc_add_beacon(vif, 0, 0, beacon);
(u8 *)beacon->head, beacon->tail_len,
(u8 *)beacon->tail);
} }
static int stop_ap(struct wiphy *wiphy, struct net_device *dev) static int stop_ap(struct wiphy *wiphy, struct net_device *dev)
......
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