staging: wilc1000: handle get_station() ops callback in cfg80211 context
Refactor code to handle the get_station() callback from cfg80211 context. Provided different API's to fetch the station statistics information in sync or async call. From cfg80211 get_station() ops callback calls the sync version of API. Signed-off-by: Ajay Singh <ajay.kathat@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Родитель
05d3bcb0f4
Коммит
19cb25e1e6
|
@ -1322,13 +1322,10 @@ void wilc_resolve_disconnect_aberration(struct wilc_vif *vif)
|
|||
wilc_disconnect(vif, 1);
|
||||
}
|
||||
|
||||
static void handle_get_statistics(struct work_struct *work)
|
||||
int wilc_get_statistics(struct wilc_vif *vif, struct rf_info *stats)
|
||||
{
|
||||
struct host_if_msg *msg = container_of(work, struct host_if_msg, work);
|
||||
struct wilc_vif *vif = msg->vif;
|
||||
struct wid wid_list[5];
|
||||
u32 wid_cnt = 0, result;
|
||||
struct rf_info *stats = (struct rf_info *)msg->body.data;
|
||||
|
||||
wid_list[wid_cnt].id = WID_LINKSPEED;
|
||||
wid_list[wid_cnt].type = WID_CHAR;
|
||||
|
@ -1364,8 +1361,10 @@ static void handle_get_statistics(struct work_struct *work)
|
|||
wid_cnt,
|
||||
wilc_get_vif_idx(vif));
|
||||
|
||||
if (result)
|
||||
if (result) {
|
||||
netdev_err(vif->ndev, "Failed to send scan parameters\n");
|
||||
return result;
|
||||
}
|
||||
|
||||
if (stats->link_speed > TCP_ACK_FILTER_LINK_SPEED_THRESH &&
|
||||
stats->link_speed != DEFAULT_LINK_SPEED)
|
||||
|
@ -1373,11 +1372,18 @@ static void handle_get_statistics(struct work_struct *work)
|
|||
else if (stats->link_speed != DEFAULT_LINK_SPEED)
|
||||
wilc_enable_tcp_ack_filter(vif, false);
|
||||
|
||||
/* free 'msg' for async command, for sync caller will free it */
|
||||
if (msg->is_sync)
|
||||
complete(&msg->work_comp);
|
||||
else
|
||||
kfree(msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
static void handle_get_statistics(struct work_struct *work)
|
||||
{
|
||||
struct host_if_msg *msg = container_of(work, struct host_if_msg, work);
|
||||
struct wilc_vif *vif = msg->vif;
|
||||
struct rf_info *stats = (struct rf_info *)msg->body.data;
|
||||
|
||||
wilc_get_statistics(vif, stats);
|
||||
|
||||
kfree(msg);
|
||||
}
|
||||
|
||||
static void wilc_hif_pack_sta_param(u8 *cur_byte, const u8 *mac,
|
||||
|
@ -2149,13 +2155,12 @@ int wilc_get_rssi(struct wilc_vif *vif, s8 *rssi_level)
|
|||
return result;
|
||||
}
|
||||
|
||||
int
|
||||
wilc_get_statistics(struct wilc_vif *vif, struct rf_info *stats, bool is_sync)
|
||||
int wilc_get_stats_async(struct wilc_vif *vif, struct rf_info *stats)
|
||||
{
|
||||
int result;
|
||||
struct host_if_msg *msg;
|
||||
|
||||
msg = wilc_alloc_work(vif, handle_get_statistics, is_sync);
|
||||
msg = wilc_alloc_work(vif, handle_get_statistics, false);
|
||||
if (IS_ERR(msg))
|
||||
return PTR_ERR(msg);
|
||||
|
||||
|
@ -2168,11 +2173,6 @@ wilc_get_statistics(struct wilc_vif *vif, struct rf_info *stats, bool is_sync)
|
|||
return result;
|
||||
}
|
||||
|
||||
if (is_sync) {
|
||||
wait_for_completion(&msg->work_comp);
|
||||
kfree(msg);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -2297,7 +2297,7 @@ static void get_periodic_rssi(struct timer_list *t)
|
|||
}
|
||||
|
||||
if (vif->hif_drv->hif_state == HOST_IF_CONNECTED)
|
||||
wilc_get_statistics(vif, &vif->periodic_stat, false);
|
||||
wilc_get_stats_async(vif, &vif->periodic_stat);
|
||||
|
||||
mod_timer(&vif->periodic_rssi, jiffies + msecs_to_jiffies(5000));
|
||||
}
|
||||
|
|
|
@ -297,8 +297,7 @@ void wilc_frame_register(struct wilc_vif *vif, u16 frame_type, bool reg);
|
|||
int wilc_set_wfi_drv_handler(struct wilc_vif *vif, int index, u8 mode,
|
||||
u8 ifc_id);
|
||||
int wilc_set_operation_mode(struct wilc_vif *vif, u32 mode);
|
||||
int wilc_get_statistics(struct wilc_vif *vif, struct rf_info *stats,
|
||||
bool is_sync);
|
||||
int wilc_get_statistics(struct wilc_vif *vif, struct rf_info *stats);
|
||||
void wilc_resolve_disconnect_aberration(struct wilc_vif *vif);
|
||||
int wilc_get_vif_idx(struct wilc_vif *vif);
|
||||
int wilc_set_tx_power(struct wilc_vif *vif, u8 tx_power);
|
||||
|
|
|
@ -1039,7 +1039,7 @@ static int get_station(struct wiphy *wiphy, struct net_device *dev,
|
|||
} else if (vif->iftype == WILC_STATION_MODE) {
|
||||
struct rf_info stats;
|
||||
|
||||
wilc_get_statistics(vif, &stats, true);
|
||||
wilc_get_statistics(vif, &stats);
|
||||
|
||||
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL) |
|
||||
BIT_ULL(NL80211_STA_INFO_RX_PACKETS) |
|
||||
|
|
Загрузка…
Ссылка в новой задаче