#ifndef __INC_BTC_FW_DEF_H__ #define __INC_BTC_FW_DEF_H__ #pragma pack(push) #pragma pack(1) /* * shared FW Definition */ #define CXMREG_MAX 30 #define FCXDEF_STEP 50 /* MUST fw_step size*/ #define BTC_CYCLE_SLOT_MAX 48 /* must be even number, non-zero */ enum btc_bt_rfk_counter { BTC_BCNT_RFK_REQ = 0, BTC_BCNT_RFK_GO = 1, BTC_BCNT_RFK_REJECT = 2, BTC_BCNT_RFK_FAIL = 3, BTC_BCNT_RFK_TIMEOUT = 4, BTC_BCNT_RFK_MAX }; struct btc_rpt_ctrl_wl_fw_info { u32 cx_ver; /* match which driver's coex version */ u32 cx_offload; u32 fw_ver; }; struct btc_rpt_ctrl_info { u32 cnt; /* fw report counter */ u32 en; /* report map */ u32 para; /* not used */ u32 cnt_c2h; /* fw send c2h counter */ u32 cnt_h2c; /* fw recv h2c counter */ u32 len_c2h; /* The total length of the last C2H */ }; struct btc_rpt_ctrl_a2dp_empty { u32 cnt_empty; /* a2dp empty count */ u32 cnt_flowctrl; /* a2dp empty flow control counter */ u32 cnt_tx; u32 cnt_ack; u32 cnt_nack; }; struct btc_rpt_ctrl_bt_mailbox { u32 cnt_send_ok; /* fw send mailbox ok counter */ u32 cnt_send_fail; /* fw send mailbox fail counter */ u32 cnt_recv; /* fw recv mailbox counter */ struct btc_rpt_ctrl_a2dp_empty a2dp; }; #define FCX_BTCRPT_VER 2 struct fbtc_rpt_ctrl { u8 fver; u8 rsvd; u16 rsvd1; struct btc_rpt_ctrl_info rpt_info; struct btc_rpt_ctrl_wl_fw_info wl_fw_info; struct btc_rpt_ctrl_bt_mailbox bt_mbx_info; u32 bt_rfk_cnt[BTC_BCNT_RFK_MAX]; }; /* * ============== TDMA related ============== */ enum fbtc_tdma_template { CXTD_OFF = 0x0, CXTD_OFF_B2, CXTD_OFF_EXT, CXTD_FIX, CXTD_PFIX, CXTD_AUTO, CXTD_PAUTO, CXTD_AUTO2, CXTD_PAUTO2, CXTD_MAX }; enum fbtc_tdma_type { CXTDMA_OFF = 0x0, /* tdma off */ CXTDMA_FIX = 0x1, /* fixed slot */ CXTDMA_AUTO = 0x2, /* auto slot */ CXTDMA_AUTO2 = 0x3, /* extended auto slot */ CXTDMA_MAX }; enum fbtc_tdma_rx_flow_ctrl { CXFLC_OFF = 0x0, /* rx flow off */ CXFLC_NULLP = 0x1, /* Null/Null-P */ CXFLC_QOSNULL = 0x2, /* QOS Null/Null-P */ CXFLC_CTS = 0x3, /* CTS to Self control */ CXFLC_MAX }; enum fbtc_tdma_wlan_tx_pause { CXTPS_OFF = 0x0, /* no wl tx pause*/ CXTPS_ON = 0x1, CXTPS_MAX }; /* define if ext-ctrl-slot allowed while TDMA off */ enum fbtc_ext_ctrl_type { CXECTL_OFF = 0x0, /* tdma off */ CXECTL_B2 = 0x1, /* allow B2 (beacon-early) */ CXECTL_EXT = 0x2, CXECTL_MAX }; union fbtc_rxflct { u8 val; u8 type: 3; u8 tgln_n: 5; }; #define FCX_TDMA_VER 2 struct fbtc_tdma { u8 type; /* refer to fbtc_tdma_type*/ u8 rxflctrl; /* refer to fbtc_tdma_rx_flow_ctrl */ u8 txflctrl; /* If WL stop Tx while enter BT-slot */ u8 wtgle_n; /* wl slot toggle every toggle_n cycles */ u8 leak_n; /* every leak_n cycle do leak detection */ u8 ext_ctrl; /* refer to fbtc_ext_ctrl_type*/ /* send rxflctrl to which role * enum role_type, default: 0 for single-role * if multi-role: [7:4] second-role, [3:0] fisrt-role */ u8 rxflctrl_role; u8 rsvd; }; struct fbtc_1tdma { u8 fver; u8 rsvd; u16 rsvd1; struct fbtc_tdma tdma; }; /* * ============== SLOT related ============== */ enum { /* slot */ CXST_OFF = 0x0, CXST_B2W = 0x1, CXST_W1 = 0x2, CXST_W2 = 0x3, CXST_W2B = 0x4, CXST_B1 = 0x5, CXST_B2 = 0x6, CXST_B3 = 0x7, CXST_B4 = 0x8, CXST_LK = 0x9, CXST_BLK = 0xa, CXST_E2G = 0xb, /* for ext-control-slot 2G*/ CXST_E5G = 0xc, /* for ext-control-slot 5G*/ CXST_EBT = 0xd, /* for ext-control-slot BT*/ CXST_ENULL = 0xe, /* for ext-control-slot Null*/ CXST_WLK = 0xf, /* for WL link slot */ CXST_W1FDD = 0x10, CXST_B1FDD = 0x11, CXST_MAX = 0x12 /* The max slot must be even*/ }; enum { CXEVNT_TDMA_ENTRY = 0x0, CXEVNT_WL_TMR, CXEVNT_B1_TMR, CXEVNT_B2_TMR, CXEVNT_B3_TMR, CXEVNT_B4_TMR, CXEVNT_W2B_TMR, CXEVNT_B2W_TMR, CXEVNT_BCN_EARLY, CXEVNT_A2DP_EMPTY, CXEVNT_LK_END, CXEVNT_RX_ISR, CXEVNT_RX_FC0, CXEVNT_RX_FC1, CXEVNT_BT_RELINK, CXEVNT_BT_RETRY, CXEVNT_E2G, CXEVNT_E5G, CXEVNT_EBT, CXEVNT_ENULL, CXEVNT_DRV_WLK, CXEVNT_BCN_OK, CXEVNT_BT_CHANGE, CXEVNT_EBT_EXTEND, CXEVNT_E2G_NULL1, CXEVNT_MAX }; enum { CXBCN_ALL = 0x0, CXBCN_ALL_OK, CXBCN_BT_SLOT, CXBCN_BT_OK, CXBCN_MAX }; /* Slot isolation Definition * Same definition as WL RX Definition */ enum { SLOT_MIX = 0x0, /* accept BT Lower-Pri Tx/Rx request 0x778 = 1 */ SLOT_ISO = 0x1, /* no accept BT Lower-Pri Tx/Rx request 0x778 = d*/ CXSTYPE_MAX }; enum { /* TIME */ CXT_BT = 0x0, CXT_WL = 0x1, CXT_MAX }; enum { /* TIME-A2DP */ CXT_FLCTRL_OFF = 0x0, CXT_FLCTRL_ON = 0x1, CXT_FLCTRL_MAX }; enum { /* STEP TYPE */ CXSTEP_NONE = 0x0, CXSTEP_EVNT = 0x1, CXSTEP_SLOT = 0x2, CXSTEP_MAX }; enum { CXNULL_STATE_0 = 0, CXNULL_STATE_1 = 1, CXNULL_STATE_MAX = 2 }; enum { CXNULL_FAIL = 0, CXNULL_OK = 1, CXNULL_LATE = 2, CXNULL_RETRY = 3, CXNULL_TX = 4, CXNULL_MAX = 5 }; struct fbtc_set_drvinfo { u8 type; u8 len; u8 buf[1]; }; #define FCX_GPIODBG_VER 1 #define BTC_DBG_MAX1 32 struct fbtc_gpio_dbg { u8 fver; u8 rsvd; u16 rsvd2; u32 en_map; /* which debug signal (see btc_wl_gpio_debug) is enable */ u32 pre_state; /* the debug signal is 1 or 0 */ u8 gpio_map[BTC_DBG_MAX1]; /*the debug signals to GPIO-Position mapping */ }; #define FCX_MREG_VER 1 struct fbtc_mreg_val { u8 fver; u8 reg_num; u16 rsvd; u32 mreg_val[CXMREG_MAX]; }; struct fbtc_mreg { u16 type; u16 bytes; u32 offset; }; #define FCX_SLOT_VER 1 struct fbtc_slot { u16 dur; /* slot duration */ u32 cxtbl; u16 cxtype; }; struct fbtc_1slot { u8 fver; u8 sid; /* slot id */ struct fbtc_slot slot; }; struct fbtc_slots { u8 fver; u8 tbl_num; u16 rsvd; u32 update_map; struct fbtc_slot slot[CXST_MAX]; }; #define FCX_STEP_VER 3 struct fbtc_step { u8 type; u8 val; u16 difft; }; struct fbtc_steps { u8 fver; u8 en; u16 rsvd; u32 cnt; struct fbtc_step step[FCXDEF_STEP]; }; #define FCX_CYSTA_VER 3 struct fbtc_fdd_try_info { u16 cycles[CXT_FLCTRL_MAX]; u16 tavg[CXT_FLCTRL_MAX]; /* avg try BT-Slot-TDD/BT-slot-FDD time */ u16 tmax[CXT_FLCTRL_MAX]; /* max try BT-Slot-TDD/BT-slot-FDD time */ }; struct fbtc_cycle_time_info { u16 tavg[CXT_MAX]; /* avg wl/bt cycle time */ u16 tmax[CXT_MAX]; /* max wl/bt cycle time */ u16 tmaxdiff[CXT_MAX]; /* max wl-wl bt-bt cycle diff time */ }; struct fbtc_a2dp_trx_stat { u8 empty_cnt; u8 retry_cnt; u8 tx_rate; u8 tx_cnt; u8 ack_cnt; u8 nack_cnt; u8 rsvd1; u8 rsvd2; }; struct fbtc_cycle_a2dp_empty_info { u16 cnt; /* a2dp empty cnt */ u16 cnt_timeout; /* a2dp empty timeout cnt*/ u16 tavg; /* avg a2dp empty time */ u16 tmax; /* max a2dp empty time */ }; struct fbtc_cycle_leak_info { u32 cnt_rximr; /* the rximr occur at leak slot */ u16 tavg; /* avg leak-slot time */ u16 tamx; /* max leak-slot time */ }; struct fbtc_cysta { /* statistics for cycles */ u8 fver; u8 rsvd; u16 cycles; /* total cycle number */ u16 slot_step_time[BTC_CYCLE_SLOT_MAX]; /*record the wl/bt slot time, max_step = BTC_CYCLE_SLOT_MAX */ struct fbtc_cycle_time_info cycle_time; struct fbtc_fdd_try_info fdd_try; struct fbtc_cycle_a2dp_empty_info a2dp_ept; struct fbtc_a2dp_trx_stat a2dp_trx[BTC_CYCLE_SLOT_MAX]; struct fbtc_cycle_leak_info leak_slot; u32 slot_cnt[CXST_MAX]; /* slot count */ u32 bcn_cnt[CXBCN_MAX]; u32 collision_cnt; /* counter for event/timer occur at the same time */ u32 skip_cnt; u32 except_cnt; u32 except_map; }; #define FCX_NULLSTA_VER 2 struct fbtc_cynullsta { /* cycle null statistics */ u8 fver; u8 rsvd; u16 rsvd2; u32 tmax[CXNULL_STATE_MAX]; /* max_t for 0:null0/1:null1 */ u32 tavg[CXNULL_STATE_MAX]; /* avg_t for 0:null0/1:null1 */ u32 result[CXNULL_STATE_MAX][CXNULL_MAX]; /* result for null , 0:fail, 1:ok, 2:late, 3:retry */ }; #define FCX_BTVER_VER 1 struct fbtc_btver { u8 fver; u8 rsvd; u16 rsvd2; u32 coex_ver; /*bit[15:8]->shared, bit[7:0]->non-shared */ u32 fw_ver; u32 feature; }; #define FCX_BTSCAN_VER 1 struct fbtc_btscan { u8 fver; u8 rsvd; u16 rsvd2; u8 scan[6]; }; #define FCX_BTAFH_VER 1 struct fbtc_btafh { u8 fver; u8 rsvd; u16 rsvd2; u8 afh_l[4]; /*bit0:2402, bit1: 2403.... bit31:2433 */ u8 afh_m[4]; /*bit0:2434, bit1: 2435.... bit31:2465 */ u8 afh_h[4]; /*bit0:2466, bit1:2467......bit14:2480 */ }; #define FCX_BTDEVINFO_VER 1 struct fbtc_btdevinfo { u8 fver; u8 rsvd; u16 vendor_id; u32 dev_name; /* only 24 bits valid */ u32 flush_time; }; /* * End of FW Definition */ #pragma pack(pop) #endif /* __INC_BTC_FW_DEF_H__ */