diff --git a/drivers/net/wireless/ath/ath6kl/core.h b/drivers/net/wireless/ath/ath6kl/core.h index abb4aaf48c087f41d5a258253a54c660f761e0e4..0fb82e9002bed82e9c07cf456087cf80a5d8ff9b 100644 --- a/drivers/net/wireless/ath/ath6kl/core.h +++ b/drivers/net/wireless/ath/ath6kl/core.h @@ -68,8 +68,18 @@ enum ath6kl_fw_ie_type { 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; @@ -491,6 +501,8 @@ struct ath6kl { 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; diff --git a/drivers/net/wireless/ath/ath6kl/init.c b/drivers/net/wireless/ath/ath6kl/init.c index e2a29b25884c42ae72cd3a5179f9b053aa716cab..b9b13a040c7eb748c6f69138a710a38f4512c801 100644 --- a/drivers/net/wireless/ath/ath6kl/init.c +++ b/drivers/net/wireless/ath/ath6kl/init.c @@ -901,7 +901,7 @@ static int ath6kl_fetch_fw_api2(struct ath6kl *ar) 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) { @@ -992,6 +992,15 @@ static int ath6kl_fetch_fw_api2(struct ath6kl *ar) 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));