Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 830513ab authored by Eliad Peller's avatar Eliad Peller Committed by Kalle Valo
Browse files

wlcore: add dfs master restart calls



call wlcore_cmd_dfs_master_restart when starting
the ap on a new channel (after csa is done).

Add a new WLVIF_FLAG_BEACON_DISABLED flag to
indicate that dfs_master_restart command
is required.

Signed-off-by: default avatarEliad Peller <eliad@wizery.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 534719f4
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -229,3 +229,28 @@ int wl18xx_cmd_radar_detection_debug(struct wl1271 *wl, u8 channel)
	kfree(cmd);
	return ret;
}

int wl18xx_cmd_dfs_master_restart(struct wl1271 *wl, struct wl12xx_vif *wlvif)
{
	struct wl18xx_cmd_dfs_master_restart *cmd;
	int ret = 0;

	wl1271_debug(DEBUG_CMD, "cmd dfs master restart (role %d)",
		     wlvif->role_id);

	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
	if (!cmd)
		return -ENOMEM;

	cmd->role_id = wlvif->role_id;

	ret = wl1271_cmd_send(wl, CMD_DFS_MASTER_RESTART,
			      cmd, sizeof(*cmd), 0);
	if (ret < 0) {
		wl1271_error("failed to send dfs master restart command");
		goto out_free;
	}
out_free:
	kfree(cmd);
	return ret;
}
+8 −0
Original line number Diff line number Diff line
@@ -66,6 +66,13 @@ struct wl18xx_cmd_dfs_radar_debug {
	u8 padding[3];
} __packed;

struct wl18xx_cmd_dfs_master_restart {
	struct wl1271_cmd_header header;

	u8 role_id;
	u8 padding[3];
} __packed;

/* cac_start and cac_stop share the same params */
struct wlcore_cmd_cac_start {
	struct wl1271_cmd_header header;
@@ -85,4 +92,5 @@ int wl18xx_cmd_smart_config_set_group_key(struct wl1271 *wl, u16 group_id,
					  u8 key_len, u8 *key);
int wl18xx_cmd_set_cac(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool start);
int wl18xx_cmd_radar_detection_debug(struct wl1271 *wl, u8 channel);
int wl18xx_cmd_dfs_master_restart(struct wl1271 *wl, struct wl12xx_vif *wlvif);
#endif
+1 −0
Original line number Diff line number Diff line
@@ -1705,6 +1705,7 @@ static struct wlcore_ops wl18xx_ops = {
	.rx_ba_filter	= wl18xx_acx_rx_ba_filter,
	.ap_sleep	= wl18xx_acx_ap_sleep,
	.set_cac	= wl18xx_cmd_set_cac,
	.dfs_master_restart	= wl18xx_cmd_dfs_master_restart,
};

/* HT cap appropriate for wide channels in 2Ghz */
+1 −0
Original line number Diff line number Diff line
@@ -154,6 +154,7 @@ void wlcore_event_channel_switch(struct wl1271 *wl,
			ieee80211_chswitch_done(vif, success);
			cancel_delayed_work(&wlvif->channel_switch_work);
		} else {
			set_bit(WLVIF_FLAG_BEACON_DISABLED, &wlvif->flags);
			ieee80211_csa_finish(vif);
		}
	}
+9 −0
Original line number Diff line number Diff line
@@ -320,4 +320,13 @@ wlcore_hw_set_cac(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool start)

	return wl->ops->set_cac(wl, wlvif, start);
}

static inline int
wlcore_hw_dfs_master_restart(struct wl1271 *wl, struct wl12xx_vif *wlvif)
{
	if (!wl->ops->dfs_master_restart)
		return -EINVAL;

	return wl->ops->dfs_master_restart(wl, wlvif);
}
#endif
Loading