1*4882a593Smuzhiyun /** 2*4882a593Smuzhiyun * Copyright (c) 2017 Redpine Signals Inc. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Permission to use, copy, modify, and/or distribute this software for any 5*4882a593Smuzhiyun * purpose with or without fee is hereby granted, provided that the above 6*4882a593Smuzhiyun * copyright notice and this permission notice appear in all copies. 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9*4882a593Smuzhiyun * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10*4882a593Smuzhiyun * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11*4882a593Smuzhiyun * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12*4882a593Smuzhiyun * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13*4882a593Smuzhiyun * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14*4882a593Smuzhiyun * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15*4882a593Smuzhiyun */ 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #ifndef __RSI_HAL_H__ 18*4882a593Smuzhiyun #define __RSI_HAL_H__ 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun /* Device Operating modes */ 21*4882a593Smuzhiyun #define DEV_OPMODE_WIFI_ALONE 1 22*4882a593Smuzhiyun #define DEV_OPMODE_BT_ALONE 4 23*4882a593Smuzhiyun #define DEV_OPMODE_BT_LE_ALONE 8 24*4882a593Smuzhiyun #define DEV_OPMODE_BT_DUAL 12 25*4882a593Smuzhiyun #define DEV_OPMODE_STA_BT 5 26*4882a593Smuzhiyun #define DEV_OPMODE_STA_BT_LE 9 27*4882a593Smuzhiyun #define DEV_OPMODE_STA_BT_DUAL 13 28*4882a593Smuzhiyun #define DEV_OPMODE_AP_BT 6 29*4882a593Smuzhiyun #define DEV_OPMODE_AP_BT_DUAL 14 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun #define DEV_OPMODE_PARAM_DESC \ 32*4882a593Smuzhiyun __stringify(DEV_OPMODE_WIFI_ALONE) "[Wi-Fi alone], " \ 33*4882a593Smuzhiyun __stringify(DEV_OPMODE_BT_ALONE) "[BT classic alone], " \ 34*4882a593Smuzhiyun __stringify(DEV_OPMODE_BT_LE_ALONE) "[BT LE alone], " \ 35*4882a593Smuzhiyun __stringify(DEV_OPMODE_BT_DUAL) "[BT classic + BT LE alone], " \ 36*4882a593Smuzhiyun __stringify(DEV_OPMODE_STA_BT) "[Wi-Fi STA + BT classic], " \ 37*4882a593Smuzhiyun __stringify(DEV_OPMODE_STA_BT_LE) "[Wi-Fi STA + BT LE], " \ 38*4882a593Smuzhiyun __stringify(DEV_OPMODE_STA_BT_DUAL) "[Wi-Fi STA + BT classic + BT LE], " \ 39*4882a593Smuzhiyun __stringify(DEV_OPMODE_AP_BT) "[Wi-Fi AP + BT classic], " \ 40*4882a593Smuzhiyun __stringify(DEV_OPMODE_AP_BT_DUAL) "[Wi-Fi AP + BT classic + BT LE]" 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun #define FLASH_WRITE_CHUNK_SIZE (4 * 1024) 43*4882a593Smuzhiyun #define FLASH_SECTOR_SIZE (4 * 1024) 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun #define FLASH_SIZE_ADDR 0x04000016 46*4882a593Smuzhiyun #define PING_BUFFER_ADDRESS 0x19000 47*4882a593Smuzhiyun #define PONG_BUFFER_ADDRESS 0x1a000 48*4882a593Smuzhiyun #define SWBL_REGIN 0x41050034 49*4882a593Smuzhiyun #define SWBL_REGOUT 0x4105003c 50*4882a593Smuzhiyun #define PING_WRITE 0x1 51*4882a593Smuzhiyun #define PONG_WRITE 0x2 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun #define BL_CMD_TIMEOUT 2000 54*4882a593Smuzhiyun #define BL_BURN_TIMEOUT (50 * 1000) 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun #define REGIN_VALID 0xA 57*4882a593Smuzhiyun #define REGIN_INPUT 0xA0 58*4882a593Smuzhiyun #define REGOUT_VALID 0xAB 59*4882a593Smuzhiyun #define REGOUT_INVALID (~0xAB) 60*4882a593Smuzhiyun #define CMD_PASS 0xAA 61*4882a593Smuzhiyun #define CMD_FAIL 0xCC 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun #define LOAD_HOSTED_FW 'A' 64*4882a593Smuzhiyun #define BURN_HOSTED_FW 'B' 65*4882a593Smuzhiyun #define PING_VALID 'I' 66*4882a593Smuzhiyun #define PONG_VALID 'O' 67*4882a593Smuzhiyun #define PING_AVAIL 'I' 68*4882a593Smuzhiyun #define PONG_AVAIL 'O' 69*4882a593Smuzhiyun #define EOF_REACHED 'E' 70*4882a593Smuzhiyun #define CHECK_CRC 'K' 71*4882a593Smuzhiyun #define POLLING_MODE 'P' 72*4882a593Smuzhiyun #define CONFIG_AUTO_READ_MODE 'R' 73*4882a593Smuzhiyun #define JUMP_TO_ZERO_PC 'J' 74*4882a593Smuzhiyun #define FW_LOADING_SUCCESSFUL 'S' 75*4882a593Smuzhiyun #define LOADING_INITIATED '1' 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun #define RSI_ULP_RESET_REG 0x161 78*4882a593Smuzhiyun #define RSI_WATCH_DOG_TIMER_1 0x16c 79*4882a593Smuzhiyun #define RSI_WATCH_DOG_TIMER_2 0x16d 80*4882a593Smuzhiyun #define RSI_WATCH_DOG_DELAY_TIMER_1 0x16e 81*4882a593Smuzhiyun #define RSI_WATCH_DOG_DELAY_TIMER_2 0x16f 82*4882a593Smuzhiyun #define RSI_WATCH_DOG_TIMER_ENABLE 0x170 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun /* Watchdog timer addresses for 9116 */ 85*4882a593Smuzhiyun #define NWP_AHB_BASE_ADDR 0x41300000 86*4882a593Smuzhiyun #define NWP_WWD_INTERRUPT_TIMER (NWP_AHB_BASE_ADDR + 0x300) 87*4882a593Smuzhiyun #define NWP_WWD_SYSTEM_RESET_TIMER (NWP_AHB_BASE_ADDR + 0x304) 88*4882a593Smuzhiyun #define NWP_WWD_WINDOW_TIMER (NWP_AHB_BASE_ADDR + 0x308) 89*4882a593Smuzhiyun #define NWP_WWD_TIMER_SETTINGS (NWP_AHB_BASE_ADDR + 0x30C) 90*4882a593Smuzhiyun #define NWP_WWD_MODE_AND_RSTART (NWP_AHB_BASE_ADDR + 0x310) 91*4882a593Smuzhiyun #define NWP_WWD_RESET_BYPASS (NWP_AHB_BASE_ADDR + 0x314) 92*4882a593Smuzhiyun #define NWP_FSM_INTR_MASK_REG (NWP_AHB_BASE_ADDR + 0x104) 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun /* Watchdog timer values */ 95*4882a593Smuzhiyun #define NWP_WWD_INT_TIMER_CLKS 5 96*4882a593Smuzhiyun #define NWP_WWD_SYS_RESET_TIMER_CLKS 4 97*4882a593Smuzhiyun #define NWP_WWD_TIMER_DISABLE 0xAA0001 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun #define RSI_ULP_WRITE_0 00 100*4882a593Smuzhiyun #define RSI_ULP_WRITE_2 02 101*4882a593Smuzhiyun #define RSI_ULP_WRITE_50 50 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun #define RSI_RESTART_WDT BIT(11) 104*4882a593Smuzhiyun #define RSI_BYPASS_ULP_ON_WDT BIT(1) 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun #define RSI_ULP_TIMER_ENABLE ((0xaa000) | RSI_RESTART_WDT | \ 107*4882a593Smuzhiyun RSI_BYPASS_ULP_ON_WDT) 108*4882a593Smuzhiyun #define RSI_RF_SPI_PROG_REG_BASE_ADDR 0x40080000 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun #define RSI_GSPI_CTRL_REG0 (RSI_RF_SPI_PROG_REG_BASE_ADDR) 111*4882a593Smuzhiyun #define RSI_GSPI_CTRL_REG1 (RSI_RF_SPI_PROG_REG_BASE_ADDR + 0x2) 112*4882a593Smuzhiyun #define RSI_GSPI_DATA_REG0 (RSI_RF_SPI_PROG_REG_BASE_ADDR + 0x4) 113*4882a593Smuzhiyun #define RSI_GSPI_DATA_REG1 (RSI_RF_SPI_PROG_REG_BASE_ADDR + 0x6) 114*4882a593Smuzhiyun #define RSI_GSPI_DATA_REG2 (RSI_RF_SPI_PROG_REG_BASE_ADDR + 0x8) 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun #define RSI_GSPI_CTRL_REG0_VALUE 0x340 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun #define RSI_GSPI_DMA_MODE BIT(13) 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun #define RSI_GSPI_2_ULP BIT(12) 121*4882a593Smuzhiyun #define RSI_GSPI_TRIG BIT(7) 122*4882a593Smuzhiyun #define RSI_GSPI_READ BIT(6) 123*4882a593Smuzhiyun #define RSI_GSPI_RF_SPI_ACTIVE BIT(8) 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun /* Boot loader commands */ 126*4882a593Smuzhiyun #define SEND_RPS_FILE '2' 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun #define FW_IMAGE_MIN_ADDRESS (68 * 1024) 129*4882a593Smuzhiyun #define MAX_FLASH_FILE_SIZE (400 * 1024) //400K 130*4882a593Smuzhiyun #define FLASH_START_ADDRESS 16 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun #define COMMON_HAL_CARD_READY_IND 0x0 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun #define COMMAN_HAL_WAIT_FOR_CARD_READY 1 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun #define RSI_DEV_OPMODE_WIFI_ALONE 1 137*4882a593Smuzhiyun #define RSI_DEV_COEX_MODE_WIFI_ALONE 1 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun #define BBP_INFO_40MHZ 0x6 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun #define FW_FLASH_OFFSET 0x820 142*4882a593Smuzhiyun #define LMAC_VER_OFFSET_9113 (FW_FLASH_OFFSET + 0x200) 143*4882a593Smuzhiyun #define LMAC_VER_OFFSET_9116 0x22C2 144*4882a593Smuzhiyun #define MAX_DWORD_ALIGN_BYTES 64 145*4882a593Smuzhiyun #define RSI_COMMON_REG_SIZE 2 146*4882a593Smuzhiyun #define RSI_9116_REG_SIZE 4 147*4882a593Smuzhiyun #define FW_ALIGN_SIZE 4 148*4882a593Smuzhiyun #define RSI_9116_FW_MAGIC_WORD 0x5aa5 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun #define MEM_ACCESS_CTRL_FROM_HOST 0x41300000 151*4882a593Smuzhiyun #define RAM_384K_ACCESS_FROM_TA (BIT(2) | BIT(3) | BIT(4) | BIT(5) | \ 152*4882a593Smuzhiyun BIT(20) | BIT(21) | BIT(22) | \ 153*4882a593Smuzhiyun BIT(23) | BIT(24) | BIT(25)) 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun struct bl_header { 156*4882a593Smuzhiyun __le32 flags; 157*4882a593Smuzhiyun __le32 image_no; 158*4882a593Smuzhiyun __le32 check_sum; 159*4882a593Smuzhiyun __le32 flash_start_address; 160*4882a593Smuzhiyun __le32 flash_len; 161*4882a593Smuzhiyun } __packed; 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun struct ta_metadata { 164*4882a593Smuzhiyun char *name; 165*4882a593Smuzhiyun unsigned int address; 166*4882a593Smuzhiyun }; 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun #define RSI_BL_CTRL_LEN_MASK 0xFFFFFF 169*4882a593Smuzhiyun #define RSI_BL_CTRL_SPI_32BIT_MODE BIT(27) 170*4882a593Smuzhiyun #define RSI_BL_CTRL_REL_TA_SOFTRESET BIT(28) 171*4882a593Smuzhiyun #define RSI_BL_CTRL_START_FROM_ROM_PC BIT(29) 172*4882a593Smuzhiyun #define RSI_BL_CTRL_SPI_8BIT_MODE BIT(30) 173*4882a593Smuzhiyun #define RSI_BL_CTRL_LAST_ENTRY BIT(31) 174*4882a593Smuzhiyun struct bootload_entry { 175*4882a593Smuzhiyun __le32 control; 176*4882a593Smuzhiyun __le32 dst_addr; 177*4882a593Smuzhiyun } __packed; 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun struct bootload_ds { 180*4882a593Smuzhiyun __le16 fixed_pattern; 181*4882a593Smuzhiyun __le16 offset; 182*4882a593Smuzhiyun __le32 reserved; 183*4882a593Smuzhiyun struct bootload_entry bl_entry[7]; 184*4882a593Smuzhiyun } __packed; 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun struct rsi_mgmt_desc { 187*4882a593Smuzhiyun __le16 len_qno; 188*4882a593Smuzhiyun u8 frame_type; 189*4882a593Smuzhiyun u8 misc_flags; 190*4882a593Smuzhiyun u8 xtend_desc_size; 191*4882a593Smuzhiyun u8 header_len; 192*4882a593Smuzhiyun __le16 frame_info; 193*4882a593Smuzhiyun __le16 rate_info; 194*4882a593Smuzhiyun __le16 bbp_info; 195*4882a593Smuzhiyun __le16 seq_ctrl; 196*4882a593Smuzhiyun u8 reserved2; 197*4882a593Smuzhiyun u8 sta_id; 198*4882a593Smuzhiyun } __packed; 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun struct rsi_data_desc { 201*4882a593Smuzhiyun __le16 len_qno; 202*4882a593Smuzhiyun u8 cfm_frame_type; 203*4882a593Smuzhiyun u8 misc_flags; 204*4882a593Smuzhiyun u8 xtend_desc_size; 205*4882a593Smuzhiyun u8 header_len; 206*4882a593Smuzhiyun __le16 frame_info; 207*4882a593Smuzhiyun __le16 rate_info; 208*4882a593Smuzhiyun __le16 bbp_info; 209*4882a593Smuzhiyun __le16 mac_flags; 210*4882a593Smuzhiyun u8 qid_tid; 211*4882a593Smuzhiyun u8 sta_id; 212*4882a593Smuzhiyun } __packed; 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun struct rsi_bt_desc { 215*4882a593Smuzhiyun __le16 len_qno; 216*4882a593Smuzhiyun __le16 reserved1; 217*4882a593Smuzhiyun __le32 reserved2; 218*4882a593Smuzhiyun __le32 reserved3; 219*4882a593Smuzhiyun __le16 reserved4; 220*4882a593Smuzhiyun __le16 bt_pkt_type; 221*4882a593Smuzhiyun } __packed; 222*4882a593Smuzhiyun 223*4882a593Smuzhiyun int rsi_hal_device_init(struct rsi_hw *adapter); 224*4882a593Smuzhiyun int rsi_prepare_mgmt_desc(struct rsi_common *common, struct sk_buff *skb); 225*4882a593Smuzhiyun int rsi_prepare_data_desc(struct rsi_common *common, struct sk_buff *skb); 226*4882a593Smuzhiyun int rsi_prepare_beacon(struct rsi_common *common, struct sk_buff *skb); 227*4882a593Smuzhiyun int rsi_send_pkt_to_bus(struct rsi_common *common, struct sk_buff *skb); 228*4882a593Smuzhiyun int rsi_send_bt_pkt(struct rsi_common *common, struct sk_buff *skb); 229*4882a593Smuzhiyun 230*4882a593Smuzhiyun #endif 231