]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
staging: wilc1000: handle get_station() ops callback in cfg80211 context
authorAjay Singh <ajay.kathat@microchip.com>
Sun, 2 Dec 2018 18:03:25 +0000 (18:03 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 5 Dec 2018 08:49:45 +0000 (09:49 +0100)
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>
drivers/staging/wilc1000/host_interface.c
drivers/staging/wilc1000/host_interface.h
drivers/staging/wilc1000/wilc_wfi_cfgoperations.c

index 4762925375a3e43eddaa1758d54523925c461718..7ab46eff6933d211d375d200e0bc350be7890a18 100644 (file)
@@ -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));
 }
index 953f0ea891119aeadef6c779341e37f121913604..20af5c484711de196c0997482a889054de6c9651 100644 (file)
@@ -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);
index 4c9444ede65daaaf2aba8d5764c082b29d022334..045e365a410558f8e368c9ac96c32cafff66226f 100644 (file)
@@ -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) |