ATH6KL_FW_IE_FW_IMAGE = 3,
ATH6KL_FW_IE_PATCH_IMAGE = 4,
ATH6KL_FW_IE_RESERVED_RAM_SIZE = 5,
+ ATH6KL_FW_IE_CAPABILITIES = 6,
};
+enum ath6kl_fw_capability {
+ ATH6KL_FW_CAPABILITY_HOST_P2P = 0,
+
+ /* this needs to be last */
+ ATH6KL_FW_CAPABILITY_MAX,
+};
+
+#define ATH6KL_CAPABILITY_LEN (ALIGN(ATH6KL_FW_CAPABILITY_MAX, 32) / 32)
+
struct ath6kl_fw_ie {
__le32 id;
__le32 len;
u8 *fw_patch;
size_t fw_patch_len;
+ unsigned long fw_capabilities[ATH6KL_CAPABILITY_LEN];
+
struct workqueue_struct *ath6kl_wq;
struct ath6kl_node_table scan_table;
struct ath6kl_fw_ie *hdr;
const char *filename;
const u8 *data;
- int ret, ie_id;
+ int ret, ie_id, i, index, bit;
__le32 *val;
switch (ar->version.target_ver) {
val = (__le32 *) data;
ar->hw.reserved_ram_size = le32_to_cpup(val);
break;
+ case ATH6KL_FW_IE_CAPABILITIES:
+ for (i = 0; i < ATH6KL_FW_CAPABILITY_MAX; i++) {
+ index = ALIGN(i, 8) / 8;
+ bit = i % 8;
+
+ if (data[index] & (1 << bit))
+ __set_bit(i, ar->fw_capabilities);
+ }
+ break;
default:
ath6kl_dbg(ATH6KL_DBG_TRC, "Unknown fw ie: %u\n",
le32_to_cpup(&hdr->id));