#include "dma.h"
#include "usb.h"
#include "cmd.h"
+#include "radar.h"
struct carl9170_bar_ctx {
uint8_t ta[6];
ba_head_idx,
queued_ba;
+ unsigned int queued_bar;
++
+ unsigned int soft_radar,
+ radar_last,
+ pattern_index;
} wlan;
struct {
BIT(CARL9170FW_HANDLE_BACK_REQ) |
BIT(CARL9170FW_RX_FILTER) |
BIT(CARL9170FW_HW_COUNTERS) |
+ BIT(CARL9170FW_RX_BA_FILTER) |
BIT(CARL9170FW_USB_INIT_FIRMWARE) |
#ifdef CONFIG_CARL9170FW_USB_UP_STREAM
BIT(CARL9170FW_USB_UP_STREAM) |
#ifdef CONFIG_CARL9170FW_WOL
BIT(CARL9170FW_WOL) |
#endif /* CONFIG_CARL9170FW_WOL */
+#ifdef CONFIG_CARL9170FW_RADAR
+ BIT(CARL9170FW_RADAR_PATTERN_GENERATOR) |
+#endif /* CONFIG_CARL9170FW_RADAR */
(0)),
.miniboot_size = cpu_to_le16(0),
),
#endif /* CONFIG_CARL9170FW_WOL */
-
FILL(motd, MOTD,
.fw_year_month_day = cpu_to_le32(
CARL9170FW_SET_DAY(CARL9170FW_VERSION_DAY) +
.desc = "Community AR9170 Linux",
.release = CARL9170FW_VERSION_GIT),
+
+#ifdef CONFIG_CARL9170FW_RADAR
+ FILL(radar, RADAR,
+ .soft_radar = cpu_to_le32(&fw.wlan.soft_radar),
+ .num_radars = __CARL9170FW_NUM_RADARS,
+ .radars = { /* filled by the fwprepare tool */ },
+ ),
+#endif /* CONFIG_CARL9170FW_RADAR */
+
FILL(dbg, DBG,
.bogoclock_addr = cpu_to_le32(0),
.counter_addr = cpu_to_le32(&fw.counter),
/* HW (ANI, CCA, MIB) tally counters */
CARL9170FW_HW_COUNTERS,
+ /* Radar pattern generator */
+ CARL9170FW_RADAR_PATTERN_GENERATOR,
+
+ /* Firmware will pass BA when BARs are queued */
+ CARL9170FW_RX_BA_FILTER,
+
/* KEEP LAST */
__CARL9170FW_FEATURE_NUM
};
#define CHK_MAGIC "CHK\0"
#define TXSQ_MAGIC "TXSQ"
#define WOL_MAGIC "WOL\0"
+#define RADAR_MAGIC "RDR\0"
#define LAST_MAGIC "LAST"
#define CARL9170FW_SET_DAY(d) (((d) - 1) % 31)
#define CARL9170FW_DBG_DESC_SIZE \
(sizeof(struct carl9170fw_dbg_desc))
+#define CARL9170FW_RADAR_MAP_NAME_LEN 15
+struct carl9170fw_radar_map_entry {
+ u8 index;
+ char name[CARL9170FW_RADAR_MAP_NAME_LEN];
+} __packed;
+
+#define CARL9170FW_RADAR_DESC_MIN_VER 1
+#define CARL9170FW_RADAR_DESC_CUR_VER 1
+struct carl9170fw_radar_desc {
+ struct carl9170fw_desc_head head;
+
+ __le32 soft_radar;
+ __le32 num_radars;
+ struct carl9170fw_radar_map_entry radars[0];
+ /* Put your debugging definitions here */
+} __packed;
+#define CARL9170FW_RADAR_DESC_SIZE \
+ (sizeof(struct carl9170fw_radar_desc))
+
#define CARL9170FW_CHK_DESC_MIN_VER 1
#define CARL9170FW_CHK_DESC_CUR_VER 2
struct carl9170fw_chk_desc {
CHECK_FOR_FEATURE(CARL9170FW_WOL),
CHECK_FOR_FEATURE(CARL9170FW_FIXED_5GHZ_PSM),
CHECK_FOR_FEATURE(CARL9170FW_HW_COUNTERS),
+ CHECK_FOR_FEATURE(CARL9170FW_RX_BA_FILTER),
+ CHECK_FOR_FEATURE(CARL9170FW_RADAR_PATTERN_GENERATOR),
};
static void check_feature_list(const struct carl9170fw_desc_head *head,
le32_to_cpu(chk->fw_crc32));
}
+static void show_radar_desc(const struct carl9170fw_desc_head *head,
+ struct carlfw *fw __unused)
+{
+ const struct carl9170fw_radar_desc *radar = (const void *) head;
+ const struct carl9170fw_radar_map_entry *map = radar->radars;
+ int map_entries = (head->length - sizeof(*radar)) / sizeof(*map);
+ int i;
+
+ fprintf(stdout, "\tRadar index register: %08x\n",
+ le32_to_cpu(radar->soft_radar));
+ fprintf(stdout, "\tNumber of supported radar patterns: %08x\n",
+ le32_to_cpu(radar->num_radars));
+
+ for (i = 0; i < map_entries; i++) {
+ fprintf(stdout, "\t\tindex:0x%x, description:%s\n",
+ map[i].index, map[i].name);
+ }
+}
+
static void show_last_desc(const struct carl9170fw_desc_head *head,
struct carlfw *fw __unused)
ADD_HANDLER(FIX, show_fix_desc),
ADD_HANDLER(CHK, show_chk_desc),
ADD_HANDLER(WOL, show_wol_desc),
+ ADD_HANDLER(RADAR, show_radar_desc),
ADD_HANDLER(LAST, show_last_desc),
};