xref: /openwifi/driver/xpu/xpu.c (revision d4c3d8108eacec40382d61209ec291ae93e2530d)
12ee67178SXianjun Jiao /*
22ee67178SXianjun Jiao  * axi lite register access driver
39e7be83fSJiao Xianjun  * Author: Xianjun Jiao, Michael Mehari, Wei Liu
49e7be83fSJiao Xianjun  * SPDX-FileCopyrightText: 2019 UGent
5a6085186SLina Ceballos  * SPDX-License-Identifier: AGPL-3.0-or-later
62ee67178SXianjun Jiao */
72ee67178SXianjun Jiao 
82ee67178SXianjun Jiao #include <linux/bitops.h>
92ee67178SXianjun Jiao #include <linux/dmapool.h>
102ee67178SXianjun Jiao #include <linux/dma/xilinx_dma.h>
112ee67178SXianjun Jiao #include <linux/init.h>
122ee67178SXianjun Jiao #include <linux/interrupt.h>
132ee67178SXianjun Jiao #include <linux/io.h>
142ee67178SXianjun Jiao #include <linux/iopoll.h>
152ee67178SXianjun Jiao #include <linux/module.h>
162ee67178SXianjun Jiao #include <linux/of_address.h>
172ee67178SXianjun Jiao #include <linux/of_dma.h>
182ee67178SXianjun Jiao #include <linux/of_platform.h>
192ee67178SXianjun Jiao #include <linux/of_irq.h>
202ee67178SXianjun Jiao #include <linux/slab.h>
212ee67178SXianjun Jiao #include <linux/clk.h>
222ee67178SXianjun Jiao #include <linux/io-64-nonatomic-lo-hi.h>
232ee67178SXianjun Jiao #include <linux/delay.h>
242ee67178SXianjun Jiao #include <net/mac80211.h>
252ee67178SXianjun Jiao 
262ee67178SXianjun Jiao #include "../hw_def.h"
272ee67178SXianjun Jiao 
282ee67178SXianjun Jiao static void __iomem *base_addr; // to store driver specific base address needed for mmu to translate virtual address to physical address in our FPGA design
292ee67178SXianjun Jiao 
302ee67178SXianjun Jiao /* IO accessors */
312ee67178SXianjun Jiao static inline u32 reg_read(u32 reg)
322ee67178SXianjun Jiao {
332ee67178SXianjun Jiao 	return ioread32(base_addr + reg);
342ee67178SXianjun Jiao }
352ee67178SXianjun Jiao 
362ee67178SXianjun Jiao static inline void reg_write(u32 reg, u32 value)
372ee67178SXianjun Jiao {
382ee67178SXianjun Jiao 	iowrite32(value, base_addr + reg);
392ee67178SXianjun Jiao }
402ee67178SXianjun Jiao 
412ee67178SXianjun Jiao static inline void XPU_REG_MULTI_RST_write(u32 Data) {
422ee67178SXianjun Jiao 	reg_write(XPU_REG_MULTI_RST_ADDR, Data);
432ee67178SXianjun Jiao }
442ee67178SXianjun Jiao 
452ee67178SXianjun Jiao static inline u32 XPU_REG_MULTI_RST_read(void){
462ee67178SXianjun Jiao 	return reg_read(XPU_REG_MULTI_RST_ADDR);
472ee67178SXianjun Jiao }
482ee67178SXianjun Jiao 
492ee67178SXianjun Jiao static inline void XPU_REG_SRC_SEL_write(u32 Data) {
502ee67178SXianjun Jiao 	reg_write(XPU_REG_SRC_SEL_ADDR, Data);
512ee67178SXianjun Jiao }
522ee67178SXianjun Jiao 
532ee67178SXianjun Jiao static inline u32 XPU_REG_SRC_SEL_read(void){
542ee67178SXianjun Jiao 	return reg_read(XPU_REG_SRC_SEL_ADDR);
552ee67178SXianjun Jiao }
562ee67178SXianjun Jiao 
572ee67178SXianjun Jiao static inline void XPU_REG_RECV_ACK_COUNT_TOP0_write(u32 Data) {
582ee67178SXianjun Jiao 	reg_write(XPU_REG_RECV_ACK_COUNT_TOP0_ADDR, Data);
592ee67178SXianjun Jiao }
602ee67178SXianjun Jiao 
612ee67178SXianjun Jiao static inline u32 XPU_REG_RECV_ACK_COUNT_TOP0_read(void){
622ee67178SXianjun Jiao 	return reg_read(XPU_REG_RECV_ACK_COUNT_TOP0_ADDR);
632ee67178SXianjun Jiao }
642ee67178SXianjun Jiao 
652ee67178SXianjun Jiao static inline void XPU_REG_RECV_ACK_COUNT_TOP1_write(u32 Data) {
662ee67178SXianjun Jiao 	reg_write(XPU_REG_RECV_ACK_COUNT_TOP1_ADDR, Data);
672ee67178SXianjun Jiao }
682ee67178SXianjun Jiao 
692ee67178SXianjun Jiao static inline u32 XPU_REG_RECV_ACK_COUNT_TOP1_read(void){
702ee67178SXianjun Jiao 	return reg_read(XPU_REG_RECV_ACK_COUNT_TOP1_ADDR);
712ee67178SXianjun Jiao }
722ee67178SXianjun Jiao 
732ee67178SXianjun Jiao static inline void XPU_REG_SEND_ACK_WAIT_TOP_write(u32 Data) {
742ee67178SXianjun Jiao 	reg_write(XPU_REG_SEND_ACK_WAIT_TOP_ADDR, Data);
752ee67178SXianjun Jiao }
762ee67178SXianjun Jiao 
772ee67178SXianjun Jiao static inline u32 XPU_REG_SEND_ACK_WAIT_TOP_read(void){
782ee67178SXianjun Jiao 	return reg_read(XPU_REG_SEND_ACK_WAIT_TOP_ADDR);
792ee67178SXianjun Jiao }
802ee67178SXianjun Jiao 
812ee67178SXianjun Jiao static inline void XPU_REG_FILTER_FLAG_write(u32 Data) {
822ee67178SXianjun Jiao 	reg_write(XPU_REG_FILTER_FLAG_ADDR, Data);
832ee67178SXianjun Jiao }
842ee67178SXianjun Jiao 
852ee67178SXianjun Jiao static inline u32 XPU_REG_FILTER_FLAG_read(void){
862ee67178SXianjun Jiao 	return reg_read(XPU_REG_FILTER_FLAG_ADDR);
872ee67178SXianjun Jiao }
882ee67178SXianjun Jiao 
892ee67178SXianjun Jiao static inline void XPU_REG_CTS_TO_RTS_CONFIG_write(u32 Data) {
902ee67178SXianjun Jiao 	reg_write(XPU_REG_CTS_TO_RTS_CONFIG_ADDR, Data);
912ee67178SXianjun Jiao }
922ee67178SXianjun Jiao 
932ee67178SXianjun Jiao static inline u32 XPU_REG_CTS_TO_RTS_CONFIG_read(void){
942ee67178SXianjun Jiao 	return reg_read(XPU_REG_CTS_TO_RTS_CONFIG_ADDR);
952ee67178SXianjun Jiao }
962ee67178SXianjun Jiao 
972ee67178SXianjun Jiao static inline void XPU_REG_MAC_ADDR_LOW_write(u32 Data) {
982ee67178SXianjun Jiao 	reg_write(XPU_REG_MAC_ADDR_LOW_ADDR, Data);
992ee67178SXianjun Jiao }
1002ee67178SXianjun Jiao 
1012ee67178SXianjun Jiao static inline u32 XPU_REG_MAC_ADDR_LOW_read(void){
1022ee67178SXianjun Jiao 	return reg_read(XPU_REG_MAC_ADDR_LOW_ADDR);
1032ee67178SXianjun Jiao }
1042ee67178SXianjun Jiao 
1052ee67178SXianjun Jiao static inline void XPU_REG_MAC_ADDR_HIGH_write(u32 Data) {
1062ee67178SXianjun Jiao 	reg_write(XPU_REG_MAC_ADDR_HIGH_ADDR, Data);
1072ee67178SXianjun Jiao }
1082ee67178SXianjun Jiao 
1092ee67178SXianjun Jiao static inline u32 XPU_REG_MAC_ADDR_HIGH_read(void){
1102ee67178SXianjun Jiao 	return reg_read(XPU_REG_MAC_ADDR_HIGH_ADDR);
1112ee67178SXianjun Jiao }
1122ee67178SXianjun Jiao 
1132ee67178SXianjun Jiao static inline void XPU_REG_BSSID_FILTER_LOW_write(u32 Data) {
1142ee67178SXianjun Jiao 	reg_write(XPU_REG_BSSID_FILTER_LOW_ADDR, Data);
1152ee67178SXianjun Jiao }
1162ee67178SXianjun Jiao 
1172ee67178SXianjun Jiao static inline u32 XPU_REG_BSSID_FILTER_LOW_read(void){
1182ee67178SXianjun Jiao 	return reg_read(XPU_REG_BSSID_FILTER_LOW_ADDR);
1192ee67178SXianjun Jiao }
1202ee67178SXianjun Jiao 
1212ee67178SXianjun Jiao static inline void XPU_REG_BSSID_FILTER_HIGH_write(u32 Data) {
1222ee67178SXianjun Jiao 	reg_write(XPU_REG_BSSID_FILTER_HIGH_ADDR, Data);
1232ee67178SXianjun Jiao }
1242ee67178SXianjun Jiao 
1252ee67178SXianjun Jiao static inline u32 XPU_REG_BSSID_FILTER_HIGH_read(void){
1262ee67178SXianjun Jiao 	return reg_read(XPU_REG_BSSID_FILTER_HIGH_ADDR);
1272ee67178SXianjun Jiao }
1282ee67178SXianjun Jiao 
1292ee67178SXianjun Jiao static inline void XPU_REG_BAND_CHANNEL_write(u32 Data) {
1302ee67178SXianjun Jiao 	reg_write(XPU_REG_BAND_CHANNEL_ADDR, Data);
1312ee67178SXianjun Jiao }
1322ee67178SXianjun Jiao 
1332ee67178SXianjun Jiao static inline u32 XPU_REG_BAND_CHANNEL_read(void){
1342ee67178SXianjun Jiao 	return reg_read(XPU_REG_BAND_CHANNEL_ADDR);
1352ee67178SXianjun Jiao }
1362ee67178SXianjun Jiao 
1375deb8d18SXianjun Jiao static inline void XPU_REG_DIFS_ADVANCE_write(u32 Data) {
1385deb8d18SXianjun Jiao 	reg_write(XPU_REG_DIFS_ADVANCE_ADDR, Data);
1395deb8d18SXianjun Jiao }
1405deb8d18SXianjun Jiao 
1415deb8d18SXianjun Jiao static inline u32 XPU_REG_DIFS_ADVANCE_read(void){
1425deb8d18SXianjun Jiao 	return reg_read(XPU_REG_DIFS_ADVANCE_ADDR);
1435deb8d18SXianjun Jiao }
1445deb8d18SXianjun Jiao 
145bb0a2c58SXianjun Jiao static inline void XPU_REG_FORCE_IDLE_MISC_write(u32 Data) {
146bb0a2c58SXianjun Jiao 	reg_write(XPU_REG_FORCE_IDLE_MISC_ADDR, Data);
147bb0a2c58SXianjun Jiao }
148bb0a2c58SXianjun Jiao 
149bb0a2c58SXianjun Jiao static inline u32 XPU_REG_FORCE_IDLE_MISC_read(void){
150bb0a2c58SXianjun Jiao 	return reg_read(XPU_REG_FORCE_IDLE_MISC_ADDR);
151bb0a2c58SXianjun Jiao }
152bb0a2c58SXianjun Jiao 
1532ee67178SXianjun Jiao static inline u32 XPU_REG_TRX_STATUS_read(void){
1542ee67178SXianjun Jiao 	return reg_read(XPU_REG_TRX_STATUS_ADDR);
1552ee67178SXianjun Jiao }
1562ee67178SXianjun Jiao 
1572ee67178SXianjun Jiao static inline u32 XPU_REG_TX_RESULT_read(void){
1582ee67178SXianjun Jiao 	return reg_read(XPU_REG_TX_RESULT_ADDR);
1592ee67178SXianjun Jiao }
1602ee67178SXianjun Jiao 
1612ee67178SXianjun Jiao static inline u32 XPU_REG_TSF_RUNTIME_VAL_LOW_read(void){
1622ee67178SXianjun Jiao 	return reg_read(XPU_REG_TSF_RUNTIME_VAL_LOW_ADDR);
1632ee67178SXianjun Jiao }
1642ee67178SXianjun Jiao 
1652ee67178SXianjun Jiao static inline u32 XPU_REG_TSF_RUNTIME_VAL_HIGH_read(void){
1662ee67178SXianjun Jiao 	return reg_read(XPU_REG_TSF_RUNTIME_VAL_HIGH_ADDR);
1672ee67178SXianjun Jiao }
1682ee67178SXianjun Jiao 
1692ee67178SXianjun Jiao static inline void XPU_REG_TSF_LOAD_VAL_LOW_write(u32 value){
1702ee67178SXianjun Jiao 	reg_write(XPU_REG_TSF_LOAD_VAL_LOW_ADDR, value);
1712ee67178SXianjun Jiao }
1722ee67178SXianjun Jiao 
1732ee67178SXianjun Jiao static inline void XPU_REG_TSF_LOAD_VAL_HIGH_write(u32 value){
1742ee67178SXianjun Jiao 	reg_write(XPU_REG_TSF_LOAD_VAL_HIGH_ADDR, value);
1752ee67178SXianjun Jiao }
1762ee67178SXianjun Jiao 
1772ee67178SXianjun Jiao static inline void XPU_REG_TSF_LOAD_VAL_write(u32 high_value, u32 low_value){
1782ee67178SXianjun Jiao 	XPU_REG_TSF_LOAD_VAL_LOW_write(low_value);
1792ee67178SXianjun Jiao 	XPU_REG_TSF_LOAD_VAL_HIGH_write(high_value|0x80000000); // msb high
1802ee67178SXianjun Jiao 	XPU_REG_TSF_LOAD_VAL_HIGH_write(high_value&(~0x80000000)); // msb low
1812ee67178SXianjun Jiao }
1822ee67178SXianjun Jiao 
1832ee67178SXianjun Jiao static inline u32 XPU_REG_FC_DI_read(void){
1842ee67178SXianjun Jiao 	return reg_read(XPU_REG_FC_DI_ADDR);
1852ee67178SXianjun Jiao }
1862ee67178SXianjun Jiao 
1872ee67178SXianjun Jiao static inline u32 XPU_REG_ADDR1_LOW_read(void){
1882ee67178SXianjun Jiao 	return reg_read(XPU_REG_ADDR1_LOW_ADDR);
1892ee67178SXianjun Jiao }
1902ee67178SXianjun Jiao 
1912ee67178SXianjun Jiao static inline u32 XPU_REG_ADDR1_HIGH_read(void){
1922ee67178SXianjun Jiao 	return reg_read(XPU_REG_ADDR1_HIGH_ADDR);
1932ee67178SXianjun Jiao }
1942ee67178SXianjun Jiao 
1952ee67178SXianjun Jiao static inline u32 XPU_REG_ADDR2_LOW_read(void){
1962ee67178SXianjun Jiao 	return reg_read(XPU_REG_ADDR2_LOW_ADDR);
1972ee67178SXianjun Jiao }
1982ee67178SXianjun Jiao 
1992ee67178SXianjun Jiao static inline u32 XPU_REG_ADDR2_HIGH_read(void){
2002ee67178SXianjun Jiao 	return reg_read(XPU_REG_ADDR2_HIGH_ADDR);
2012ee67178SXianjun Jiao }
2022ee67178SXianjun Jiao 
2032ee67178SXianjun Jiao // static inline void XPU_REG_LBT_TH_write(u32 value, u32 en_flag) {
2042ee67178SXianjun Jiao // 	if (en_flag) {
2052ee67178SXianjun Jiao // 		reg_write(XPU_REG_LBT_TH_ADDR, value&0x7FFFFFFF);
2062ee67178SXianjun Jiao // 	} else {
2072ee67178SXianjun Jiao // 		reg_write(XPU_REG_LBT_TH_ADDR, value|0x80000000);
2082ee67178SXianjun Jiao // 	}
2092ee67178SXianjun Jiao // }
2102ee67178SXianjun Jiao 
2112ee67178SXianjun Jiao static inline void XPU_REG_LBT_TH_write(u32 value) {
2122ee67178SXianjun Jiao 	reg_write(XPU_REG_LBT_TH_ADDR, value);
2132ee67178SXianjun Jiao }
2142ee67178SXianjun Jiao 
2152ee67178SXianjun Jiao static inline u32 XPU_REG_RSSI_DB_CFG_read(void){
2162ee67178SXianjun Jiao 	return reg_read(XPU_REG_RSSI_DB_CFG_ADDR);
2172ee67178SXianjun Jiao }
2182ee67178SXianjun Jiao 
2192ee67178SXianjun Jiao static inline void XPU_REG_RSSI_DB_CFG_write(u32 Data) {
2202ee67178SXianjun Jiao 	reg_write(XPU_REG_RSSI_DB_CFG_ADDR, Data);
2212ee67178SXianjun Jiao }
2222ee67178SXianjun Jiao 
2232ee67178SXianjun Jiao static inline u32 XPU_REG_LBT_TH_read(void){
2242ee67178SXianjun Jiao 	return reg_read(XPU_REG_LBT_TH_ADDR);
2252ee67178SXianjun Jiao }
2262ee67178SXianjun Jiao 
2272ee67178SXianjun Jiao static inline void XPU_REG_CSMA_DEBUG_write(u32 value){
2282ee67178SXianjun Jiao 	reg_write(XPU_REG_CSMA_DEBUG_ADDR, value);
2292ee67178SXianjun Jiao }
2302ee67178SXianjun Jiao 
2312ee67178SXianjun Jiao static inline u32 XPU_REG_CSMA_DEBUG_read(void){
2322ee67178SXianjun Jiao 	return reg_read(XPU_REG_CSMA_DEBUG_ADDR);
2332ee67178SXianjun Jiao }
2342ee67178SXianjun Jiao 
2352ee67178SXianjun Jiao static inline void XPU_REG_CSMA_CFG_write(u32 value){
2362ee67178SXianjun Jiao 	reg_write(XPU_REG_CSMA_CFG_ADDR, value);
2372ee67178SXianjun Jiao }
2382ee67178SXianjun Jiao 
2392ee67178SXianjun Jiao static inline u32 XPU_REG_CSMA_CFG_read(void){
2402ee67178SXianjun Jiao 	return reg_read(XPU_REG_CSMA_CFG_ADDR);
2412ee67178SXianjun Jiao }
2422ee67178SXianjun Jiao 
243838a9007SXianjun Jiao static inline void XPU_REG_SLICE_COUNT_TOTAL_write(u32 value){
244838a9007SXianjun Jiao 	reg_write(XPU_REG_SLICE_COUNT_TOTAL_ADDR, value);
2452ee67178SXianjun Jiao }
246838a9007SXianjun Jiao static inline void XPU_REG_SLICE_COUNT_START_write(u32 value){
247838a9007SXianjun Jiao 	reg_write(XPU_REG_SLICE_COUNT_START_ADDR, value);
2482ee67178SXianjun Jiao }
249838a9007SXianjun Jiao static inline void XPU_REG_SLICE_COUNT_END_write(u32 value){
250838a9007SXianjun Jiao 	reg_write(XPU_REG_SLICE_COUNT_END_ADDR, value);
2512ee67178SXianjun Jiao }
2522ee67178SXianjun Jiao 
253838a9007SXianjun Jiao 
254838a9007SXianjun Jiao static inline u32 XPU_REG_SLICE_COUNT_TOTAL_read(void){
255838a9007SXianjun Jiao 	return reg_read(XPU_REG_SLICE_COUNT_TOTAL_ADDR);
2562ee67178SXianjun Jiao }
257838a9007SXianjun Jiao static inline u32 XPU_REG_SLICE_COUNT_START_read(void){
258838a9007SXianjun Jiao 	return reg_read(XPU_REG_SLICE_COUNT_START_ADDR);
2592ee67178SXianjun Jiao }
260838a9007SXianjun Jiao static inline u32 XPU_REG_SLICE_COUNT_END_read(void){
261838a9007SXianjun Jiao 	return reg_read(XPU_REG_SLICE_COUNT_END_ADDR);
2622ee67178SXianjun Jiao }
263838a9007SXianjun Jiao 
2642ee67178SXianjun Jiao static inline void XPU_REG_BB_RF_DELAY_write(u32 value){
2652ee67178SXianjun Jiao 	reg_write(XPU_REG_BB_RF_DELAY_ADDR, value);
2662ee67178SXianjun Jiao }
2672ee67178SXianjun Jiao 
268913a9e94SXianjun Jiao static inline void XPU_REG_ACK_CTL_MAX_NUM_RETRANS_write(u32 value){
269913a9e94SXianjun Jiao 	reg_write(XPU_REG_ACK_CTL_MAX_NUM_RETRANS_ADDR, value);
270913a9e94SXianjun Jiao }
271913a9e94SXianjun Jiao static inline u32 XPU_REG_ACK_CTL_MAX_NUM_RETRANS_read(void){
272913a9e94SXianjun Jiao 	return reg_read(XPU_REG_ACK_CTL_MAX_NUM_RETRANS_ADDR);
2732ee67178SXianjun Jiao }
2742ee67178SXianjun Jiao 
275261bb9eeSmmehari static inline void XPU_REG_AMPDU_ACTION_write(u32 Data) {
276261bb9eeSmmehari 	reg_write(XPU_REG_AMPDU_ACTION_ADDR, Data);
277261bb9eeSmmehari }
278261bb9eeSmmehari 
279261bb9eeSmmehari static inline u32 XPU_REG_AMPDU_ACTION_read(void){
280261bb9eeSmmehari 	return reg_read(XPU_REG_AMPDU_ACTION_ADDR);
281261bb9eeSmmehari }
282261bb9eeSmmehari 
283bc98f5bbSthavinga static inline void XPU_REG_SPI_DISABLE_write(u32 Data) {
284bc98f5bbSthavinga 	reg_write(XPU_REG_SPI_DISABLE_ADDR, Data);
285bc98f5bbSthavinga }
286bc98f5bbSthavinga 
287bc98f5bbSthavinga static inline u32 XPU_REG_SPI_DISABLE_read(void){
288bc98f5bbSthavinga 	return reg_read(XPU_REG_SPI_DISABLE_ADDR);
289bc98f5bbSthavinga }
290bc98f5bbSthavinga 
2912ee67178SXianjun Jiao static inline void XPU_REG_MAC_ADDR_write(u8 *mac_addr) {//, u32 en_flag){
2922ee67178SXianjun Jiao 	XPU_REG_MAC_ADDR_LOW_write( *( (u32*)(mac_addr) ) );
2932ee67178SXianjun Jiao 	XPU_REG_MAC_ADDR_HIGH_write( *( (u16*)(mac_addr + 4) ) );
2942ee67178SXianjun Jiao 	#if 0
2952ee67178SXianjun Jiao 	if (en_flag) {
2962ee67178SXianjun Jiao 		XPU_REG_MAC_ADDR_HIGH_write( (*( (u16*)(mac_addr + 4) )) | 0x80000000 ); // 0x80000000 by default we turn on mac addr filter
2972ee67178SXianjun Jiao 	} else {
2982ee67178SXianjun Jiao 		XPU_REG_MAC_ADDR_HIGH_write( (*( (u16*)(mac_addr + 4) )) & 0x7FFFFFFF );
2992ee67178SXianjun Jiao 	}
3002ee67178SXianjun Jiao 	#endif
3012ee67178SXianjun Jiao }
3022ee67178SXianjun Jiao 
3032ee67178SXianjun Jiao static const struct of_device_id dev_of_ids[] = {
3042ee67178SXianjun Jiao 	{ .compatible = "sdr,xpu", },
3052ee67178SXianjun Jiao 	{}
3062ee67178SXianjun Jiao };
3072ee67178SXianjun Jiao MODULE_DEVICE_TABLE(of, dev_of_ids);
3082ee67178SXianjun Jiao 
3092ee67178SXianjun Jiao static struct xpu_driver_api xpu_driver_api_inst;
3102ee67178SXianjun Jiao static struct xpu_driver_api *xpu_api = &xpu_driver_api_inst;
3112ee67178SXianjun Jiao EXPORT_SYMBOL(xpu_api);
3122ee67178SXianjun Jiao 
3132ee67178SXianjun Jiao static inline u32 hw_init(enum xpu_mode mode){
314838a9007SXianjun Jiao 	int err=0, i, rssi_half_db_th, rssi_half_db_offset, agc_gain_delay;
315bb0a2c58SXianjun Jiao 	u32 filter_flag = 0;
3162ee67178SXianjun Jiao 
3172ee67178SXianjun Jiao 	printk("%s hw_init mode %d\n", xpu_compatible_str, mode);
3182ee67178SXianjun Jiao 
319838a9007SXianjun Jiao 	//rst
320838a9007SXianjun Jiao 	for (i=0;i<8;i++)
321838a9007SXianjun Jiao 		xpu_api->XPU_REG_MULTI_RST_write(0);
322838a9007SXianjun Jiao 	for (i=0;i<32;i++)
3232ee67178SXianjun Jiao 		xpu_api->XPU_REG_MULTI_RST_write(0xFFFFFFFF);
324838a9007SXianjun Jiao 	for (i=0;i<8;i++)
3252ee67178SXianjun Jiao 		xpu_api->XPU_REG_MULTI_RST_write(0);
3262ee67178SXianjun Jiao 
3272ee67178SXianjun Jiao 	// http://www.studioreti.it/slide/802-11-Frame_E_C.pdf
3282ee67178SXianjun Jiao 	// https://mrncciew.com/2014/10/14/cwap-802-11-phy-ppdu/
3292ee67178SXianjun Jiao 	// https://mrncciew.com/2014/09/27/cwap-mac-header-frame-control/
3302ee67178SXianjun Jiao 	// https://mrncciew.com/2014/10/25/cwap-mac-header-durationid/
3312ee67178SXianjun Jiao 	// https://mrncciew.com/2014/11/01/cwap-mac-header-sequence-control/
3322ee67178SXianjun Jiao 	// https://witestlab.poly.edu/blog/802-11-wireless-lan-2/
3332ee67178SXianjun Jiao 	// phy_rx byte idx:
3342ee67178SXianjun Jiao 	// 5(3 sig + 2 service), -- PHY
3352ee67178SXianjun Jiao 	// 2 frame control, 2 duration/conn ID, --MAC PDU
3362ee67178SXianjun Jiao 	// 6 receiver address, 6 destination address, 6 transmitter address
3372ee67178SXianjun Jiao 	// 2 sequence control
3382ee67178SXianjun Jiao 	// 6 source address
3392ee67178SXianjun Jiao 	// reg_val = 5 + 0;
3402ee67178SXianjun Jiao 	// xpu_api->XPU_REG_PHY_RX_PKT_READ_OFFSET_write(reg_val);
3412ee67178SXianjun Jiao 	// printk("%s hw_init XPU_REG_PHY_RX_PKT_READ_OFFSET_write %d\n", xpu_compatible_str, reg_val);
3422ee67178SXianjun Jiao 
3432ee67178SXianjun Jiao 	// by default turn off filter, because all register are zeros
3442ee67178SXianjun Jiao 	// let's filter out packet according to: enum ieee80211_filter_flags at: https://www.kernel.org/doc/html/v4.9/80211/mac80211.html
3452ee67178SXianjun Jiao 	#if 0 // define in FPGA
3462ee67178SXianjun Jiao     localparam [13:0]   FIF_ALLMULTI =           14b00000000000010, //get all mac addr like 01:00:5E:xx:xx:xx and 33:33:xx:xx:xx:xx through to ARM
3472ee67178SXianjun Jiao                         FIF_FCSFAIL =            14b00000000000100, //not support
3482ee67178SXianjun Jiao                         FIF_PLCPFAIL =           14b00000000001000, //not support
3492ee67178SXianjun Jiao                         FIF_BCN_PRBRESP_PROMISC= 14b00000000010000,
3502ee67178SXianjun Jiao                         FIF_CONTROL =            14b00000000100000,
3512ee67178SXianjun Jiao                         FIF_OTHER_BSS =          14b00000001000000,
3522ee67178SXianjun Jiao                         FIF_PSPOLL =             14b00000010000000,
3532ee67178SXianjun Jiao                         FIF_PROBE_REQ =          14b00000100000000,
3542ee67178SXianjun Jiao                         UNICAST_FOR_US =         14b00001000000000,
3552ee67178SXianjun Jiao                         BROADCAST_ALL_ONE =      14b00010000000000,
3562ee67178SXianjun Jiao                         BROADCAST_ALL_ZERO =     14b00100000000000,
3572ee67178SXianjun Jiao                         MY_BEACON          =     14b01000000000000,
3582ee67178SXianjun Jiao                         MONITOR_ALL =            14b10000000000000;
3592ee67178SXianjun Jiao 	#endif
3602ee67178SXianjun Jiao 	filter_flag = (FIF_ALLMULTI|FIF_FCSFAIL|FIF_PLCPFAIL|FIF_BCN_PRBRESP_PROMISC|FIF_CONTROL|FIF_OTHER_BSS|FIF_PSPOLL|FIF_PROBE_REQ|UNICAST_FOR_US|BROADCAST_ALL_ONE|BROADCAST_ALL_ZERO|MY_BEACON|MONITOR_ALL);
3612ee67178SXianjun Jiao 	xpu_api->XPU_REG_FILTER_FLAG_write(filter_flag);
3622ee67178SXianjun Jiao 	xpu_api->XPU_REG_CTS_TO_RTS_CONFIG_write(0xB<<16);//6M 1011:0xB
3632ee67178SXianjun Jiao 
3642ee67178SXianjun Jiao 	// after send data frame wait for ACK, this will be set in real time in function ad9361_rf_set_channel
365febc5adfSXianjun Jiao 	// xpu_api->XPU_REG_RECV_ACK_COUNT_TOP1_write( (((51+2)*10)<<16) | 10 ); // high 16 bits to cover sig valid of ACK packet, low 16 bits is adjustment of fcs valid waiting time.  let's add 2us for those device that is really "slow"!
366febc5adfSXianjun Jiao 	// xpu_api->XPU_REG_SEND_ACK_WAIT_TOP_write( 6*10 ); // +6 = 16us for 5GHz
3672ee67178SXianjun Jiao 
368bb0a2c58SXianjun Jiao 	//xpu_api->XPU_REG_ACK_CTL_MAX_NUM_RETRANS_write(3); // if this > 0, it will override mac80211 set value, and set static retransmission limit
3692ee67178SXianjun Jiao 
370bc98f5bbSthavinga 	// From CMW measurement: lo up 1us before the packet; lo down 0.4us after the packet/RF port switches 1.2us before and 0.2us after
371bc98f5bbSthavinga 	xpu_api->XPU_REG_BB_RF_DELAY_write((16<<24)|(0<<16)|(26<<8)|9); // calibrated by ila and spectrum analyzer (trigger mode)
3722ee67178SXianjun Jiao 
373838a9007SXianjun Jiao 	// setup time schedule of 4 slices
374838a9007SXianjun Jiao 	// slice 0
375838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_TOTAL_write(50000-1); // total 50ms
376838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_START_write(0); //start 0ms
377838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_END_write(50000-1); //end 50ms
378838a9007SXianjun Jiao 
379838a9007SXianjun Jiao 	// slice 1
380838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_TOTAL_write((1<<20)|(50000-1)); // total 50ms
381838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_START_write((1<<20)|(0)); //start 0ms
382838a9007SXianjun Jiao 	//xpu_api->XPU_REG_SLICE_COUNT_END_write((1<<20)|(20000-1)); //end 20ms
383838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_END_write((1<<20)|(50000-1)); //end 20ms
384838a9007SXianjun Jiao 
385838a9007SXianjun Jiao 	// slice 2
386838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_TOTAL_write((2<<20)|(50000-1)); // total 50ms
387838a9007SXianjun Jiao 	//xpu_api->XPU_REG_SLICE_COUNT_START_write((2<<20)|(20000)); //start 20ms
388838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_START_write((2<<20)|(0)); //start 20ms
389838a9007SXianjun Jiao 	//xpu_api->XPU_REG_SLICE_COUNT_END_write((2<<20)|(40000-1)); //end 20ms
390838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_END_write((2<<20)|(50000-1)); //end 20ms
391838a9007SXianjun Jiao 
392838a9007SXianjun Jiao 	// slice 3
393838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_TOTAL_write((3<<20)|(50000-1)); // total 50ms
394838a9007SXianjun Jiao 	//xpu_api->XPU_REG_SLICE_COUNT_START_write((3<<20)|(40000)); //start 40ms
395838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_START_write((3<<20)|(0)); //start 40ms
396838a9007SXianjun Jiao 	//xpu_api->XPU_REG_SLICE_COUNT_END_write((3<<20)|(50000-1)); //end 20ms
397838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_END_write((3<<20)|(50000-1)); //end 20ms
398838a9007SXianjun Jiao 
399838a9007SXianjun Jiao 	// all slice sync rest
400838a9007SXianjun Jiao 	xpu_api->XPU_REG_MULTI_RST_write(1<<7); //bit7 reset the counter for all queues at the same time
401838a9007SXianjun Jiao 	xpu_api->XPU_REG_MULTI_RST_write(0<<7);
4022ee67178SXianjun Jiao 
4032ee67178SXianjun Jiao 	switch(mode)
4042ee67178SXianjun Jiao 	{
4052ee67178SXianjun Jiao 		case XPU_TEST:
4062ee67178SXianjun Jiao 			printk("%s hw_init mode XPU_TEST\n", xpu_compatible_str);
4072ee67178SXianjun Jiao 			break;
4082ee67178SXianjun Jiao 
4092ee67178SXianjun Jiao 		case XPU_NORMAL:
4102ee67178SXianjun Jiao 			printk("%s hw_init mode XPU_NORMAL\n", xpu_compatible_str);
4112ee67178SXianjun Jiao 			break;
4122ee67178SXianjun Jiao 
4132ee67178SXianjun Jiao 		default:
4142ee67178SXianjun Jiao 			printk("%s hw_init mode %d is wrong!\n", xpu_compatible_str, mode);
4152ee67178SXianjun Jiao 			err=1;
4162ee67178SXianjun Jiao 	}
4172ee67178SXianjun Jiao 	xpu_api->XPU_REG_BAND_CHANNEL_write((false<<24)|(BAND_5_8GHZ<<16)|44);//use_short_slot==false; 5.8GHz; channel 44 -- default setting to sync with priv->band/channel/use_short_slot
4182ee67178SXianjun Jiao 
419e3fb22a4SXianjun Jiao 	agc_gain_delay = 39; //samples
4202ee67178SXianjun Jiao 	rssi_half_db_offset = 75<<1;
4212ee67178SXianjun Jiao 	xpu_api->XPU_REG_RSSI_DB_CFG_write(0x80000000|((rssi_half_db_offset<<16)|agc_gain_delay) );
4222ee67178SXianjun Jiao 	xpu_api->XPU_REG_RSSI_DB_CFG_write((~0x80000000)&((rssi_half_db_offset<<16)|agc_gain_delay) );
4232ee67178SXianjun Jiao 
4242ee67178SXianjun Jiao 	//rssi_half_db_th = 70<<1; // with splitter
4252ee67178SXianjun Jiao 	rssi_half_db_th = 87<<1; // -62dBm
426bb0a2c58SXianjun Jiao 	xpu_api->XPU_REG_LBT_TH_write(rssi_half_db_th); // set IQ rssi th step .5dB to xxx and enable it
427bb0a2c58SXianjun Jiao 
428bb0a2c58SXianjun Jiao 	xpu_api->XPU_REG_FORCE_IDLE_MISC_write(75); //control the duration to force ch_idle after decoding a packet due to imperfection of agc and signals
4292ee67178SXianjun Jiao 
4302ee67178SXianjun Jiao 	//xpu_api->XPU_REG_CSMA_DEBUG_write((1<<31)|(20<<24)|(4<<19)|(3<<14)|(10<<7)|(5));
4312ee67178SXianjun Jiao 	xpu_api->XPU_REG_CSMA_DEBUG_write(0);
4322ee67178SXianjun Jiao 
433bb0a2c58SXianjun Jiao 	// xpu_api->XPU_REG_CSMA_CFG_write(268435459);  // Linux will do config for each queue via openwifi_conf_tx
434bb0a2c58SXianjun Jiao 	// xpu_api->XPU_REG_CSMA_CFG_write(0xe0000000); // Linux will do config for each queue via openwifi_conf_tx
4352ee67178SXianjun Jiao 
436*d4c3d810SXianjun Jiao //	// ------- assume 2.4 and 5GHz have the same SIFS (6us signal extension) --------
437*d4c3d810SXianjun Jiao 	xpu_api->XPU_REG_SEND_ACK_WAIT_TOP_write( ((16+25)<<16)|((16+25)<<0) );
438*d4c3d810SXianjun Jiao 	xpu_api->XPU_REG_RECV_ACK_COUNT_TOP0_write( (1<<31) | (((51+2+2)*10 + 15)<<16) | 10 );//2.4GHz. extra 300 clocks are needed when rx core fall into fake ht detection phase (rx mcs 6M)
439b597510cSXianjun Jiao 	xpu_api->XPU_REG_RECV_ACK_COUNT_TOP1_write( (1<<31) | (((51+2+2)*10 + 15)<<16) | 10 );//5GHz. extra 300 clocks are needed when rx core fall into fake ht detection phase (rx mcs 6M)
440*d4c3d810SXianjun Jiao //	// ------- assume 2.4 and 5GHz have different SIFS --------
441*d4c3d810SXianjun Jiao 	// xpu_api->XPU_REG_SEND_ACK_WAIT_TOP_write( ((16+23)<<16)|(0+23) );
442*d4c3d810SXianjun Jiao 	// xpu_api->XPU_REG_RECV_ACK_COUNT_TOP0_write( (1<<31) | (((45+2+2)*10 + 15)<<16) | 10 );//2.4GHz. extra 300 clocks are needed when rx core fall into fake ht detection phase (rx mcs 6M)
443*d4c3d810SXianjun Jiao 	// xpu_api->XPU_REG_RECV_ACK_COUNT_TOP1_write( (1<<31) | (((51+2+2)*10 + 15)<<16) | 10 );//5GHz. extra 300 clocks are needed when rx core fall into fake ht detection phase (rx mcs 6M)
4442ee67178SXianjun Jiao 
445585a5601SXianjun Jiao 	xpu_api->XPU_REG_DIFS_ADVANCE_write((OPENWIFI_MAX_SIGNAL_LEN_TH<<16)|2); //us. bit31~16 max pkt length threshold
4465deb8d18SXianjun Jiao 
4474bdc210eSXianjun Jiao 	// setup time schedule of 4 slices
4484bdc210eSXianjun Jiao 	// slice 0
4494bdc210eSXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_TOTAL_write(50000-1); // total 50ms
4504bdc210eSXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_START_write(0); //start 0ms
4514bdc210eSXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_END_write(50000-1); //end 50ms
4524bdc210eSXianjun Jiao 
4534bdc210eSXianjun Jiao 	// slice 1
4544bdc210eSXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_TOTAL_write((1<<20)|(50000-1)); // total 50ms
4554bdc210eSXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_START_write((1<<20)|(0)); //start 0ms
4564bdc210eSXianjun Jiao 	//xpu_api->XPU_REG_SLICE_COUNT_END_write((1<<20)|(20000-1)); //end 20ms
4574bdc210eSXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_END_write((1<<20)|(50000-1)); //end 20ms
4584bdc210eSXianjun Jiao 
4594bdc210eSXianjun Jiao 	// slice 2
4604bdc210eSXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_TOTAL_write((2<<20)|(50000-1)); // total 50ms
4614bdc210eSXianjun Jiao 	//xpu_api->XPU_REG_SLICE_COUNT_START_write((2<<20)|(20000)); //start 20ms
4624bdc210eSXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_START_write((2<<20)|(0)); //start 20ms
4634bdc210eSXianjun Jiao 	//xpu_api->XPU_REG_SLICE_COUNT_END_write((2<<20)|(40000-1)); //end 20ms
4644bdc210eSXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_END_write((2<<20)|(50000-1)); //end 20ms
4654bdc210eSXianjun Jiao 
4664bdc210eSXianjun Jiao 	// slice 3
4674bdc210eSXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_TOTAL_write((3<<20)|(50000-1)); // total 50ms
4684bdc210eSXianjun Jiao 	//xpu_api->XPU_REG_SLICE_COUNT_START_write((3<<20)|(40000)); //start 40ms
4694bdc210eSXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_START_write((3<<20)|(0)); //start 40ms
4704bdc210eSXianjun Jiao 	//xpu_api->XPU_REG_SLICE_COUNT_END_write((3<<20)|(50000-1)); //end 20ms
4714bdc210eSXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_END_write((3<<20)|(50000-1)); //end 20ms
4724bdc210eSXianjun Jiao 
4734bdc210eSXianjun Jiao 	// all slice sync rest
4744bdc210eSXianjun Jiao 	xpu_api->XPU_REG_MULTI_RST_write(1<<7); //bit7 reset the counter for all queues at the same time
4754bdc210eSXianjun Jiao 	xpu_api->XPU_REG_MULTI_RST_write(0<<7);
4764bdc210eSXianjun Jiao 
4772ee67178SXianjun Jiao 	printk("%s hw_init err %d\n", xpu_compatible_str, err);
4782ee67178SXianjun Jiao 	return(err);
4792ee67178SXianjun Jiao }
4802ee67178SXianjun Jiao 
4812ee67178SXianjun Jiao static int dev_probe(struct platform_device *pdev)
4822ee67178SXianjun Jiao {
4832ee67178SXianjun Jiao 	struct device_node *np = pdev->dev.of_node;
4842ee67178SXianjun Jiao 	struct resource *io;
4852ee67178SXianjun Jiao 	u32 test_us0, test_us1, test_us2;
4862ee67178SXianjun Jiao 	int err=1;
4872ee67178SXianjun Jiao 
4882ee67178SXianjun Jiao 	printk("\n");
4892ee67178SXianjun Jiao 
4902ee67178SXianjun Jiao 	if (np) {
4912ee67178SXianjun Jiao 		const struct of_device_id *match;
4922ee67178SXianjun Jiao 
4932ee67178SXianjun Jiao 		match = of_match_node(dev_of_ids, np);
4942ee67178SXianjun Jiao 		if (match) {
4952ee67178SXianjun Jiao 			printk("%s dev_probe match!\n", xpu_compatible_str);
4962ee67178SXianjun Jiao 			err = 0;
4972ee67178SXianjun Jiao 		}
4982ee67178SXianjun Jiao 	}
4992ee67178SXianjun Jiao 
5002ee67178SXianjun Jiao 	if (err)
5012ee67178SXianjun Jiao 		return err;
5022ee67178SXianjun Jiao 
5032ee67178SXianjun Jiao 	xpu_api->hw_init=hw_init;
5042ee67178SXianjun Jiao 
5052ee67178SXianjun Jiao 	xpu_api->reg_read=reg_read;
5062ee67178SXianjun Jiao 	xpu_api->reg_write=reg_write;
5072ee67178SXianjun Jiao 
5082ee67178SXianjun Jiao 	xpu_api->XPU_REG_MULTI_RST_write=XPU_REG_MULTI_RST_write;
5092ee67178SXianjun Jiao 	xpu_api->XPU_REG_MULTI_RST_read=XPU_REG_MULTI_RST_read;
5102ee67178SXianjun Jiao 	xpu_api->XPU_REG_SRC_SEL_write=XPU_REG_SRC_SEL_write;
5112ee67178SXianjun Jiao 	xpu_api->XPU_REG_SRC_SEL_read=XPU_REG_SRC_SEL_read;
5122ee67178SXianjun Jiao 
5132ee67178SXianjun Jiao 	xpu_api->XPU_REG_RECV_ACK_COUNT_TOP0_write=XPU_REG_RECV_ACK_COUNT_TOP0_write;
5142ee67178SXianjun Jiao 	xpu_api->XPU_REG_RECV_ACK_COUNT_TOP0_read=XPU_REG_RECV_ACK_COUNT_TOP0_read;
5152ee67178SXianjun Jiao 	xpu_api->XPU_REG_RECV_ACK_COUNT_TOP1_write=XPU_REG_RECV_ACK_COUNT_TOP1_write;
5162ee67178SXianjun Jiao 	xpu_api->XPU_REG_RECV_ACK_COUNT_TOP1_read=XPU_REG_RECV_ACK_COUNT_TOP1_read;
5172ee67178SXianjun Jiao 	xpu_api->XPU_REG_SEND_ACK_WAIT_TOP_write=XPU_REG_SEND_ACK_WAIT_TOP_write;
5182ee67178SXianjun Jiao 	xpu_api->XPU_REG_SEND_ACK_WAIT_TOP_read=XPU_REG_SEND_ACK_WAIT_TOP_read;
5192ee67178SXianjun Jiao 	xpu_api->XPU_REG_MAC_ADDR_LOW_write=XPU_REG_MAC_ADDR_LOW_write;
5202ee67178SXianjun Jiao 	xpu_api->XPU_REG_MAC_ADDR_LOW_read=XPU_REG_MAC_ADDR_LOW_read;
5212ee67178SXianjun Jiao 	xpu_api->XPU_REG_MAC_ADDR_HIGH_write=XPU_REG_MAC_ADDR_HIGH_write;
5222ee67178SXianjun Jiao 	xpu_api->XPU_REG_MAC_ADDR_HIGH_read=XPU_REG_MAC_ADDR_HIGH_read;
5232ee67178SXianjun Jiao 
5242ee67178SXianjun Jiao 	xpu_api->XPU_REG_FILTER_FLAG_write=XPU_REG_FILTER_FLAG_write;
5252ee67178SXianjun Jiao 	xpu_api->XPU_REG_FILTER_FLAG_read=XPU_REG_FILTER_FLAG_read;
5262ee67178SXianjun Jiao 	xpu_api->XPU_REG_CTS_TO_RTS_CONFIG_write=XPU_REG_CTS_TO_RTS_CONFIG_write;
5272ee67178SXianjun Jiao 	xpu_api->XPU_REG_CTS_TO_RTS_CONFIG_read=XPU_REG_CTS_TO_RTS_CONFIG_read;
5282ee67178SXianjun Jiao 	xpu_api->XPU_REG_BSSID_FILTER_LOW_write=XPU_REG_BSSID_FILTER_LOW_write;
5292ee67178SXianjun Jiao 	xpu_api->XPU_REG_BSSID_FILTER_LOW_read=XPU_REG_BSSID_FILTER_LOW_read;
5302ee67178SXianjun Jiao 	xpu_api->XPU_REG_BSSID_FILTER_HIGH_write=XPU_REG_BSSID_FILTER_HIGH_write;
5312ee67178SXianjun Jiao 	xpu_api->XPU_REG_BSSID_FILTER_HIGH_read=XPU_REG_BSSID_FILTER_HIGH_read;
5322ee67178SXianjun Jiao 
5332ee67178SXianjun Jiao 	xpu_api->XPU_REG_BAND_CHANNEL_write=XPU_REG_BAND_CHANNEL_write;
5342ee67178SXianjun Jiao 	xpu_api->XPU_REG_BAND_CHANNEL_read=XPU_REG_BAND_CHANNEL_read;
5352ee67178SXianjun Jiao 
5365deb8d18SXianjun Jiao 	xpu_api->XPU_REG_DIFS_ADVANCE_write=XPU_REG_DIFS_ADVANCE_write;
5375deb8d18SXianjun Jiao 	xpu_api->XPU_REG_DIFS_ADVANCE_read=XPU_REG_DIFS_ADVANCE_read;
5385deb8d18SXianjun Jiao 
539bb0a2c58SXianjun Jiao 	xpu_api->XPU_REG_FORCE_IDLE_MISC_write=XPU_REG_FORCE_IDLE_MISC_write;
540bb0a2c58SXianjun Jiao 	xpu_api->XPU_REG_FORCE_IDLE_MISC_read=XPU_REG_FORCE_IDLE_MISC_read;
541bb0a2c58SXianjun Jiao 
5422ee67178SXianjun Jiao 	xpu_api->XPU_REG_TRX_STATUS_read=XPU_REG_TRX_STATUS_read;
5432ee67178SXianjun Jiao 	xpu_api->XPU_REG_TX_RESULT_read=XPU_REG_TX_RESULT_read;
5442ee67178SXianjun Jiao 
5452ee67178SXianjun Jiao 	xpu_api->XPU_REG_TSF_RUNTIME_VAL_LOW_read=XPU_REG_TSF_RUNTIME_VAL_LOW_read;
5462ee67178SXianjun Jiao 	xpu_api->XPU_REG_TSF_RUNTIME_VAL_HIGH_read=XPU_REG_TSF_RUNTIME_VAL_HIGH_read;
5472ee67178SXianjun Jiao 	xpu_api->XPU_REG_TSF_LOAD_VAL_LOW_write=XPU_REG_TSF_LOAD_VAL_LOW_write;
5482ee67178SXianjun Jiao 	xpu_api->XPU_REG_TSF_LOAD_VAL_HIGH_write=XPU_REG_TSF_LOAD_VAL_HIGH_write;
5492ee67178SXianjun Jiao 	xpu_api->XPU_REG_TSF_LOAD_VAL_write=XPU_REG_TSF_LOAD_VAL_write;
5502ee67178SXianjun Jiao 
5512ee67178SXianjun Jiao 	xpu_api->XPU_REG_FC_DI_read=XPU_REG_FC_DI_read;
5522ee67178SXianjun Jiao 	xpu_api->XPU_REG_ADDR1_LOW_read=XPU_REG_ADDR1_LOW_read;
5532ee67178SXianjun Jiao 	xpu_api->XPU_REG_ADDR1_HIGH_read=XPU_REG_ADDR1_HIGH_read;
5542ee67178SXianjun Jiao 	xpu_api->XPU_REG_ADDR2_LOW_read=XPU_REG_ADDR2_LOW_read;
5552ee67178SXianjun Jiao 	xpu_api->XPU_REG_ADDR2_HIGH_read=XPU_REG_ADDR2_HIGH_read;
5562ee67178SXianjun Jiao 
5572ee67178SXianjun Jiao 	xpu_api->XPU_REG_LBT_TH_write=XPU_REG_LBT_TH_write;
5582ee67178SXianjun Jiao 	xpu_api->XPU_REG_LBT_TH_read=XPU_REG_LBT_TH_read;
5592ee67178SXianjun Jiao 
5602ee67178SXianjun Jiao 	xpu_api->XPU_REG_RSSI_DB_CFG_read=XPU_REG_RSSI_DB_CFG_read;
5612ee67178SXianjun Jiao 	xpu_api->XPU_REG_RSSI_DB_CFG_write=XPU_REG_RSSI_DB_CFG_write;
5622ee67178SXianjun Jiao 
5632ee67178SXianjun Jiao 	xpu_api->XPU_REG_CSMA_DEBUG_write=XPU_REG_CSMA_DEBUG_write;
5642ee67178SXianjun Jiao 	xpu_api->XPU_REG_CSMA_DEBUG_read=XPU_REG_CSMA_DEBUG_read;
5652ee67178SXianjun Jiao 
5662ee67178SXianjun Jiao 	xpu_api->XPU_REG_CSMA_CFG_write=XPU_REG_CSMA_CFG_write;
5672ee67178SXianjun Jiao 	xpu_api->XPU_REG_CSMA_CFG_read=XPU_REG_CSMA_CFG_read;
5682ee67178SXianjun Jiao 
569838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_TOTAL_write=XPU_REG_SLICE_COUNT_TOTAL_write;
570838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_START_write=XPU_REG_SLICE_COUNT_START_write;
571838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_END_write=XPU_REG_SLICE_COUNT_END_write;
5722ee67178SXianjun Jiao 
573838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_TOTAL_read=XPU_REG_SLICE_COUNT_TOTAL_read;
574838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_START_read=XPU_REG_SLICE_COUNT_START_read;
575838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_END_read=XPU_REG_SLICE_COUNT_END_read;
5762ee67178SXianjun Jiao 
5772ee67178SXianjun Jiao 	xpu_api->XPU_REG_BB_RF_DELAY_write=XPU_REG_BB_RF_DELAY_write;
578913a9e94SXianjun Jiao 
579913a9e94SXianjun Jiao 	xpu_api->XPU_REG_ACK_CTL_MAX_NUM_RETRANS_write=XPU_REG_ACK_CTL_MAX_NUM_RETRANS_write;
580913a9e94SXianjun Jiao 	xpu_api->XPU_REG_ACK_CTL_MAX_NUM_RETRANS_read=XPU_REG_ACK_CTL_MAX_NUM_RETRANS_read;
5812ee67178SXianjun Jiao 
582261bb9eeSmmehari 	xpu_api->XPU_REG_AMPDU_ACTION_write=XPU_REG_AMPDU_ACTION_write;
583261bb9eeSmmehari 	xpu_api->XPU_REG_AMPDU_ACTION_read=XPU_REG_AMPDU_ACTION_read;
584261bb9eeSmmehari 
585bc98f5bbSthavinga 	xpu_api->XPU_REG_SPI_DISABLE_write=XPU_REG_SPI_DISABLE_write;
586bc98f5bbSthavinga 	xpu_api->XPU_REG_SPI_DISABLE_read=XPU_REG_SPI_DISABLE_read;
587bc98f5bbSthavinga 
5882ee67178SXianjun Jiao 	xpu_api->XPU_REG_MAC_ADDR_write=XPU_REG_MAC_ADDR_write;
5892ee67178SXianjun Jiao 
5902ee67178SXianjun Jiao 	/* Request and map I/O memory */
5912ee67178SXianjun Jiao 	io = platform_get_resource(pdev, IORESOURCE_MEM, 0);
5922ee67178SXianjun Jiao 	base_addr = devm_ioremap_resource(&pdev->dev, io);
5932ee67178SXianjun Jiao 	if (IS_ERR(base_addr))
5942ee67178SXianjun Jiao 		return PTR_ERR(base_addr);
5952ee67178SXianjun Jiao 
5962ee67178SXianjun Jiao 	printk("%s dev_probe io start 0x%08x end 0x%08x name %s flags 0x%08x desc 0x%08x\n", xpu_compatible_str,io->start,io->end,io->name,(u32)io->flags,(u32)io->desc);
5972ee67178SXianjun Jiao 	printk("%s dev_probe base_addr 0x%08x\n", xpu_compatible_str,(u32)base_addr);
5982ee67178SXianjun Jiao 	printk("%s dev_probe xpu_driver_api_inst 0x%08x\n", xpu_compatible_str, (u32)&xpu_driver_api_inst);
5992ee67178SXianjun Jiao 	printk("%s dev_probe             xpu_api 0x%08x\n", xpu_compatible_str, (u32)xpu_api);
6002ee67178SXianjun Jiao 
6012ee67178SXianjun Jiao 	printk("%s dev_probe reset tsf timer\n", xpu_compatible_str);
6022ee67178SXianjun Jiao 	xpu_api->XPU_REG_TSF_LOAD_VAL_write(0,0);
6032ee67178SXianjun Jiao 	test_us0 = xpu_api->XPU_REG_TSF_RUNTIME_VAL_LOW_read();
6042ee67178SXianjun Jiao 	mdelay(33);
6052ee67178SXianjun Jiao 	test_us1 = xpu_api->XPU_REG_TSF_RUNTIME_VAL_LOW_read();
6062ee67178SXianjun Jiao 	mdelay(67);
6072ee67178SXianjun Jiao 	test_us2 = xpu_api->XPU_REG_TSF_RUNTIME_VAL_LOW_read();
6082ee67178SXianjun Jiao 	printk("%s dev_probe XPU_REG_TSF_RUNTIME_VAL_LOW_read %d %d %dus\n", xpu_compatible_str, test_us0, test_us1, test_us2);
6092ee67178SXianjun Jiao 
6102ee67178SXianjun Jiao 	printk("%s dev_probe succeed!\n", xpu_compatible_str);
6112ee67178SXianjun Jiao 
6122ee67178SXianjun Jiao 	err = hw_init(XPU_NORMAL);
6132ee67178SXianjun Jiao 
6142ee67178SXianjun Jiao 	return err;
6152ee67178SXianjun Jiao }
6162ee67178SXianjun Jiao 
6172ee67178SXianjun Jiao static int dev_remove(struct platform_device *pdev)
6182ee67178SXianjun Jiao {
6192ee67178SXianjun Jiao 	printk("\n");
6202ee67178SXianjun Jiao 
6212ee67178SXianjun Jiao 	printk("%s dev_remove base_addr 0x%08x\n", xpu_compatible_str,(u32)base_addr);
6222ee67178SXianjun Jiao 	printk("%s dev_remove xpu_driver_api_inst 0x%08x\n", xpu_compatible_str, (u32)&xpu_driver_api_inst);
6232ee67178SXianjun Jiao 	printk("%s dev_remove             xpu_api 0x%08x\n", xpu_compatible_str, (u32)xpu_api);
6242ee67178SXianjun Jiao 
6252ee67178SXianjun Jiao 	printk("%s dev_remove succeed!\n", xpu_compatible_str);
6262ee67178SXianjun Jiao 	return 0;
6272ee67178SXianjun Jiao }
6282ee67178SXianjun Jiao 
6292ee67178SXianjun Jiao static struct platform_driver dev_driver = {
6302ee67178SXianjun Jiao 	.driver = {
6312ee67178SXianjun Jiao 		.name = "sdr,xpu",
6322ee67178SXianjun Jiao 		.owner = THIS_MODULE,
6332ee67178SXianjun Jiao 		.of_match_table = dev_of_ids,
6342ee67178SXianjun Jiao 	},
6352ee67178SXianjun Jiao 	.probe = dev_probe,
6362ee67178SXianjun Jiao 	.remove = dev_remove,
6372ee67178SXianjun Jiao };
6382ee67178SXianjun Jiao 
6392ee67178SXianjun Jiao module_platform_driver(dev_driver);
6402ee67178SXianjun Jiao 
6412ee67178SXianjun Jiao MODULE_AUTHOR("Xianjun Jiao");
6422ee67178SXianjun Jiao MODULE_DESCRIPTION("sdr,xpu");
6432ee67178SXianjun Jiao MODULE_LICENSE("GPL v2");
644