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