2019-05-30 02:57:47 +03:00
/* SPDX-License-Identifier: GPL-2.0-only */
2015-08-11 00:24:12 +03:00
/*
* Bluetooth supports for Qualcomm Atheros ROME chips
*
* Copyright ( c ) 2015 The Linux Foundation . All rights reserved .
*/
# define EDL_PATCH_CMD_OPCODE (0xFC00)
# define EDL_NVM_ACCESS_OPCODE (0xFC0B)
2019-01-16 15:31:15 +03:00
# define EDL_WRITE_BD_ADDR_OPCODE (0xFC14)
2015-08-11 00:24:12 +03:00
# define EDL_PATCH_CMD_LEN (1)
# define EDL_PATCH_VER_REQ_CMD (0x19)
# define EDL_PATCH_TLV_REQ_CMD (0x1E)
2020-12-08 14:55:29 +03:00
# define EDL_GET_BUILD_INFO_CMD (0x20)
2015-08-11 00:24:12 +03:00
# define EDL_NVM_ACCESS_SET_REQ_CMD (0x01)
2022-01-07 09:20:53 +03:00
# define EDL_PATCH_CONFIG_CMD (0x28)
2015-08-11 00:24:12 +03:00
# define MAX_SIZE_PER_TLV_SEGMENT (243)
2019-07-12 08:09:40 +03:00
# define QCA_PRE_SHUTDOWN_CMD (0xFC08)
2020-06-12 15:20:28 +03:00
# define QCA_DISABLE_LOGGING (0xFC17)
2015-08-11 00:24:12 +03:00
# define EDL_CMD_REQ_RES_EVT (0x00)
# define EDL_PATCH_VER_RES_EVT (0x19)
# define EDL_APP_VER_RES_EVT (0x02)
# define EDL_TVL_DNLD_RES_EVT (0x04)
# define EDL_CMD_EXE_STATUS_EVT (0x00)
# define EDL_SET_BAUDRATE_RSP_EVT (0x92)
# define EDL_NVM_ACCESS_CODE_EVT (0x0B)
2022-01-07 09:20:53 +03:00
# define EDL_PATCH_CONFIG_RES_EVT (0x00)
2020-06-12 15:20:28 +03:00
# define QCA_DISABLE_LOGGING_SUB_OP (0x14)
2015-08-11 00:24:12 +03:00
# define EDL_TAG_ID_HCI (17)
# define EDL_TAG_ID_DEEP_SLEEP (27)
2018-08-03 15:16:32 +03:00
# define QCA_WCN3990_POWERON_PULSE 0xFC
# define QCA_WCN3990_POWEROFF_PULSE 0xC0
2019-05-29 00:43:22 +03:00
# define QCA_HCI_CC_OPCODE 0xFC00
# define QCA_HCI_CC_SUCCESS 0x00
2020-11-19 15:54:09 +03:00
# define QCA_WCN3991_SOC_ID (0x40014320)
/* QCA chipset version can be decided by patch and SoC
* version , combination with upper 2 bytes from SoC
* and lower 2 bytes from patch will be used .
*/
# define get_soc_ver(soc_id, rom_ver) \
( ( le32_to_cpu ( soc_id ) < < 16 ) | ( le16_to_cpu ( rom_ver ) ) )
# define QCA_FW_BUILD_VER_LEN 255
2019-03-13 02:02:57 +03:00
enum qca_baudrate {
2015-08-11 00:24:12 +03:00
QCA_BAUDRATE_115200 = 0 ,
QCA_BAUDRATE_57600 ,
QCA_BAUDRATE_38400 ,
QCA_BAUDRATE_19200 ,
QCA_BAUDRATE_9600 ,
QCA_BAUDRATE_230400 ,
QCA_BAUDRATE_250000 ,
QCA_BAUDRATE_460800 ,
QCA_BAUDRATE_500000 ,
QCA_BAUDRATE_720000 ,
QCA_BAUDRATE_921600 ,
QCA_BAUDRATE_1000000 ,
QCA_BAUDRATE_1250000 ,
QCA_BAUDRATE_2000000 ,
QCA_BAUDRATE_3000000 ,
QCA_BAUDRATE_4000000 ,
QCA_BAUDRATE_1600000 ,
QCA_BAUDRATE_3200000 ,
QCA_BAUDRATE_3500000 ,
QCA_BAUDRATE_AUTO = 0xFE ,
QCA_BAUDRATE_RESERVED
} ;
2019-11-06 12:48:31 +03:00
enum qca_tlv_dnld_mode {
QCA_SKIP_EVT_NONE ,
QCA_SKIP_EVT_VSE ,
QCA_SKIP_EVT_CC ,
QCA_SKIP_EVT_VSE_CC
2018-04-26 14:13:27 +03:00
} ;
2019-11-06 12:48:31 +03:00
enum qca_tlv_type {
2015-08-11 00:24:12 +03:00
TLV_TYPE_PATCH = 1 ,
2021-05-18 19:34:43 +03:00
TLV_TYPE_NVM ,
ELF_TYPE_PATCH ,
2015-08-11 00:24:12 +03:00
} ;
2019-11-06 12:48:31 +03:00
struct qca_fw_config {
2015-08-11 00:24:12 +03:00
u8 type ;
char fwname [ 64 ] ;
uint8_t user_baud_rate ;
2019-11-06 12:48:31 +03:00
enum qca_tlv_dnld_mode dnld_mode ;
enum qca_tlv_dnld_mode dnld_type ;
2015-08-11 00:24:12 +03:00
} ;
struct edl_event_hdr {
__u8 cresp ;
__u8 rtype ;
2020-02-27 02:02:27 +03:00
__u8 data [ ] ;
2015-08-11 00:24:12 +03:00
} __packed ;
2019-11-06 12:48:31 +03:00
struct qca_btsoc_version {
2015-08-11 00:24:12 +03:00
__le32 product_id ;
__le16 patch_ver ;
2019-11-06 12:48:31 +03:00
__le16 rom_ver ;
2015-08-11 00:24:12 +03:00
__le32 soc_id ;
} __packed ;
struct tlv_seg_resp {
__u8 result ;
} __packed ;
struct tlv_type_patch {
__le32 total_size ;
__le32 data_length ;
__u8 format_version ;
__u8 signature ;
2018-04-26 14:13:27 +03:00
__u8 download_mode ;
__u8 reserved1 ;
2015-08-11 00:24:12 +03:00
__le16 product_id ;
__le16 rom_build ;
__le16 patch_version ;
__le16 reserved2 ;
__le32 entry ;
} __packed ;
struct tlv_type_nvm {
__le16 tag_id ;
__le16 tag_len ;
__le32 reserve1 ;
__le32 reserve2 ;
2020-02-27 02:02:27 +03:00
__u8 data [ ] ;
2015-08-11 00:24:12 +03:00
} __packed ;
struct tlv_type_hdr {
__le32 type_len ;
2020-02-27 02:02:27 +03:00
__u8 data [ ] ;
2015-08-11 00:24:12 +03:00
} __packed ;
2018-08-03 15:16:28 +03:00
enum qca_btsoc_type {
QCA_INVALID = - 1 ,
QCA_AR3002 ,
QCA_ROME ,
2019-04-26 16:56:01 +03:00
QCA_WCN3990 ,
QCA_WCN3998 ,
2020-03-25 05:26:37 +03:00
QCA_WCN3991 ,
QCA_QCA6390 ,
2021-05-18 19:34:42 +03:00
QCA_WCN6750 ,
2018-08-03 15:16:28 +03:00
} ;
2015-08-11 00:24:12 +03:00
# if IS_ENABLED(CONFIG_BT_QCA)
int qca_set_bdaddr_rome ( struct hci_dev * hdev , const bdaddr_t * bdaddr ) ;
2018-08-03 15:16:28 +03:00
int qca_uart_setup ( struct hci_dev * hdev , uint8_t baudrate ,
2020-11-19 15:54:09 +03:00
enum qca_btsoc_type soc_type , struct qca_btsoc_version ver ,
2019-06-06 12:40:30 +03:00
const char * firmware_name ) ;
2020-11-19 15:54:09 +03:00
int qca_read_soc_version ( struct hci_dev * hdev , struct qca_btsoc_version * ver ,
2019-11-06 12:48:32 +03:00
enum qca_btsoc_type ) ;
2019-01-16 15:31:15 +03:00
int qca_set_bdaddr ( struct hci_dev * hdev , const bdaddr_t * bdaddr ) ;
2019-07-12 08:09:40 +03:00
int qca_send_pre_shutdown_cmd ( struct hci_dev * hdev ) ;
2019-04-26 16:56:01 +03:00
static inline bool qca_is_wcn399x ( enum qca_btsoc_type soc_type )
{
2019-11-06 12:48:32 +03:00
return soc_type = = QCA_WCN3990 | | soc_type = = QCA_WCN3991 | |
soc_type = = QCA_WCN3998 ;
2019-04-26 16:56:01 +03:00
}
2021-05-18 19:34:42 +03:00
static inline bool qca_is_wcn6750 ( enum qca_btsoc_type soc_type )
{
return soc_type = = QCA_WCN6750 ;
}
2015-08-11 00:24:12 +03:00
# else
static inline int qca_set_bdaddr_rome ( struct hci_dev * hdev , const bdaddr_t * bdaddr )
{
return - EOPNOTSUPP ;
}
2018-08-03 15:16:28 +03:00
static inline int qca_uart_setup ( struct hci_dev * hdev , uint8_t baudrate ,
2020-11-19 15:54:09 +03:00
enum qca_btsoc_type soc_type ,
struct qca_btsoc_version ver ,
2019-06-06 12:40:30 +03:00
const char * firmware_name )
2018-08-03 15:16:27 +03:00
{
return - EOPNOTSUPP ;
}
2020-11-19 15:54:09 +03:00
static inline int qca_read_soc_version ( struct hci_dev * hdev ,
struct qca_btsoc_version * ver ,
2019-11-06 12:48:32 +03:00
enum qca_btsoc_type )
2015-08-11 00:24:12 +03:00
{
return - EOPNOTSUPP ;
}
2019-01-16 15:31:15 +03:00
static inline int qca_set_bdaddr ( struct hci_dev * hdev , const bdaddr_t * bdaddr )
{
return - EOPNOTSUPP ;
}
2019-04-26 16:56:01 +03:00
static inline bool qca_is_wcn399x ( enum qca_btsoc_type soc_type )
{
return false ;
}
2019-07-12 08:09:40 +03:00
2021-05-18 19:34:42 +03:00
static inline bool qca_is_wcn6750 ( enum qca_btsoc_type soc_type )
{
return false ;
}
2019-07-12 08:09:40 +03:00
static inline int qca_send_pre_shutdown_cmd ( struct hci_dev * hdev )
{
return - EOPNOTSUPP ;
}
2015-08-11 00:24:12 +03:00
# endif