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: Guy Mishol <guym@ti.com> Signed-off-by: Eliad Peller <eliad@wizery.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
@@ -167,3 +167,34 @@ out_free:
|
||||
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;
|
||||
}
|
||||
|
@@ -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
|
||||
|
@@ -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)",
|
||||
|
@@ -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,
|
||||
|
@@ -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 */
|
||||
|
@@ -26,10 +26,10 @@
|
||||
|
||||
/* minimum FW required for driver */
|
||||
#define WL18XX_CHIP_VER 8
|
||||
#define WL18XX_IFTYPE_VER 8
|
||||
#define WL18XX_IFTYPE_VER 9
|
||||
#define WL18XX_MAJOR_VER WLCORE_FW_VER_IGNORE
|
||||
#define WL18XX_SUBTYPE_VER WLCORE_FW_VER_IGNORE
|
||||
#define WL18XX_MINOR_VER 13
|
||||
#define WL18XX_MINOR_VER 11
|
||||
|
||||
#define WL18XX_CMD_MAX_SIZE 740
|
||||
|
||||
|
Reference in New Issue
Block a user