1d5f8d0d6SJiao Xianjun // Author: Xianjun jiao, Michael Mehari, Wei Liu 2d5f8d0d6SJiao Xianjun // SPDX-FileCopyrightText: 2019 UGent 3a6085186SLina Ceballos // SPDX-License-Identifier: AGPL-3.0-or-later 42ee67178SXianjun Jiao 5a7396dd9SXianjun Jiao // #ifndef __HW_DEF_H_FILE__ 6a7396dd9SXianjun Jiao // #define __HW_DEF_H_FILE__ 72ee67178SXianjun Jiao const char *sdr_compatible_str = "sdr,sdr"; 82ee67178SXianjun Jiao 96e3730c0Smmehari enum openwifi_fpga_type { 106e3730c0Smmehari SMALL_FPGA = 0, 116e3730c0Smmehari LARGE_FPGA = 1, 126e3730c0Smmehari }; 136e3730c0Smmehari 142ee67178SXianjun Jiao enum openwifi_band { 152ee67178SXianjun Jiao BAND_900M = 0, 162ee67178SXianjun Jiao BAND_2_4GHZ, 172ee67178SXianjun Jiao BAND_3_65GHZ, 182ee67178SXianjun Jiao BAND_5_0GHZ, 192ee67178SXianjun Jiao BAND_5_8GHZ, 202ee67178SXianjun Jiao BAND_5_9GHZ, 212ee67178SXianjun Jiao BAND_60GHZ, 222ee67178SXianjun Jiao }; 232ee67178SXianjun Jiao 242ee67178SXianjun Jiao // ------------------------------------tx interface---------------------------------------- 252ee67178SXianjun Jiao const char *tx_intf_compatible_str = "sdr,tx_intf"; 262ee67178SXianjun Jiao 272ee67178SXianjun Jiao #define TX_INTF_REG_MULTI_RST_ADDR (0*4) 28f6ba34deSXianjun Jiao #define TX_INTF_REG_ARBITRARY_IQ_ADDR (1*4) 292ee67178SXianjun Jiao #define TX_INTF_REG_WIFI_TX_MODE_ADDR (2*4) 302ee67178SXianjun Jiao #define TX_INTF_REG_CTS_TOSELF_CONFIG_ADDR (4*4) 31d14d06e5SXianjun Jiao #define TX_INTF_REG_CSI_FUZZER_ADDR (5*4) 322ee67178SXianjun Jiao #define TX_INTF_REG_CTS_TOSELF_WAIT_SIFS_TOP_ADDR (6*4) 33f6ba34deSXianjun Jiao #define TX_INTF_REG_ARBITRARY_IQ_CTL_ADDR (7*4) 34f738aefaSmmehari #define TX_INTF_REG_TX_CONFIG_ADDR (8*4) 352ee67178SXianjun Jiao #define TX_INTF_REG_NUM_DMA_SYMBOL_TO_PS_ADDR (9*4) 362ee67178SXianjun Jiao #define TX_INTF_REG_CFG_DATA_TO_ANT_ADDR (10*4) 37838a9007SXianjun Jiao #define TX_INTF_REG_S_AXIS_FIFO_TH_ADDR (11*4) 38febc5adfSXianjun Jiao #define TX_INTF_REG_TX_HOLD_THRESHOLD_ADDR (12*4) 392ee67178SXianjun Jiao #define TX_INTF_REG_BB_GAIN_ADDR (13*4) 402ee67178SXianjun Jiao #define TX_INTF_REG_INTERRUPT_SEL_ADDR (14*4) 41f738aefaSmmehari #define TX_INTF_REG_AMPDU_ACTION_CONFIG_ADDR (15*4) 422ee67178SXianjun Jiao #define TX_INTF_REG_ANT_SEL_ADDR (16*4) 43f738aefaSmmehari #define TX_INTF_REG_PHY_HDR_CONFIG_ADDR (17*4) 44838a9007SXianjun Jiao #define TX_INTF_REG_S_AXIS_FIFO_NO_ROOM_ADDR (21*4) 45f738aefaSmmehari #define TX_INTF_REG_PKT_INFO1_ADDR (22*4) 46f738aefaSmmehari #define TX_INTF_REG_PKT_INFO2_ADDR (23*4) 47f738aefaSmmehari #define TX_INTF_REG_PKT_INFO3_ADDR (24*4) 48f738aefaSmmehari #define TX_INTF_REG_PKT_INFO4_ADDR (25*4) 49f738aefaSmmehari #define TX_INTF_REG_QUEUE_FIFO_DATA_COUNT_ADDR (26*4) 502ee67178SXianjun Jiao 512ee67178SXianjun Jiao #define TX_INTF_NUM_ANTENNA 2 522ee67178SXianjun Jiao #define TX_INTF_NUM_BYTE_PER_DMA_SYMBOL (64/8) 532ee67178SXianjun Jiao #define TX_INTF_NUM_BYTE_PER_DMA_SYMBOL_IN_BITS 3 542ee67178SXianjun Jiao 552ee67178SXianjun Jiao enum tx_intf_mode { 562ee67178SXianjun Jiao TX_INTF_AXIS_LOOP_BACK = 0, 572ee67178SXianjun Jiao TX_INTF_BYPASS, 582ee67178SXianjun Jiao TX_INTF_BW_20MHZ_AT_0MHZ_ANT0, 592ee67178SXianjun Jiao TX_INTF_BW_20MHZ_AT_0MHZ_ANT1, 604d39160bSXianjun Jiao TX_INTF_BW_20MHZ_AT_0MHZ_ANT_BOTH, 612ee67178SXianjun Jiao TX_INTF_BW_20MHZ_AT_N_10MHZ_ANT0, 622ee67178SXianjun Jiao TX_INTF_BW_20MHZ_AT_P_10MHZ_ANT0, 632ee67178SXianjun Jiao TX_INTF_BW_20MHZ_AT_N_10MHZ_ANT1, 642ee67178SXianjun Jiao TX_INTF_BW_20MHZ_AT_P_10MHZ_ANT1, 652ee67178SXianjun Jiao }; 662ee67178SXianjun Jiao 67a7396dd9SXianjun Jiao const int tx_intf_fo_mapping[] = {0, 0, 0, 0, 0, -10, 10, -10, 10}; 68838a9007SXianjun Jiao const u32 dma_symbol_fifo_size_hw_queue[] = {4*1024, 4*1024, 4*1024, 4*1024}; // !!!make sure align to fifo in tx_intf_s_axis.v 692ee67178SXianjun Jiao 702ee67178SXianjun Jiao struct tx_intf_driver_api { 710c0d5d82Smmehari u32 (*hw_init)(enum tx_intf_mode mode, u32 tx_config, u32 num_dma_symbol_to_ps, enum openwifi_fpga_type fpga_type); 722ee67178SXianjun Jiao 732ee67178SXianjun Jiao u32 (*reg_read)(u32 reg); 742ee67178SXianjun Jiao void (*reg_write)(u32 reg, u32 value); 752ee67178SXianjun Jiao 762ee67178SXianjun Jiao u32 (*TX_INTF_REG_MULTI_RST_read)(void); 77469b96d3SXianjun Jiao u32 (*TX_INTF_REG_ARBITRARY_IQ_read)(void); 782ee67178SXianjun Jiao u32 (*TX_INTF_REG_WIFI_TX_MODE_read)(void); 792ee67178SXianjun Jiao u32 (*TX_INTF_REG_CTS_TOSELF_CONFIG_read)(void); 80d14d06e5SXianjun Jiao u32 (*TX_INTF_REG_CSI_FUZZER_read)(void); 812ee67178SXianjun Jiao u32 (*TX_INTF_REG_CTS_TOSELF_WAIT_SIFS_TOP_read)(void); 82469b96d3SXianjun Jiao u32 (*TX_INTF_REG_ARBITRARY_IQ_CTL_read)(void); 83f738aefaSmmehari u32 (*TX_INTF_REG_TX_CONFIG_read)(void); 842ee67178SXianjun Jiao u32 (*TX_INTF_REG_NUM_DMA_SYMBOL_TO_PS_read)(void); 852ee67178SXianjun Jiao u32 (*TX_INTF_REG_CFG_DATA_TO_ANT_read)(void); 86838a9007SXianjun Jiao u32 (*TX_INTF_REG_S_AXIS_FIFO_TH_read)(void); 87febc5adfSXianjun Jiao u32 (*TX_INTF_REG_TX_HOLD_THRESHOLD_read)(void); 882ee67178SXianjun Jiao u32 (*TX_INTF_REG_INTERRUPT_SEL_read)(void); 89f738aefaSmmehari u32 (*TX_INTF_REG_AMPDU_ACTION_CONFIG_read)(void); 902ee67178SXianjun Jiao u32 (*TX_INTF_REG_BB_GAIN_read)(void); 912ee67178SXianjun Jiao u32 (*TX_INTF_REG_ANT_SEL_read)(void); 92f738aefaSmmehari u32 (*TX_INTF_REG_PHY_HDR_CONFIG_read)(void); 93838a9007SXianjun Jiao u32 (*TX_INTF_REG_S_AXIS_FIFO_NO_ROOM_read)(void); 94f738aefaSmmehari u32 (*TX_INTF_REG_PKT_INFO1_read)(void); 95f738aefaSmmehari u32 (*TX_INTF_REG_PKT_INFO2_read)(void); 96f738aefaSmmehari u32 (*TX_INTF_REG_PKT_INFO3_read)(void); 97f738aefaSmmehari u32 (*TX_INTF_REG_PKT_INFO4_read)(void); 982ee67178SXianjun Jiao u32 (*TX_INTF_REG_QUEUE_FIFO_DATA_COUNT_read)(void); 992ee67178SXianjun Jiao 1002ee67178SXianjun Jiao void (*TX_INTF_REG_MULTI_RST_write)(u32 value); 101469b96d3SXianjun Jiao void (*TX_INTF_REG_ARBITRARY_IQ_write)(u32 value); 1022ee67178SXianjun Jiao void (*TX_INTF_REG_WIFI_TX_MODE_write)(u32 value); 1032ee67178SXianjun Jiao void (*TX_INTF_REG_CTS_TOSELF_CONFIG_write)(u32 value); 104d14d06e5SXianjun Jiao void (*TX_INTF_REG_CSI_FUZZER_write)(u32 value); 1052ee67178SXianjun Jiao void (*TX_INTF_REG_CTS_TOSELF_WAIT_SIFS_TOP_write)(u32 value); 106469b96d3SXianjun Jiao void (*TX_INTF_REG_ARBITRARY_IQ_CTL_write)(u32 value); 107f738aefaSmmehari void (*TX_INTF_REG_TX_CONFIG_write)(u32 value); 1082ee67178SXianjun Jiao void (*TX_INTF_REG_NUM_DMA_SYMBOL_TO_PS_write)(u32 value); 1092ee67178SXianjun Jiao void (*TX_INTF_REG_CFG_DATA_TO_ANT_write)(u32 value); 110838a9007SXianjun Jiao void (*TX_INTF_REG_S_AXIS_FIFO_TH_write)(u32 value); 111febc5adfSXianjun Jiao void (*TX_INTF_REG_TX_HOLD_THRESHOLD_write)(u32 value); 1122ee67178SXianjun Jiao void (*TX_INTF_REG_INTERRUPT_SEL_write)(u32 value); 113f738aefaSmmehari void (*TX_INTF_REG_AMPDU_ACTION_CONFIG_write)(u32 value); 1142ee67178SXianjun Jiao void (*TX_INTF_REG_BB_GAIN_write)(u32 value); 1152ee67178SXianjun Jiao void (*TX_INTF_REG_ANT_SEL_write)(u32 value); 116f738aefaSmmehari void (*TX_INTF_REG_PHY_HDR_CONFIG_write)(u32 value); 117838a9007SXianjun Jiao void (*TX_INTF_REG_S_AXIS_FIFO_NO_ROOM_write)(u32 value); 118f738aefaSmmehari void (*TX_INTF_REG_PKT_INFO1_write)(u32 value); 119f738aefaSmmehari void (*TX_INTF_REG_PKT_INFO2_write)(u32 value); 120f738aefaSmmehari void (*TX_INTF_REG_PKT_INFO3_write)(u32 value); 121f738aefaSmmehari void (*TX_INTF_REG_PKT_INFO4_write)(u32 value); 1222ee67178SXianjun Jiao }; 1232ee67178SXianjun Jiao 1242ee67178SXianjun Jiao // ------------------------------------rx interface---------------------------------------- 1252ee67178SXianjun Jiao const char *rx_intf_compatible_str = "sdr,rx_intf"; 1262ee67178SXianjun Jiao 1272ee67178SXianjun Jiao #define RX_INTF_REG_MULTI_RST_ADDR (0*4) 1282ee67178SXianjun Jiao #define RX_INTF_REG_MIXER_CFG_ADDR (1*4) 1292ee67178SXianjun Jiao #define RX_INTF_REG_INTERRUPT_TEST_ADDR (2*4) 1302ee67178SXianjun Jiao #define RX_INTF_REG_IQ_SRC_SEL_ADDR (3*4) 1312ee67178SXianjun Jiao #define RX_INTF_REG_IQ_CTRL_ADDR (4*4) 1322ee67178SXianjun Jiao #define RX_INTF_REG_START_TRANS_TO_PS_MODE_ADDR (5*4) 1332ee67178SXianjun Jiao #define RX_INTF_REG_START_TRANS_TO_PS_ADDR (6*4) 1342ee67178SXianjun Jiao #define RX_INTF_REG_START_TRANS_TO_PS_SRC_SEL_ADDR (7*4) 1352ee67178SXianjun Jiao #define RX_INTF_REG_NUM_DMA_SYMBOL_TO_PL_ADDR (8*4) 1362ee67178SXianjun Jiao #define RX_INTF_REG_NUM_DMA_SYMBOL_TO_PS_ADDR (9*4) 1372ee67178SXianjun Jiao #define RX_INTF_REG_CFG_DATA_TO_ANT_ADDR (10*4) 138b73660adSXianjun Jiao #define RX_INTF_REG_BB_GAIN_ADDR (11*4) 1392ee67178SXianjun Jiao #define RX_INTF_REG_TLAST_TIMEOUT_TOP_ADDR (12*4) 1402ee67178SXianjun Jiao #define RX_INTF_REG_S2MM_INTR_DELAY_COUNT_ADDR (13*4) 1412ee67178SXianjun Jiao #define RX_INTF_REG_ANT_SEL_ADDR (16*4) 1422ee67178SXianjun Jiao 1432ee67178SXianjun Jiao #define RX_INTF_NUM_ANTENNA 2 1442ee67178SXianjun Jiao #define RX_INTF_NUM_BYTE_PER_DMA_SYMBOL (64/8) 1452ee67178SXianjun Jiao #define RX_INTF_NUM_BYTE_PER_DMA_SYMBOL_IN_BITS 3 1462ee67178SXianjun Jiao 1472ee67178SXianjun Jiao enum rx_intf_mode { 1482ee67178SXianjun Jiao RX_INTF_AXIS_LOOP_BACK = 0, 1492ee67178SXianjun Jiao RX_INTF_BYPASS, 1502ee67178SXianjun Jiao RX_INTF_BW_20MHZ_AT_0MHZ_ANT0, 1512ee67178SXianjun Jiao RX_INTF_BW_20MHZ_AT_0MHZ_ANT1, 1522ee67178SXianjun Jiao RX_INTF_BW_20MHZ_AT_N_10MHZ_ANT0, 1532ee67178SXianjun Jiao RX_INTF_BW_20MHZ_AT_N_10MHZ_ANT1, 1542ee67178SXianjun Jiao RX_INTF_BW_20MHZ_AT_P_10MHZ_ANT0, 1552ee67178SXianjun Jiao RX_INTF_BW_20MHZ_AT_P_10MHZ_ANT1, 1562ee67178SXianjun Jiao }; 1572ee67178SXianjun Jiao 1582ee67178SXianjun Jiao const int rx_intf_fo_mapping[] = {0,0,0,0,-10,-10,10,10}; 1592ee67178SXianjun Jiao 1602ee67178SXianjun Jiao struct rx_intf_driver_api { 1612ee67178SXianjun Jiao u32 io_start; 1622ee67178SXianjun Jiao u32 base_addr; 1632ee67178SXianjun Jiao 1642ee67178SXianjun Jiao u32 (*hw_init)(enum rx_intf_mode mode, u32 num_dma_symbol_to_pl, u32 num_dma_symbol_to_ps); 1652ee67178SXianjun Jiao 1662ee67178SXianjun Jiao u32 (*reg_read)(u32 reg); 1672ee67178SXianjun Jiao void (*reg_write)(u32 reg, u32 value); 1682ee67178SXianjun Jiao 1692ee67178SXianjun Jiao u32 (*RX_INTF_REG_MULTI_RST_read)(void); 1702ee67178SXianjun Jiao u32 (*RX_INTF_REG_MIXER_CFG_read)(void); 1712ee67178SXianjun Jiao u32 (*RX_INTF_REG_IQ_SRC_SEL_read)(void); 1722ee67178SXianjun Jiao u32 (*RX_INTF_REG_IQ_CTRL_read)(void); 1732ee67178SXianjun Jiao u32 (*RX_INTF_REG_START_TRANS_TO_PS_MODE_read)(void); 1742ee67178SXianjun Jiao u32 (*RX_INTF_REG_START_TRANS_TO_PS_read)(void); 1752ee67178SXianjun Jiao u32 (*RX_INTF_REG_START_TRANS_TO_PS_SRC_SEL_read)(void); 1762ee67178SXianjun Jiao u32 (*RX_INTF_REG_NUM_DMA_SYMBOL_TO_PL_read)(void); 1772ee67178SXianjun Jiao u32 (*RX_INTF_REG_NUM_DMA_SYMBOL_TO_PS_read)(void); 1782ee67178SXianjun Jiao u32 (*RX_INTF_REG_CFG_DATA_TO_ANT_read)(void); 1792ee67178SXianjun Jiao u32 (*RX_INTF_REG_ANT_SEL_read)(void); 1802ee67178SXianjun Jiao u32 (*RX_INTF_REG_INTERRUPT_TEST_read)(void); 1812ee67178SXianjun Jiao void (*RX_INTF_REG_MULTI_RST_write)(u32 value); 1822ee67178SXianjun Jiao void (*RX_INTF_REG_MIXER_CFG_write)(u32 value); 1832ee67178SXianjun Jiao void (*RX_INTF_REG_IQ_SRC_SEL_write)(u32 value); 1842ee67178SXianjun Jiao void (*RX_INTF_REG_IQ_CTRL_write)(u32 value); 1852ee67178SXianjun Jiao void (*RX_INTF_REG_START_TRANS_TO_PS_MODE_write)(u32 value); 1862ee67178SXianjun Jiao void (*RX_INTF_REG_START_TRANS_TO_PS_write)(u32 value); 1872ee67178SXianjun Jiao void (*RX_INTF_REG_START_TRANS_TO_PS_SRC_SEL_write)(u32 value); 1882ee67178SXianjun Jiao void (*RX_INTF_REG_NUM_DMA_SYMBOL_TO_PL_write)(u32 value); 1892ee67178SXianjun Jiao void (*RX_INTF_REG_NUM_DMA_SYMBOL_TO_PS_write)(u32 value); 1902ee67178SXianjun Jiao void (*RX_INTF_REG_CFG_DATA_TO_ANT_write)(u32 value); 191b73660adSXianjun Jiao void (*RX_INTF_REG_BB_GAIN_write)(u32 value); 1922ee67178SXianjun Jiao void (*RX_INTF_REG_ANT_SEL_write)(u32 value); 1932ee67178SXianjun Jiao void (*RX_INTF_REG_INTERRUPT_TEST_write)(u32 value); 1942ee67178SXianjun Jiao 1952ee67178SXianjun Jiao void (*RX_INTF_REG_M_AXIS_RST_write)(u32 value); 1962ee67178SXianjun Jiao void (*RX_INTF_REG_S2MM_INTR_DELAY_COUNT_write)(u32 value); 1972ee67178SXianjun Jiao void (*RX_INTF_REG_TLAST_TIMEOUT_TOP_write)(u32 value); 1982ee67178SXianjun Jiao }; 1992ee67178SXianjun Jiao 2002ee67178SXianjun Jiao // ----------------------------------openofdm rx------------------------------- 2012ee67178SXianjun Jiao const char *openofdm_rx_compatible_str = "sdr,openofdm_rx"; 2022ee67178SXianjun Jiao 2032ee67178SXianjun Jiao #define OPENOFDM_RX_REG_MULTI_RST_ADDR (0*4) 2042ee67178SXianjun Jiao #define OPENOFDM_RX_REG_ENABLE_ADDR (1*4) 2052ee67178SXianjun Jiao #define OPENOFDM_RX_REG_POWER_THRES_ADDR (2*4) 2062ee67178SXianjun Jiao #define OPENOFDM_RX_REG_MIN_PLATEAU_ADDR (3*4) 207aed16d05SXianjun Jiao #define OPENOFDM_RX_REG_SOFT_DECODING_ADDR (4*4) 208e273351bSXianjun Jiao #define OPENOFDM_RX_REG_FFT_WIN_SHIFT_ADDR (5*4) 2092ee67178SXianjun Jiao #define OPENOFDM_RX_REG_STATE_HISTORY_ADDR (20*4) 2102ee67178SXianjun Jiao 2112ee67178SXianjun Jiao enum openofdm_rx_mode { 2122ee67178SXianjun Jiao OPENOFDM_RX_TEST = 0, 2132ee67178SXianjun Jiao OPENOFDM_RX_NORMAL, 2142ee67178SXianjun Jiao }; 2152ee67178SXianjun Jiao 216585a5601SXianjun Jiao #define OPENOFDM_RX_POWER_THRES_INIT 124 217585a5601SXianjun Jiao // Above 118 is based on these test result (2022-03-09) 218585a5601SXianjun Jiao // FMCOMMS3 219585a5601SXianjun Jiao // 2437M 220585a5601SXianjun Jiao // 11a/g BPSK 6M, Rx sensitivity level dmesg report -85dBm 221585a5601SXianjun Jiao // priv->rssi_correction = 153; rssi_half_db/2 = 153-85=68; rssi_half_db = 136 222585a5601SXianjun Jiao // 5180M 223585a5601SXianjun Jiao // 11a/g BPSK 6m, Rx sensitivity level dmesg report -84dBm 224585a5601SXianjun Jiao // priv->rssi_correction = 145; rssi_half_db/2 = 145-84=61; rssi_half_db = 122 225585a5601SXianjun Jiao // 5320M 226585a5601SXianjun Jiao // 11a/g BPSK 6m, Rx sensitivity level dmesg report -86dBm 227585a5601SXianjun Jiao // priv->rssi_correction = 148; rssi_half_db/2 = 148-86=62; rssi_half_db = 124 228585a5601SXianjun Jiao 229585a5601SXianjun Jiao // FMCOMMS2 230585a5601SXianjun Jiao // 2437M 231585a5601SXianjun Jiao // 11a/g BPSK 6M, Rx sensitivity level dmesg report -80dBm 232585a5601SXianjun Jiao // priv->rssi_correction = 153; rssi_half_db/2 = 153-80=73; rssi_half_db = 146 233585a5601SXianjun Jiao // 5180M 234585a5601SXianjun Jiao // 11a/g BPSK 6m, Rx sensitivity level dmesg report -83dBm 235585a5601SXianjun Jiao // priv->rssi_correction = 145; rssi_half_db/2 = 145-83=62; rssi_half_db = 124 236585a5601SXianjun Jiao // 5320M 237585a5601SXianjun Jiao // 11a/g BPSK 6m, Rx sensitivity level dmesg report -86dBm 238585a5601SXianjun Jiao // priv->rssi_correction = 148; rssi_half_db/2 = 148-86=62; rssi_half_db = 124 239585a5601SXianjun Jiao 240*a0972944SXianjun Jiao #define OPENOFDM_RX_RSSI_DBM_TH_DEFAULT (-85) //-85 will remove lots of false alarm. the best openwifi reported sensitivity is like -90/-92 (set it manually if conductive test with wifi tester) 241585a5601SXianjun Jiao #define OPENOFDM_RX_DC_RUNNING_SUM_TH_INIT 64 242585a5601SXianjun Jiao #define OPENOFDM_RX_MIN_PLATEAU_INIT 100 243e273351bSXianjun Jiao #define OPENOFDM_RX_FFT_WIN_SHIFT_INIT 1 2442a5da37cSXianjun Jiao #define OPENOFDM_RX_SMALL_EQ_OUT_COUNTER_TH 48 245585a5601SXianjun Jiao 246585a5601SXianjun Jiao #define OPENWIFI_MAX_SIGNAL_LEN_TH 1700 //Packet longer than this threshold will result in receiver early termination. It goes to openofdm_rx/xpu/rx_intf 24726825b8bSXianjun Jiao 24826825b8bSXianjun Jiao #define OPENWIFI_MIN_SIGNAL_LEN_TH 14 //Packet shorter than this threshold will result in receiver early termination. It goes to openofdm_rx/xpu/rx_intf 24926825b8bSXianjun Jiao //due to CRC32, at least 4 bytes needed to push out expected CRC result 250585a5601SXianjun Jiao 2512ee67178SXianjun Jiao struct openofdm_rx_driver_api { 2522ee67178SXianjun Jiao u32 (*hw_init)(enum openofdm_rx_mode mode); 2532ee67178SXianjun Jiao 2542ee67178SXianjun Jiao u32 (*reg_read)(u32 reg); 2552ee67178SXianjun Jiao void (*reg_write)(u32 reg, u32 value); 2562ee67178SXianjun Jiao 2572ee67178SXianjun Jiao u32 (*OPENOFDM_RX_REG_STATE_HISTORY_read)(void); 2582ee67178SXianjun Jiao 2592ee67178SXianjun Jiao void (*OPENOFDM_RX_REG_MULTI_RST_write)(u32 value); 2602ee67178SXianjun Jiao void (*OPENOFDM_RX_REG_ENABLE_write)(u32 value); 2612ee67178SXianjun Jiao void (*OPENOFDM_RX_REG_POWER_THRES_write)(u32 value); 2622ee67178SXianjun Jiao void (*OPENOFDM_RX_REG_MIN_PLATEAU_write)(u32 value); 263aed16d05SXianjun Jiao void (*OPENOFDM_RX_REG_SOFT_DECODING_write)(u32 value); 264e273351bSXianjun Jiao void (*OPENOFDM_RX_REG_FFT_WIN_SHIFT_write)(u32 value); 2652ee67178SXianjun Jiao }; 2662ee67178SXianjun Jiao 2672ee67178SXianjun Jiao // ---------------------------------------openofdm tx------------------------------- 2682ee67178SXianjun Jiao const char *openofdm_tx_compatible_str = "sdr,openofdm_tx"; 2692ee67178SXianjun Jiao 2702ee67178SXianjun Jiao #define OPENOFDM_TX_REG_MULTI_RST_ADDR (0*4) 2712ee67178SXianjun Jiao #define OPENOFDM_TX_REG_INIT_PILOT_STATE_ADDR (1*4) 2722ee67178SXianjun Jiao #define OPENOFDM_TX_REG_INIT_DATA_STATE_ADDR (2*4) 2732ee67178SXianjun Jiao 2742ee67178SXianjun Jiao enum openofdm_tx_mode { 2752ee67178SXianjun Jiao OPENOFDM_TX_TEST = 0, 2762ee67178SXianjun Jiao OPENOFDM_TX_NORMAL, 2772ee67178SXianjun Jiao }; 2782ee67178SXianjun Jiao 2792ee67178SXianjun Jiao struct openofdm_tx_driver_api { 2802ee67178SXianjun Jiao u32 (*hw_init)(enum openofdm_tx_mode mode); 2812ee67178SXianjun Jiao 2822ee67178SXianjun Jiao u32 (*reg_read)(u32 reg); 2832ee67178SXianjun Jiao void (*reg_write)(u32 reg, u32 value); 2842ee67178SXianjun Jiao 2852ee67178SXianjun Jiao void (*OPENOFDM_TX_REG_MULTI_RST_write)(u32 value); 2862ee67178SXianjun Jiao void (*OPENOFDM_TX_REG_INIT_PILOT_STATE_write)(u32 value); 2872ee67178SXianjun Jiao void (*OPENOFDM_TX_REG_INIT_DATA_STATE_write)(u32 value); 2882ee67178SXianjun Jiao }; 2892ee67178SXianjun Jiao 2902ee67178SXianjun Jiao // ---------------------------------------xpu low MAC controller------------------------------- 2912ee67178SXianjun Jiao 2922ee67178SXianjun Jiao // extra filter flag together with enum ieee80211_filter_flags in mac80211.h 2932ee67178SXianjun Jiao #define UNICAST_FOR_US (1<<9) 2942ee67178SXianjun Jiao #define BROADCAST_ALL_ONE (1<<10) 2952ee67178SXianjun Jiao #define BROADCAST_ALL_ZERO (1<<11) 2962ee67178SXianjun Jiao #define MY_BEACON (1<<12) 2972ee67178SXianjun Jiao #define MONITOR_ALL (1<<13) 2982ee67178SXianjun Jiao 2992ee67178SXianjun Jiao const char *xpu_compatible_str = "sdr,xpu"; 3002ee67178SXianjun Jiao 3012ee67178SXianjun Jiao #define XPU_REG_MULTI_RST_ADDR (0*4) 3022ee67178SXianjun Jiao #define XPU_REG_SRC_SEL_ADDR (1*4) 3032ee67178SXianjun Jiao #define XPU_REG_TSF_LOAD_VAL_LOW_ADDR (2*4) 3042ee67178SXianjun Jiao #define XPU_REG_TSF_LOAD_VAL_HIGH_ADDR (3*4) 3052ee67178SXianjun Jiao #define XPU_REG_BAND_CHANNEL_ADDR (4*4) 3065deb8d18SXianjun Jiao #define XPU_REG_DIFS_ADVANCE_ADDR (5*4) 307bb0a2c58SXianjun Jiao #define XPU_REG_FORCE_IDLE_MISC_ADDR (6*4) 3082ee67178SXianjun Jiao #define XPU_REG_RSSI_DB_CFG_ADDR (7*4) 3092ee67178SXianjun Jiao #define XPU_REG_LBT_TH_ADDR (8*4) 3102ee67178SXianjun Jiao #define XPU_REG_CSMA_DEBUG_ADDR (9*4) 3112ee67178SXianjun Jiao #define XPU_REG_BB_RF_DELAY_ADDR (10*4) 312913a9e94SXianjun Jiao #define XPU_REG_ACK_CTL_MAX_NUM_RETRANS_ADDR (11*4) 313261bb9eeSmmehari #define XPU_REG_AMPDU_ACTION_ADDR (12*4) 314bc98f5bbSthavinga #define XPU_REG_SPI_DISABLE_ADDR (13*4) 3152ee67178SXianjun Jiao #define XPU_REG_RECV_ACK_COUNT_TOP0_ADDR (16*4) 3162ee67178SXianjun Jiao #define XPU_REG_RECV_ACK_COUNT_TOP1_ADDR (17*4) 3172ee67178SXianjun Jiao #define XPU_REG_SEND_ACK_WAIT_TOP_ADDR (18*4) 3182ee67178SXianjun Jiao #define XPU_REG_CSMA_CFG_ADDR (19*4) 3192ee67178SXianjun Jiao 320838a9007SXianjun Jiao #define XPU_REG_SLICE_COUNT_TOTAL_ADDR (20*4) 321838a9007SXianjun Jiao #define XPU_REG_SLICE_COUNT_START_ADDR (21*4) 322838a9007SXianjun Jiao #define XPU_REG_SLICE_COUNT_END_ADDR (22*4) 3232ee67178SXianjun Jiao 3242ee67178SXianjun Jiao #define XPU_REG_CTS_TO_RTS_CONFIG_ADDR (26*4) 3252ee67178SXianjun Jiao #define XPU_REG_FILTER_FLAG_ADDR (27*4) 3262ee67178SXianjun Jiao #define XPU_REG_BSSID_FILTER_LOW_ADDR (28*4) 3272ee67178SXianjun Jiao #define XPU_REG_BSSID_FILTER_HIGH_ADDR (29*4) 3282ee67178SXianjun Jiao #define XPU_REG_MAC_ADDR_LOW_ADDR (30*4) 3292ee67178SXianjun Jiao #define XPU_REG_MAC_ADDR_HIGH_ADDR (31*4) 3302ee67178SXianjun Jiao 3312ee67178SXianjun Jiao #define XPU_REG_TSF_RUNTIME_VAL_LOW_ADDR (58*4) 3322ee67178SXianjun Jiao #define XPU_REG_TSF_RUNTIME_VAL_HIGH_ADDR (59*4) 3332ee67178SXianjun Jiao 3346c6cf951SXianjun Jiao #define XPU_REG_MAC_ADDR_READ_BACK_ADDR (62*4) 3356c6cf951SXianjun Jiao #define XPU_REG_FPGA_GIT_REV_ADDR (63*4) 3362ee67178SXianjun Jiao 3372ee67178SXianjun Jiao enum xpu_mode { 3382ee67178SXianjun Jiao XPU_TEST = 0, 3392ee67178SXianjun Jiao XPU_NORMAL, 3402ee67178SXianjun Jiao }; 3412ee67178SXianjun Jiao 3422ee67178SXianjun Jiao struct xpu_driver_api { 3432ee67178SXianjun Jiao u32 (*hw_init)(enum xpu_mode mode); 3442ee67178SXianjun Jiao 3452ee67178SXianjun Jiao u32 (*reg_read)(u32 reg); 3462ee67178SXianjun Jiao void (*reg_write)(u32 reg, u32 value); 3472ee67178SXianjun Jiao 3482ee67178SXianjun Jiao void (*XPU_REG_MULTI_RST_write)(u32 value); 3492ee67178SXianjun Jiao u32 (*XPU_REG_MULTI_RST_read)(void); 3502ee67178SXianjun Jiao 3512ee67178SXianjun Jiao void (*XPU_REG_SRC_SEL_write)(u32 value); 3522ee67178SXianjun Jiao u32 (*XPU_REG_SRC_SEL_read)(void); 3532ee67178SXianjun Jiao 3542ee67178SXianjun Jiao void (*XPU_REG_RECV_ACK_COUNT_TOP0_write)(u32 value); 3552ee67178SXianjun Jiao u32 (*XPU_REG_RECV_ACK_COUNT_TOP0_read)(void); 3562ee67178SXianjun Jiao 3572ee67178SXianjun Jiao void (*XPU_REG_RECV_ACK_COUNT_TOP1_write)(u32 value); 3582ee67178SXianjun Jiao u32 (*XPU_REG_RECV_ACK_COUNT_TOP1_read)(void); 3592ee67178SXianjun Jiao 3602ee67178SXianjun Jiao void (*XPU_REG_SEND_ACK_WAIT_TOP_write)(u32 value); 3612ee67178SXianjun Jiao u32 (*XPU_REG_SEND_ACK_WAIT_TOP_read)(void); 3622ee67178SXianjun Jiao 3632ee67178SXianjun Jiao void (*XPU_REG_ACK_FC_FILTER_write)(u32 value); 3642ee67178SXianjun Jiao u32 (*XPU_REG_ACK_FC_FILTER_read)(void); 3652ee67178SXianjun Jiao 3662ee67178SXianjun Jiao void (*XPU_REG_CTS_TO_RTS_CONFIG_write)(u32 value); 3672ee67178SXianjun Jiao u32 (*XPU_REG_CTS_TO_RTS_CONFIG_read)(void); 3682ee67178SXianjun Jiao 3692ee67178SXianjun Jiao void (*XPU_REG_FILTER_FLAG_write)(u32 value); 3702ee67178SXianjun Jiao u32 (*XPU_REG_FILTER_FLAG_read)(void); 3712ee67178SXianjun Jiao 3722ee67178SXianjun Jiao void (*XPU_REG_MAC_ADDR_LOW_write)(u32 value); 3732ee67178SXianjun Jiao u32 (*XPU_REG_MAC_ADDR_LOW_read)(void); 3742ee67178SXianjun Jiao 3752ee67178SXianjun Jiao void (*XPU_REG_MAC_ADDR_HIGH_write)(u32 value); 3762ee67178SXianjun Jiao u32 (*XPU_REG_MAC_ADDR_HIGH_read)(void); 3772ee67178SXianjun Jiao 3782ee67178SXianjun Jiao void (*XPU_REG_BSSID_FILTER_LOW_write)(u32 value); 3792ee67178SXianjun Jiao u32 (*XPU_REG_BSSID_FILTER_LOW_read)(void); 3802ee67178SXianjun Jiao 3812ee67178SXianjun Jiao void (*XPU_REG_BSSID_FILTER_HIGH_write)(u32 value); 3822ee67178SXianjun Jiao u32 (*XPU_REG_BSSID_FILTER_HIGH_read)(void); 3832ee67178SXianjun Jiao 3842ee67178SXianjun Jiao void (*XPU_REG_BAND_CHANNEL_write)(u32 value); 3852ee67178SXianjun Jiao u32 (*XPU_REG_BAND_CHANNEL_read)(void); 3862ee67178SXianjun Jiao 3875deb8d18SXianjun Jiao void (*XPU_REG_DIFS_ADVANCE_write)(u32 value); 3885deb8d18SXianjun Jiao u32 (*XPU_REG_DIFS_ADVANCE_read)(void); 3895deb8d18SXianjun Jiao 390bb0a2c58SXianjun Jiao void (*XPU_REG_FORCE_IDLE_MISC_write)(u32 value); 391bb0a2c58SXianjun Jiao u32 (*XPU_REG_FORCE_IDLE_MISC_read)(void); 392bb0a2c58SXianjun Jiao 3932ee67178SXianjun Jiao u32 (*XPU_REG_TRX_STATUS_read)(void); 3942ee67178SXianjun Jiao u32 (*XPU_REG_TX_RESULT_read)(void); 3952ee67178SXianjun Jiao 3962ee67178SXianjun Jiao u32 (*XPU_REG_TSF_RUNTIME_VAL_LOW_read)(void); 3972ee67178SXianjun Jiao u32 (*XPU_REG_TSF_RUNTIME_VAL_HIGH_read)(void); 3982ee67178SXianjun Jiao 3992ee67178SXianjun Jiao void (*XPU_REG_TSF_LOAD_VAL_LOW_write)(u32 value); 4002ee67178SXianjun Jiao void (*XPU_REG_TSF_LOAD_VAL_HIGH_write)(u32 value); 4012ee67178SXianjun Jiao void (*XPU_REG_TSF_LOAD_VAL_write)(u32 high_value, u32 low_value); 4022ee67178SXianjun Jiao 4032ee67178SXianjun Jiao u32 (*XPU_REG_FC_DI_read)(void); 4042ee67178SXianjun Jiao u32 (*XPU_REG_ADDR1_LOW_read)(void); 4052ee67178SXianjun Jiao u32 (*XPU_REG_ADDR1_HIGH_read)(void); 4062ee67178SXianjun Jiao u32 (*XPU_REG_ADDR2_LOW_read)(void); 4072ee67178SXianjun Jiao u32 (*XPU_REG_ADDR2_HIGH_read)(void); 4082ee67178SXianjun Jiao 4092ee67178SXianjun Jiao void (*XPU_REG_LBT_TH_write)(u32 value); 4102ee67178SXianjun Jiao u32 (*XPU_REG_LBT_TH_read)(void); 4112ee67178SXianjun Jiao 4122ee67178SXianjun Jiao void (*XPU_REG_RSSI_DB_CFG_write)(u32 value); 4132ee67178SXianjun Jiao u32 (*XPU_REG_RSSI_DB_CFG_read)(void); 4142ee67178SXianjun Jiao 4152ee67178SXianjun Jiao void (*XPU_REG_CSMA_DEBUG_write)(u32 value); 4162ee67178SXianjun Jiao u32 (*XPU_REG_CSMA_DEBUG_read)(void); 4172ee67178SXianjun Jiao 4182ee67178SXianjun Jiao void (*XPU_REG_CSMA_CFG_write)(u32 value); 4192ee67178SXianjun Jiao u32 (*XPU_REG_CSMA_CFG_read)(void); 4202ee67178SXianjun Jiao 421838a9007SXianjun Jiao void (*XPU_REG_SLICE_COUNT_TOTAL_write)(u32 value); 422838a9007SXianjun Jiao void (*XPU_REG_SLICE_COUNT_START_write)(u32 value); 423838a9007SXianjun Jiao void (*XPU_REG_SLICE_COUNT_END_write)(u32 value); 4242ee67178SXianjun Jiao void (*XPU_REG_SLICE_COUNT_TOTAL1_write)(u32 value); 4252ee67178SXianjun Jiao void (*XPU_REG_SLICE_COUNT_START1_write)(u32 value); 4262ee67178SXianjun Jiao void (*XPU_REG_SLICE_COUNT_END1_write)(u32 value); 4272ee67178SXianjun Jiao 428838a9007SXianjun Jiao u32 (*XPU_REG_SLICE_COUNT_TOTAL_read)(void); 429838a9007SXianjun Jiao u32 (*XPU_REG_SLICE_COUNT_START_read)(void); 430838a9007SXianjun Jiao u32 (*XPU_REG_SLICE_COUNT_END_read)(void); 4312ee67178SXianjun Jiao u32 (*XPU_REG_SLICE_COUNT_TOTAL1_read)(void); 4322ee67178SXianjun Jiao u32 (*XPU_REG_SLICE_COUNT_START1_read)(void); 4332ee67178SXianjun Jiao u32 (*XPU_REG_SLICE_COUNT_END1_read)(void); 4342ee67178SXianjun Jiao 4352ee67178SXianjun Jiao void (*XPU_REG_BB_RF_DELAY_write)(u32 value); 436913a9e94SXianjun Jiao 437913a9e94SXianjun Jiao void (*XPU_REG_ACK_CTL_MAX_NUM_RETRANS_write)(u32 value); 438913a9e94SXianjun Jiao u32 (*XPU_REG_ACK_CTL_MAX_NUM_RETRANS_read)(void); 4392ee67178SXianjun Jiao 440bc98f5bbSthavinga void (*XPU_REG_SPI_DISABLE_write)(u32 value); 441bc98f5bbSthavinga u32 (*XPU_REG_SPI_DISABLE_read)(void); 442bc98f5bbSthavinga 443261bb9eeSmmehari void (*XPU_REG_AMPDU_ACTION_write)(u32 value); 444261bb9eeSmmehari u32 (*XPU_REG_AMPDU_ACTION_read)(void); 445261bb9eeSmmehari 4462ee67178SXianjun Jiao void (*XPU_REG_MAC_ADDR_write)(u8 *mac_addr); 4472ee67178SXianjun Jiao }; 448a7396dd9SXianjun Jiao 449a7396dd9SXianjun Jiao // #endif 450