summaryrefslogtreecommitdiffstats
path: root/drivers/staging/wilc1000
diff options
context:
space:
mode:
authorAjay Singh2018-12-02 19:03:05 +0100
committerGreg Kroah-Hartman2018-12-05 09:49:45 +0100
commit04a61fbc409cd7d1dfd339162e05f5b3b2cb087a (patch)
tree9ae06095812fc33fb3ddf58f480b7c996b725533 /drivers/staging/wilc1000
parentstaging: wilc1000: refactor wilc_set_operation_mode() to avoid deferred handling (diff)
downloadkernel-qcow2-linux-04a61fbc409cd7d1dfd339162e05f5b3b2cb087a.tar.gz
kernel-qcow2-linux-04a61fbc409cd7d1dfd339162e05f5b3b2cb087a.tar.xz
kernel-qcow2-linux-04a61fbc409cd7d1dfd339162e05f5b3b2cb087a.zip
staging: wilc1000: refactor wilc_set_wfi_drv_handler() to avoid deferred handling
Avoid handling of WID_SET_DRV_HANDLER wid command in deferred approach. Instead of posting the wid to work queue now handle directly from the caller context. Remove 'is_sync' parameter from the API as it's not required anymore. Signed-off-by: Ajay Singh <ajay.kathat@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/wilc1000')
-rw-r--r--drivers/staging/wilc1000/host_interface.c82
-rw-r--r--drivers/staging/wilc1000/host_interface.h8
-rw-r--r--drivers/staging/wilc1000/linux_wlan.c3
-rw-r--r--drivers/staging/wilc1000/wilc_wfi_cfgoperations.c2
4 files changed, 23 insertions, 72 deletions
diff --git a/drivers/staging/wilc1000/host_interface.c b/drivers/staging/wilc1000/host_interface.c
index 312c01e31ab3..ab770d846577 100644
--- a/drivers/staging/wilc1000/host_interface.c
+++ b/drivers/staging/wilc1000/host_interface.c
@@ -95,6 +95,11 @@ struct wilc_reg_frame {
__le32 frame_type;
} __packed;
+struct wilc_drv_handler {
+ __le32 handler;
+ u8 mode;
+} __packed;
+
struct set_ip_addr {
u8 *ip_addr;
u8 idx;
@@ -113,7 +118,6 @@ union message_body {
struct key_attr key_info;
struct sta_inactive_t mac_info;
struct set_ip_addr ip_info;
- struct drv_handler drv;
struct set_multicast multicast_info;
struct get_mac_addr get_mac_info;
struct ba_session_info session_info;
@@ -221,49 +225,6 @@ static struct wilc_vif *wilc_get_vif_from_idx(struct wilc *wilc, int idx)
return wilc->vif[index];
}
-static void handle_set_wfi_drv_handler(struct work_struct *work)
-{
- struct host_if_msg *msg = container_of(work, struct host_if_msg, work);
- struct wilc_vif *vif = msg->vif;
- struct drv_handler *hif_drv_handler = &msg->body.drv;
- int ret;
- struct wid wid;
- u8 *currbyte, *buffer;
- struct host_if_drv *hif_drv;
-
- if (!vif->hif_drv || !hif_drv_handler)
- goto free_msg;
-
- hif_drv = vif->hif_drv;
-
- buffer = kzalloc(WILC_DRV_HANDLER_SIZE, GFP_KERNEL);
- if (!buffer)
- goto free_msg;
-
- currbyte = buffer;
- put_unaligned_le32(hif_drv->driver_handler_id, currbyte);
- currbyte += 4;
- *currbyte = (hif_drv_handler->name | (hif_drv_handler->mode << 1));
-
- wid.id = WID_SET_DRV_HANDLER;
- wid.type = WID_STR;
- wid.val = (s8 *)buffer;
- wid.size = WILC_DRV_HANDLER_SIZE;
-
- ret = wilc_send_config_pkt(vif, WILC_SET_CFG, &wid, 1,
- hif_drv->driver_handler_id);
- if (ret)
- netdev_err(vif->ndev, "Failed to set driver handler\n");
-
- kfree(buffer);
-
-free_msg:
- if (msg->is_sync)
- complete(&msg->work_comp);
-
- kfree(msg);
-}
-
static void handle_get_mac_address(struct work_struct *work)
{
struct host_if_msg *msg = container_of(work, struct host_if_msg, work);
@@ -2503,28 +2464,25 @@ int wilc_set_mac_chnl_num(struct wilc_vif *vif, u8 channel)
}
int wilc_set_wfi_drv_handler(struct wilc_vif *vif, int index, u8 mode,
- u8 ifc_id, bool is_sync)
+ u8 ifc_id)
{
+ struct wid wid;
+ struct host_if_drv *hif_drv = vif->hif_drv;
int result;
- struct host_if_msg *msg;
-
- msg = wilc_alloc_work(vif, handle_set_wfi_drv_handler, is_sync);
- if (IS_ERR(msg))
- return PTR_ERR(msg);
+ struct wilc_drv_handler drv;
- msg->body.drv.handler = index;
- msg->body.drv.mode = mode;
- msg->body.drv.name = ifc_id;
+ wid.id = WID_SET_DRV_HANDLER;
+ wid.type = WID_STR;
+ wid.size = sizeof(drv);
+ wid.val = (u8 *)&drv;
- result = wilc_enqueue_work(msg);
- if (result) {
- netdev_err(vif->ndev, "%s: enqueue work failed\n", __func__);
- kfree(msg);
- return result;
- }
+ drv.handler = cpu_to_le32(index);
+ drv.mode = (ifc_id | (mode << 1));
- if (is_sync)
- wait_for_completion(&msg->work_comp);
+ result = wilc_send_config_pkt(vif, WILC_SET_CFG, &wid, 1,
+ hif_drv->driver_handler_id);
+ if (result)
+ netdev_err(vif->ndev, "Failed to set driver handler\n");
return result;
}
@@ -2814,7 +2772,7 @@ int wilc_deinit(struct wilc_vif *vif)
del_timer_sync(&vif->periodic_rssi);
del_timer_sync(&hif_drv->remain_on_ch_timer);
- wilc_set_wfi_drv_handler(vif, 0, 0, 0, true);
+ wilc_set_wfi_drv_handler(vif, 0, 0, 0);
if (hif_drv->usr_scan_req.scan_result) {
hif_drv->usr_scan_req.scan_result(SCAN_EVENT_ABORTED, NULL,
diff --git a/drivers/staging/wilc1000/host_interface.h b/drivers/staging/wilc1000/host_interface.h
index e9583574ed24..7748f6583ece 100644
--- a/drivers/staging/wilc1000/host_interface.h
+++ b/drivers/staging/wilc1000/host_interface.h
@@ -214,12 +214,6 @@ struct user_conn_req {
void *arg;
};
-struct drv_handler {
- u32 handler;
- u8 mode;
- u8 name;
-};
-
struct get_mac_addr {
u8 *mac_addr;
};
@@ -333,7 +327,7 @@ int wilc_remain_on_channel(struct wilc_vif *vif, u32 session_id,
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);
int wilc_set_wfi_drv_handler(struct wilc_vif *vif, int index, u8 mode,
- u8 ifc_id, bool is_sync);
+ 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);
diff --git a/drivers/staging/wilc1000/linux_wlan.c b/drivers/staging/wilc1000/linux_wlan.c
index 142816a911f3..721689048648 100644
--- a/drivers/staging/wilc1000/linux_wlan.c
+++ b/drivers/staging/wilc1000/linux_wlan.c
@@ -754,8 +754,7 @@ static int wilc_mac_open(struct net_device *ndev)
for (i = 0; i < wl->vif_num; i++) {
if (ndev == wl->vif[i]->ndev) {
wilc_set_wfi_drv_handler(vif, wilc_get_vif_idx(vif),
- vif->iftype, vif->ifc_id,
- false);
+ vif->iftype, vif->ifc_id);
wilc_set_operation_mode(vif, vif->iftype);
break;
}
diff --git a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
index 4802ce9c5428..3ed8ca94252b 100644
--- a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
+++ b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
@@ -1739,7 +1739,7 @@ static int change_virtual_intf(struct wiphy *wiphy, struct net_device *dev,
if (wl->initialized) {
wilc_set_wfi_drv_handler(vif, wilc_get_vif_idx(vif),
- 0, vif->ifc_id, false);
+ 0, vif->ifc_id);
wilc_set_operation_mode(vif, WILC_AP_MODE);
wilc_set_power_mgmt(vif, 0, 0);
}