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

Commit 750e9d15 authored by Eliad Peller's avatar Eliad Peller Committed by Kalle Valo
Browse files

wl18xx: add radar detection implementation



Add support for CAC start/stop commands, and pass
radar detection events from the fw to mac80211.

Bump fw name (to wl18xx-fw-4.bin) and min fw version
(to 8.9.*.*.11), and align event mailbox accordingly.

Signed-off-by: default avatarGuy Mishol <guym@ti.com>
Signed-off-by: default avatarEliad Peller <eliad@wizery.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent e2f1e50f
Loading
Loading
Loading
Loading
+31 −0
Original line number Diff line number Diff line
@@ -167,3 +167,34 @@ int wl18xx_cmd_smart_config_set_group_key(struct wl1271 *wl, u16 group_id,
out:
	return ret;
}

int wl18xx_cmd_set_cac(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool start)
{
	struct wlcore_cmd_cac_start *cmd;
	int ret = 0;

	wl1271_debug(DEBUG_CMD, "cmd cac (channel %d) %s",
		     wlvif->channel, start ? "start" : "stop");

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

	cmd->role_id = wlvif->role_id;
	cmd->channel = wlvif->channel;
	if (wlvif->band == IEEE80211_BAND_5GHZ)
		cmd->band = WLCORE_BAND_5GHZ;
	cmd->bandwidth = wlcore_get_native_channel_type(wlvif->channel_type);

	ret = wl1271_cmd_send(wl,
			      start ? CMD_CAC_START : CMD_CAC_STOP,
			      cmd, sizeof(*cmd), 0);
	if (ret < 0) {
		wl1271_error("failed to send cac command");
		goto out_free;
	}

out_free:
	kfree(cmd);
	return ret;
}
+11 −0
Original line number Diff line number Diff line
@@ -59,6 +59,16 @@ struct wl18xx_cmd_smart_config_set_group_key {
	u8 key[16];
} __packed;

/* cac_start and cac_stop share the same params */
struct wlcore_cmd_cac_start {
	struct wl1271_cmd_header header;

	u8 role_id;
	u8 channel;
	u8 band;
	u8 bandwidth;
} __packed;

int wl18xx_cmd_channel_switch(struct wl1271 *wl,
			      struct wl12xx_vif *wlvif,
			      struct ieee80211_channel_switch *ch_switch);
@@ -66,4 +76,5 @@ int wl18xx_cmd_smart_config_start(struct wl1271 *wl, u32 group_bitmap);
int wl18xx_cmd_smart_config_stop(struct wl1271 *wl);
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);
#endif
+21 −0
Original line number Diff line number Diff line
@@ -47,6 +47,19 @@ int wl18xx_wait_for_event(struct wl1271 *wl, enum wlcore_wait_event event,
	return wlcore_cmd_wait_for_event_or_timeout(wl, local_event, timeout);
}

static const char *wl18xx_radar_type_decode(u8 radar_type)
{
	switch (radar_type) {
	case RADAR_TYPE_REGULAR:
		return "REGULAR";
	case RADAR_TYPE_CHIRP:
		return "CHIRP";
	case RADAR_TYPE_NONE:
	default:
		return "N/A";
	}
}

static int wlcore_smart_config_sync_event(struct wl1271 *wl, u8 sync_channel,
					  u8 sync_band)
{
@@ -115,6 +128,14 @@ int wl18xx_process_mailbox_events(struct wl1271 *wl)
			wl18xx_scan_completed(wl, wl->scan_wlvif);
	}

	if (vector & RADAR_DETECTED_EVENT_ID) {
		wl1271_info("radar event: channel %d type %s",
			    mbox->radar_channel,
			    wl18xx_radar_type_decode(mbox->radar_type));

		ieee80211_radar_detected(wl->hw);
	}

	if (vector & PERIODIC_SCAN_REPORT_EVENT_ID) {
		wl1271_debug(DEBUG_EVENT,
			     "PERIODIC_SCAN_REPORT_EVENT (results %d)",
+13 −1
Original line number Diff line number Diff line
@@ -42,6 +42,12 @@ enum {
	SMART_CONFIG_DECODE_EVENT_ID		 = BIT(23),
};

enum wl18xx_radar_types {
	RADAR_TYPE_NONE,
	RADAR_TYPE_REGULAR,
	RADAR_TYPE_CHIRP
};

struct wl18xx_event_mailbox {
	__le32 events_vector;

@@ -83,13 +89,19 @@ struct wl18xx_event_mailbox {
	u8 sc_token_len;
	u8 padding1;
	u8 sc_ssid[32];
	u8 sc_pwd[32];
	u8 sc_pwd[64];
	u8 sc_token[32];

	/* smart config sync channel */
	u8 sc_sync_channel;
	u8 sc_sync_band;
	u8 padding2[2];

	/* radar detect */
	u8 radar_channel;
	u8 radar_type;

	u8 padding3[2];
} __packed;

int wl18xx_wait_for_event(struct wl1271 *wl, enum wlcore_wait_event event,
+3 −1
Original line number Diff line number Diff line
@@ -655,7 +655,7 @@ static const struct wl18xx_clk_cfg wl18xx_clk_table[NUM_CLOCK_CONFIGS] = {
};

/* TODO: maybe move to a new header file? */
#define WL18XX_FW_NAME "ti-connectivity/wl18xx-fw-3.bin"
#define WL18XX_FW_NAME "ti-connectivity/wl18xx-fw-4.bin"

static int wl18xx_identify_chip(struct wl1271 *wl)
{
@@ -990,6 +990,7 @@ static int wl18xx_boot(struct wl1271 *wl)

	wl->event_mask = BSS_LOSS_EVENT_ID |
		SCAN_COMPLETE_EVENT_ID |
		RADAR_DETECTED_EVENT_ID |
		RSSI_SNR_TRIGGER_0_EVENT_ID |
		PERIODIC_SCAN_COMPLETE_EVENT_ID |
		PERIODIC_SCAN_REPORT_EVENT_ID |
@@ -1703,6 +1704,7 @@ static struct wlcore_ops wl18xx_ops = {
	.interrupt_notify = wl18xx_acx_interrupt_notify_config,
	.rx_ba_filter	= wl18xx_acx_rx_ba_filter,
	.ap_sleep	= wl18xx_acx_ap_sleep,
	.set_cac	= wl18xx_cmd_set_cac,
};

/* HT cap appropriate for wide channels in 2Ghz */
Loading