18e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov/*
28e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov * Copyright (c) 2013 Eugene Krasnikov <k.eugene.e@gmail.com>
38e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov *
48e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov * Permission to use, copy, modify, and/or distribute this software for any
58e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov * purpose with or without fee is hereby granted, provided that the above
68e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov * copyright notice and this permission notice appear in all copies.
78e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov *
88e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
98e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
108e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
118e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
128e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
138e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
148e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
158e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov */
168e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
178e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#ifndef _DXE_H_
188e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define _DXE_H_
198e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
208e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#include "wcn36xx.h"
218e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
228e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov/*
238e84c25821698bdef73c0329fb2022a4673b7adcEugene KrasnikovTX_LOW	= DMA0
248e84c25821698bdef73c0329fb2022a4673b7adcEugene KrasnikovTX_HIGH	= DMA4
258e84c25821698bdef73c0329fb2022a4673b7adcEugene KrasnikovRX_LOW	= DMA1
268e84c25821698bdef73c0329fb2022a4673b7adcEugene KrasnikovRX_HIGH	= DMA3
278e84c25821698bdef73c0329fb2022a4673b7adcEugene KrasnikovH2H_TEST_RX_TX = DMA2
288e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov*/
298e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
308e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov/* DXE registers */
318e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_MEM_REG			0x202000
328e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
338e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CCU_INT			0xA0011
34f2ed5d2499b550917c7f5e50476e39548de68092Pontus Fuchs#define WCN36XX_DXE_REG_CCU_INT_3660		0x200b10
35f2ed5d2499b550917c7f5e50476e39548de68092Pontus Fuchs#define WCN36XX_DXE_REG_CCU_INT_3680		0x2050dc
368e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
378e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov/* TODO This must calculated properly but not hardcoded */
388e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CTRL_TX_L			0x328a44
398e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CTRL_TX_H			0x32ce44
408e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CTRL_RX_L			0x12ad2f
418e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CTRL_RX_H			0x12d12f
428e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CTRL_TX_H_BD		0x30ce45
438e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CTRL_TX_H_SKB		0x32ce4d
448e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CTRL_TX_L_BD		0x308a45
458e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CTRL_TX_L_SKB		0x328a4d
468e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
478e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov/* TODO This must calculated properly but not hardcoded */
488e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_WQ_TX_L			0x17
498e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_WQ_TX_H			0x17
508e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_WQ_RX_L			0xB
518e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_WQ_RX_H			0x4
528e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
538e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov/* DXE descriptor control filed */
548e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CTRL_VALID_MASK (0x00000001)
558e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
568e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov/* TODO This must calculated properly but not hardcoded */
578e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov/* DXE default control register values */
588e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CH_DEFAULT_CTL_RX_L		0x847EAD2F
598e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CH_DEFAULT_CTL_RX_H		0x84FED12F
608e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CH_DEFAULT_CTL_TX_H		0x853ECF4D
618e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CH_DEFAULT_CTL_TX_L		0x843e8b4d
628e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
638e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov/* Common DXE registers */
648e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_MEM_CSR			(WCN36XX_DXE_MEM_REG + 0x00)
658e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_REG_CSR_RESET		(WCN36XX_DXE_MEM_REG + 0x00)
668e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_ENCH_ADDR			(WCN36XX_DXE_MEM_REG + 0x04)
678e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_REG_CH_EN			(WCN36XX_DXE_MEM_REG + 0x08)
688e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_REG_CH_DONE			(WCN36XX_DXE_MEM_REG + 0x0C)
698e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_REG_CH_ERR			(WCN36XX_DXE_MEM_REG + 0x10)
708e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_INT_MASK_REG		(WCN36XX_DXE_MEM_REG + 0x18)
718e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_INT_SRC_RAW_REG		(WCN36XX_DXE_MEM_REG + 0x20)
728e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	/* #define WCN36XX_DXE_INT_CH6_MASK	0x00000040 */
738e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	/* #define WCN36XX_DXE_INT_CH5_MASK	0x00000020 */
748e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	#define WCN36XX_DXE_INT_CH4_MASK	0x00000010
758e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	#define WCN36XX_DXE_INT_CH3_MASK	0x00000008
768e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	/* #define WCN36XX_DXE_INT_CH2_MASK	0x00000004 */
778e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	#define WCN36XX_DXE_INT_CH1_MASK	0x00000002
788e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	#define WCN36XX_DXE_INT_CH0_MASK	0x00000001
798e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_0_INT_CLR			(WCN36XX_DXE_MEM_REG + 0x30)
808e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_0_INT_ED_CLR		(WCN36XX_DXE_MEM_REG + 0x34)
818e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_0_INT_DONE_CLR		(WCN36XX_DXE_MEM_REG + 0x38)
828e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_0_INT_ERR_CLR		(WCN36XX_DXE_MEM_REG + 0x3C)
838e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
848e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_0_CH0_STATUS		(WCN36XX_DXE_MEM_REG + 0x404)
858e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_0_CH1_STATUS		(WCN36XX_DXE_MEM_REG + 0x444)
868e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_0_CH2_STATUS		(WCN36XX_DXE_MEM_REG + 0x484)
878e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_0_CH3_STATUS		(WCN36XX_DXE_MEM_REG + 0x4C4)
888e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_0_CH4_STATUS		(WCN36XX_DXE_MEM_REG + 0x504)
898e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
908e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_REG_RESET			0x5c89
918e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
928e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov/* Temporary BMU Workqueue 4 */
938e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_BMU_WQ_RX_LOW		0xB
948e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_BMU_WQ_RX_HIGH		0x4
958e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov/* DMA channel offset */
968e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_TX_LOW_OFFSET		0x400
978e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_TX_HIGH_OFFSET		0x500
988e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_RX_LOW_OFFSET		0x440
998e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_RX_HIGH_OFFSET		0x4C0
1008e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
1018e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov/* Address of the next DXE descriptor */
1028e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CH_NEXT_DESC_ADDR		0x001C
1038e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CH_NEXT_DESC_ADDR_TX_L	(WCN36XX_DXE_MEM_REG + \
1048e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_TX_LOW_OFFSET + \
1058e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_CH_NEXT_DESC_ADDR)
1068e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CH_NEXT_DESC_ADDR_TX_H	(WCN36XX_DXE_MEM_REG + \
1078e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_TX_HIGH_OFFSET + \
1088e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_CH_NEXT_DESC_ADDR)
1098e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CH_NEXT_DESC_ADDR_RX_L	(WCN36XX_DXE_MEM_REG + \
1108e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_RX_LOW_OFFSET + \
1118e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_CH_NEXT_DESC_ADDR)
1128e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CH_NEXT_DESC_ADDR_RX_H	(WCN36XX_DXE_MEM_REG + \
1138e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_RX_HIGH_OFFSET + \
1148e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_CH_NEXT_DESC_ADDR)
1158e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
1168e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov/* DXE Descriptor source address */
1178e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CH_SRC_ADDR			0x000C
1188e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CH_SRC_ADDR_RX_L		(WCN36XX_DXE_MEM_REG + \
1198e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_RX_LOW_OFFSET + \
1208e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_CH_SRC_ADDR)
1218e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CH_SRC_ADDR_RX_H		(WCN36XX_DXE_MEM_REG + \
1228e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_RX_HIGH_OFFSET + \
1238e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_CH_SRC_ADDR)
1248e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
1258e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov/* DXE Descriptor address destination address */
1268e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CH_DEST_ADDR		0x0014
1278e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CH_DEST_ADDR_TX_L		(WCN36XX_DXE_MEM_REG + \
1288e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_TX_LOW_OFFSET + \
1298e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_CH_DEST_ADDR)
1308e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CH_DEST_ADDR_TX_H		(WCN36XX_DXE_MEM_REG + \
1318e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_TX_HIGH_OFFSET + \
1328e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_CH_DEST_ADDR)
1338e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CH_DEST_ADDR_RX_L		(WCN36XX_DXE_MEM_REG + \
1348e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_RX_LOW_OFFSET + \
1358e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_CH_DEST_ADDR)
1368e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CH_DEST_ADDR_RX_H		(WCN36XX_DXE_MEM_REG + \
1378e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_RX_HIGH_OFFSET + \
1388e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_CH_DEST_ADDR)
1398e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
1408e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov/* Interrupt status */
1418e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CH_STATUS_REG_ADDR		0x0004
1428e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CH_STATUS_REG_ADDR_TX_L	(WCN36XX_DXE_MEM_REG + \
1438e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_TX_LOW_OFFSET + \
1448e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_CH_STATUS_REG_ADDR)
1458e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CH_STATUS_REG_ADDR_TX_H	(WCN36XX_DXE_MEM_REG + \
1468e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_TX_HIGH_OFFSET + \
1478e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_CH_STATUS_REG_ADDR)
1488e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CH_STATUS_REG_ADDR_RX_L	(WCN36XX_DXE_MEM_REG + \
1498e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_RX_LOW_OFFSET + \
1508e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_CH_STATUS_REG_ADDR)
1518e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_CH_STATUS_REG_ADDR_RX_H	(WCN36XX_DXE_MEM_REG + \
1528e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_RX_HIGH_OFFSET + \
1538e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_CH_STATUS_REG_ADDR)
1548e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
1558e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
1568e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov/* DXE default control register */
1578e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_REG_CTL_RX_L		(WCN36XX_DXE_MEM_REG + \
1588e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_RX_LOW_OFFSET)
1598e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_REG_CTL_RX_H		(WCN36XX_DXE_MEM_REG + \
1608e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_RX_HIGH_OFFSET)
1618e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_REG_CTL_TX_H		(WCN36XX_DXE_MEM_REG + \
1628e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_TX_HIGH_OFFSET)
1638e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_DXE_REG_CTL_TX_L		(WCN36XX_DXE_MEM_REG + \
1648e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov						 WCN36XX_DXE_TX_LOW_OFFSET)
1658e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
1668e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_SMSM_WLAN_TX_ENABLE		0x00000400
1678e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_SMSM_WLAN_TX_RINGS_EMPTY	0x00000200
1688e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
1698e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
1708e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov/* Interrupt control channel mask */
1718e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_INT_MASK_CHAN_TX_L		0x00000001
1728e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_INT_MASK_CHAN_RX_L		0x00000002
1738e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_INT_MASK_CHAN_RX_H		0x00000008
1748e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_INT_MASK_CHAN_TX_H		0x00000010
1758e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
1768e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_BD_CHUNK_SIZE			128
1778e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
1788e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#define WCN36XX_PKT_SIZE			0xF20
1798e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikovenum wcn36xx_dxe_ch_type {
1808e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	WCN36XX_DXE_CH_TX_L,
1818e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	WCN36XX_DXE_CH_TX_H,
1828e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	WCN36XX_DXE_CH_RX_L,
1838e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	WCN36XX_DXE_CH_RX_H
1848e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov};
1858e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
1868e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov/* amount of descriptors per channel */
1878e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikovenum wcn36xx_dxe_ch_desc_num {
1888e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	WCN36XX_DXE_CH_DESC_NUMB_TX_L		= 128,
1898e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	WCN36XX_DXE_CH_DESC_NUMB_TX_H		= 10,
1908e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	WCN36XX_DXE_CH_DESC_NUMB_RX_L		= 512,
1918e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	WCN36XX_DXE_CH_DESC_NUMB_RX_H		= 40
1928e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov};
1938e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
1948e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov/**
1958e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov * struct wcn36xx_dxe_desc - describes descriptor of one DXE buffer
1968e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov *
1978e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov * @ctrl: is a union that consists of following bits:
1988e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov * union {
1998e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov *	u32	valid		:1; //0 = DMA stop, 1 = DMA continue with this
2008e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov *				    //descriptor
2018e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov *	u32	transfer_type	:2; //0 = Host to Host space
2028e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov *	u32	eop		:1; //End of Packet
2038e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov *	u32	bd_handling	:1; //if transferType = Host to BMU, then 0
2048e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov *				    // means first 128 bytes contain BD, and 1
2058e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov *				    // means create new empty BD
2068e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov *	u32	siq		:1; // SIQ
2078e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov *	u32	diq		:1; // DIQ
2088e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov *	u32	pdu_rel		:1; //0 = don't release BD and PDUs when done,
2098e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov *				    // 1 = release them
2108e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov *	u32	bthld_sel	:4; //BMU Threshold Select
2118e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov *	u32	prio		:3; //Specifies the priority level to use for
2128e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov *				    // the transfer
2138e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov *	u32	stop_channel	:1; //1 = DMA stops processing further, channel
2148e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov *				    //requires re-enabling after this
2158e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov *	u32	intr		:1; //Interrupt on Descriptor Done
2168e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov *	u32	rsvd		:1; //reserved
2178e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov *	u32	size		:14;//14 bits used - ignored for BMU transfers,
2188e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov *				    //only used for host to host transfers?
2198e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov * } ctrl;
2208e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov */
2218e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikovstruct wcn36xx_dxe_desc {
2228e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	u32	ctrl;
2238e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	u32	fr_len;
2248e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
2258e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	u32	src_addr_l;
2268e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	u32	dst_addr_l;
2278e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	u32	phy_next_l;
2288e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	u32	src_addr_h;
2298e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	u32	dst_addr_h;
2308e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	u32	phy_next_h;
2318e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov} __packed;
2328e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
2338e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov/* DXE Control block */
2348e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikovstruct wcn36xx_dxe_ctl {
2358e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	struct wcn36xx_dxe_ctl	*next;
2368e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	struct wcn36xx_dxe_desc	*desc;
2378e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	unsigned int		desc_phy_addr;
2388e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	int			ctl_blk_order;
2398e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	struct sk_buff		*skb;
2408e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	spinlock_t              skb_lock;
2418e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	void			*bd_cpu_addr;
2428e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	dma_addr_t		bd_phy_addr;
2438e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov};
2448e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
2458e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikovstruct wcn36xx_dxe_ch {
2468e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	enum wcn36xx_dxe_ch_type	ch_type;
2478e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	void				*cpu_addr;
2488e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	dma_addr_t			dma_addr;
2498e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	enum wcn36xx_dxe_ch_desc_num	desc_num;
2508e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	/* DXE control block ring */
2518e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	struct wcn36xx_dxe_ctl		*head_blk_ctl;
2528e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	struct wcn36xx_dxe_ctl		*tail_blk_ctl;
2538e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
2548e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	/* DXE channel specific configs */
2558e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	u32				dxe_wq;
2568e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	u32				ctrl_bd;
2578e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	u32				ctrl_skb;
2588e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	u32				reg_ctrl;
2598e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	u32				def_ctrl;
2608e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov};
2618e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
2628e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov/* Memory Pool for BD headers */
2638e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikovstruct wcn36xx_dxe_mem_pool {
2648e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	int		chunk_size;
2658e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	void		*virt_addr;
2668e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov	dma_addr_t	phy_addr;
2678e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov};
2688e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov
2698e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikovstruct wcn36xx_vif;
2708e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikovint wcn36xx_dxe_allocate_mem_pools(struct wcn36xx *wcn);
2718e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikovvoid wcn36xx_dxe_free_mem_pools(struct wcn36xx *wcn);
2728e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikovvoid wcn36xx_dxe_rx_frame(struct wcn36xx *wcn);
2738e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikovint wcn36xx_dxe_alloc_ctl_blks(struct wcn36xx *wcn);
2748e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikovvoid wcn36xx_dxe_free_ctl_blks(struct wcn36xx *wcn);
2758e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikovint wcn36xx_dxe_init(struct wcn36xx *wcn);
2768e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikovvoid wcn36xx_dxe_deinit(struct wcn36xx *wcn);
2778e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikovint wcn36xx_dxe_init_channels(struct wcn36xx *wcn);
2788e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikovint wcn36xx_dxe_tx_frame(struct wcn36xx *wcn,
2798e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov			 struct wcn36xx_vif *vif_priv,
2808e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov			 struct sk_buff *skb,
2818e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov			 bool is_low);
2828e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikovvoid wcn36xx_dxe_tx_ack_ind(struct wcn36xx *wcn, u32 status);
2838e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikovvoid *wcn36xx_dxe_get_next_bd(struct wcn36xx *wcn, bool is_low);
2848e84c25821698bdef73c0329fb2022a4673b7adcEugene Krasnikov#endif	/* _DXE_H_ */
285