diff options
Diffstat (limited to 'drivers/net/wireless/ath/wcn36xx/wcnss_core.h')
-rw-r--r-- | drivers/net/wireless/ath/wcn36xx/wcnss_core.h | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath/wcn36xx/wcnss_core.h b/drivers/net/wireless/ath/wcn36xx/wcnss_core.h new file mode 100644 index 000000000000..49524c8dddfb --- /dev/null +++ b/drivers/net/wireless/ath/wcn36xx/wcnss_core.h @@ -0,0 +1,99 @@ +#ifndef _WCNSS_CORE_H_ +#define _WCNSS_CORE_H_ + +#define PMU_OFFSET 0x1004 +#define SPARE_OFFSET 0x1088 +#define IRIS_REG_OFFSET 0x1134 + +#define INVALID_IRIS_REG 0xbaadbaad + +#define WCNSS_PMU_CFG_IRIS_XO_CFG BIT(3) +#define WCNSS_PMU_CFG_IRIS_XO_EN BIT(4) +#define WCNSS_PMU_CFG_GC_BUS_MUX_SEL_TOP BIT(5) +#define WCNSS_PMU_CFG_IRIS_XO_CFG_STS BIT(6) /* 1: in progress, 0: done */ + +#define WCNSS_PMU_CFG_IRIS_RESET BIT(7) +#define WCNSS_PMU_CFG_IRIS_RESET_STS BIT(8) /* 1: in progress, 0: done */ +#define WCNSS_PMU_CFG_IRIS_XO_READ BIT(9) +#define WCNSS_PMU_CFG_IRIS_XO_READ_STS BIT(10) +#define WCNSS_FW_DOWNLOAD_ENABLE BIT(25) + +#define WCNSS_PMU_CFG_IRIS_XO_MODE 0x6 +#define WCNSS_PMU_CFG_IRIS_XO_MODE_48 (3 << 1) + +#define NV_DOWNLOAD_TIMEOUT 500 +#define NV_FRAGMENT_SIZE 3072 +#define MAX_CALIBRATED_DATA_SIZE (64*1024) +#define LAST_FRAGMENT (1 << 0) +#define MESSAGE_TO_FOLLOW (1 << 1) +#define CAN_RECEIVE_CALDATA (1 << 15) +#define WCNSS_RESP_SUCCESS 1 +#define WCNSS_RESP_FAIL 0 + + +#define WCNSS_NV_DOWNLOAD_REQ 0x01000002 +#define WCNSS_NV_DOWNLOAD_RSP 0x01000003 +#define WCNSS_CBC_COMPLETE_IND 0x0100000C + +/*time out 10s for the firmware status ready indicator */ +#define FW_READY_TIMEOUT (10000) + + +struct smd_msg_hdr { + unsigned int msg_type; + unsigned int msg_len; +}; + +struct nvbin_dnld_req_params { + /* Fragment sequence number of the NV bin Image. NV Bin Image + * might not fit into one message due to size limitation of + * the SMD channel FIFO so entire NV blob is chopped into + * multiple fragments starting with seqeunce number 0. The + * last fragment is indicated by marking is_last_fragment field + * to 1. At receiving side, NV blobs would be concatenated + * together without any padding bytes in between. + */ + unsigned short frag_number; + + /* bit 0: When set to 1 it indicates that no more fragments will + * be sent. + * bit 1: When set, a new message will be followed by this message + * bit 2- bit 14: Reserved + * bit 15: when set, it indicates that the sender is capable of + * receiving Calibrated data. + */ + unsigned short msg_flags; + + /* NV Image size (number of bytes) */ + unsigned int nvbin_buffer_size; + + /* Following the 'nvbin_buffer_size', there should be + * nvbin_buffer_size bytes of NV bin Image i.e. + * uint8[nvbin_buffer_size]. + */ +}; + +struct nvbin_dnld_req_msg { + /* Note: The length specified in nvbin_dnld_req_msg messages + * should be hdr.msg_len = sizeof(nvbin_dnld_req_msg) + + * nvbin_buffer_size. + */ + struct smd_msg_hdr hdr; + struct nvbin_dnld_req_params dnld_req_params; +}; + +struct wcnss_version { + struct smd_msg_hdr hdr; + unsigned char major; + unsigned char minor; + unsigned char version; + unsigned char revision; +}; + + +int wcnss_core_prepare(struct platform_device *pdev); +void wcnss_core_init(void); +void wcnss_core_deinit(void); + +#endif + |