Commit 04a61fbc authored by Ajay Singh's avatar Ajay Singh Committed by Greg Kroah-Hartman
Browse files

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: default avatarAjay Singh <ajay.kathat@microchip.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 5dea0264
Loading
Loading
Loading
Loading
+20 −62
Original line number Diff line number Diff line
@@ -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,
+1 −7
Original line number Diff line number Diff line
@@ -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);
+1 −2
Original line number Diff line number Diff line
@@ -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;
		}
+1 −1
Original line number Diff line number Diff line
@@ -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);
		}