blob: 9c2eb8f337de948998c55ba24632eaf2554ae820 [file] [log] [blame]
/*
* Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
* above copyright notice and this permission notice appear in all
* copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
/*
* This file was originally distributed by Qualcomm Atheros, Inc.
* under proprietary terms before Copyright ownership was assigned
* to the Linux Foundation.
*/
#ifndef WLAN_QCT_DXE_I_H
#define WLAN_QCT_DXE_I_H
/**=========================================================================
@file wlan_qct_dxe_i.h
@brief
This file contains the external API exposed by the wlan data transfer abstraction layer module.
========================================================================*/
/*===========================================================================
EDIT HISTORY FOR FILE
This section contains comments describing changes made to the module.
Notice that changes are listed in reverse chronological order.
$Header:$ $DateTime: $ $Author: $
when who what, where, why
-------- --- ----------------------------------------------------------
08/03/10 schang Created module.
===========================================================================*/
/*===========================================================================
INCLUDE FILES FOR MODULE
===========================================================================*/
/*----------------------------------------------------------------------------
* Include Files
* -------------------------------------------------------------------------*/
#include "wlan_qct_dxe.h"
#include "wlan_qct_pal_trace.h"
#include "wlan_qct_pal_timer.h"
#include "vos_trace.h"
/*----------------------------------------------------------------------------
* Preprocessor Definitions and Constants
* -------------------------------------------------------------------------*/
#define WLANDXE_CTXT_COOKIE 0xC00CC111
#ifdef DXE_TRACE
#define DXTRACE(p) p
#else
#define DXTRACE(p) { }
#endif
#define foreach_valid_channel(idx) \
for (idx = 0; idx < WDTS_CHANNEL_MAX; idx++) \
if (!(dxeGetEnabledChannels() & 1<<idx)) \
continue; \
else
#define WLANDXE_IS_VALID_CHANNEL(idx) \
(dxeGetEnabledChannels() & 1<<idx)
/* From here WCNSS DXE register information
* This is temporary definition location to make compile and unit test
* If official msmreg.h integrated, this part will be eliminated */
/* Start with base address */
#ifdef WCN_PRONTO
#define WLANDXE_CCU_DXE_INT_SELECT 0x2050dc
#define WLANDXE_CCU_DXE_INT_SELECT_STAT 0x2050e0
#define WLANDXE_CCU_ASIC_INT_ENABLE 0x2050e4
#define WLANDXE_CCU_SOFT_RESET 0x204010
#define WLANDXE_BMU_AVAILABLE_BD_PDU_LOCAL 0x80260
#else
#define WLANDXE_CCU_DXE_INT_SELECT 0x200b10
#define WLANDXE_CCU_DXE_INT_SELECT_STAT 0x200b14
#define WLANDXE_CCU_ASIC_INT_ENABLE 0x200b18
#endif
#define WLANDXE_BMU_AVAILABLE_BD_PDU 0x80084
#define WLANDXE_BMU_ERROR_INTR_STATUS 0x80004
#define WLANDXE_REGISTER_BASE_ADDRESS 0x202000
#define WLAN_PMU_SPARE_OUT_ADDRESS 0x21c088
#define WLAN_PMU_POWER_DOWN_MASK 0x04000000
/* Common over the channels register addresses */
#define WALNDEX_DMA_CSR_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x00)
#define WALNDEX_DMA_ENCH_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x04)
#define WALNDEX_DMA_CH_EN_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x08)
#define WALNDEX_DMA_CH_DONE_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x0C)
#define WALNDEX_DMA_CH_ERR_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x10)
#define WALNDEX_DMA_CH_STOP_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x14)
/* Interrupt Control register address */
#define WLANDXE_INT_MASK_REG_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x18)
#define WLANDXE_INT_SRC_MSKD_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x1C)
#define WLANDXE_INT_SRC_RAW_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x20)
#define WLANDXE_INT_ED_SRC_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x24)
#define WLANDXE_INT_DONE_SRC_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x28)
#define WLANDXE_INT_ERR_SRC_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x2C)
#define WLANDXE_INT_CLR_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x30)
#define WLANDXE_INT_ED_CLR_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x34)
#define WLANDXE_INT_DONE_CLR_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x38)
#define WLANDXE_INT_ERR_CLR_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x3C)
#define WLANDXE_DMA_CH_PRES_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x40)
#define WLANDXE_ARB_CH_MSK_CLR_ADDRRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x74)
/* Channel Counter register */
#define WLANDXE_DMA_COUNTER_0 (WLANDXE_REGISTER_BASE_ADDRESS + 0x200)
#define WLANDXE_DMA_COUNTER_1 (WLANDXE_REGISTER_BASE_ADDRESS + 0x204)
#define WLANDXE_DMA_COUNTER_2 (WLANDXE_REGISTER_BASE_ADDRESS + 0x208)
#define WLANDXE_DMA_COUNTER_3 (WLANDXE_REGISTER_BASE_ADDRESS + 0x20C)
#define WLANDXE_DMA_COUNTER_4 (WLANDXE_REGISTER_BASE_ADDRESS + 0x210)
#define WLANDXE_DMA_COUNTER_5 (WLANDXE_REGISTER_BASE_ADDRESS + 0x214)
#define WLANDXE_DMA_COUNTER_6 (WLANDXE_REGISTER_BASE_ADDRESS + 0x218)
#define WLANDXE_ENGINE_STAT_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x64)
#define WLANDXE_BMU_SB_QDAT_AV_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x5c)
/* Channel Base address */
#define WLANDXE_DMA_CHAN0_BASE_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x400)
#define WLANDXE_DMA_CHAN1_BASE_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x440)
#define WLANDXE_DMA_CHAN2_BASE_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x480)
#define WLANDXE_DMA_CHAN3_BASE_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x4C0)
#define WLANDXE_DMA_CHAN4_BASE_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x500)
#define WLANDXE_DMA_CHAN5_BASE_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x540)
#define WLANDXE_DMA_CHAN6_BASE_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x580)
#define WLANDXE_DMA_CHAN7_BASE_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x5c0)
/* Channel specific register offset */
#define WLANDXE_DMA_CH_CTRL_REG 0x0000
#define WLANDXE_DMA_CH_STATUS_REG 0x0004
#define WLANDXE_DMA_CH_SZ_REG 0x0008
#define WLANDXE_DMA_CH_SADRL_REG 0x000C
#define WLANDXE_DMA_CH_SADRH_REG 0x0010
#define WLANDXE_DMA_CH_DADRL_REG 0x0014
#define WLANDXE_DMA_CH_DADRH_REG 0x0018
#define WLANDXE_DMA_CH_DESCL_REG 0x001C
#define WLANDXE_DMA_CH_DESCH_REG 0x0020
#define WLANDXE_DMA_CH_LST_DESCL_REG 0x0024
#define WLANDXE_DMA_CH_LST_DESCH_REG 0x0028
#define WLANDXE_DMA_CH_BD_REG 0x002C
#define WLANDXE_DMA_CH_HEAD_REG 0x0030
#define WLANDXE_DMA_CH_TAIL_REG 0x0034
#define WLANDXE_DMA_CH_PDU_REG 0x0038
#define WLANDXE_DMA_CH_TSTMP_REG 0x003C
/* Common CSR Register Contorol mask and offset */
#ifdef WCN_PRONTO
#define WLANDXE_DMA_CSR_RESERVED_MASK 0xFFFF0000
#define WLANDXE_DMA_CSR_RESERVED_OFFSET 0x10
#define WLANDXE_DMA_CSR_RESERVED_DEFAULT 0x0
#define WLANDXE_DMA_CSR_FW_BMU_RECOVERY 0x400000
#define WLANDXE_DMA_CSR_RECOVERY_DONE 0x200000
#define WLANDXE_DMA_CSR_HOST_RECOVERY_DONE 0x800000
#define WLANDXE_DMA_CSR_H2H_SYNC_EN_MASK 0x8000
#define WLANDXE_DMA_CSR_H2H_SYNC_EN_OFFSET 0x0F
#define WLANDXE_DMA_CSR_H2H_SYNC_EN_DEFAULT 0x0
#define WLANDXE_DMA_CSR_PAUSED_MASK 0x4000
#define WLANDXE_DMA_CSR_PAUSED_OFFSET 0x0E
#define WLANDXE_DMA_CSR_PAUSED_DEFAULT 0x0
#define WLANDXE_DMA_CSR_ECTR_EN_MASK 0x2000
#define WLANDXE_DMA_CSR_ECTR_EN_OFFSET 0x0D
#define WLANDXE_DMA_CSR_ECTR_EN_DEFAULT 0x2000
#define WLANDXE_DMA_CSR_B2H_TSTMP_OFF_MASK 0x1F00
#define WLANDXE_DMA_CSR_B2H_TSTMP_OFF_OFFSET 0x08
#define WLANDXE_DMA_CSR_B2H_TSTMP_OFF_DEFAULT 0x0F00
#define WLANDXE_DMA_CSR_H2B_TSTMP_OFF_MASK 0xF8
#define WLANDXE_DMA_CSR_H2B_TSTMP_OFF_OFFSET 0x03
#define WLANDXE_DMA_CSR_H2B_TSTMP_OFF_DEFAULT 0x28
#define WLANDXE_DMA_CSR_TSTMP_EN_MASK 0x04
#define WLANDXE_DMA_CSR_TSTMP_EN_OFFSET 0x02
#define WLANDXE_DMA_CSR_TSTMP_EN_DEFAULT 0x0
#define WLANDXE_DMA_CCU_DXE_RESET_MASK 0x4
#else
#define WLANDXE_DMA_CSR_RESERVED_MASK 0xFFFE0000
#define WLANDXE_DMA_CSR_RESERVED_OFFSET 0x11
#define WLANDXE_DMA_CSR_RESERVED_DEFAULT 0x0
#define WLANDXE_DMA_CSR_H2H_SYNC_EN_MASK 0x10000
#define WLANDXE_DMA_CSR_H2H_SYNC_EN_OFFSET 0x10
#define WLANDXE_DMA_CSR_H2H_SYNC_EN_DEFAULT 0x0
#define WLANDXE_DMA_CSR_PAUSED_MASK 0x8000
#define WLANDXE_DMA_CSR_PAUSED_OFFSET 0xF
#define WLANDXE_DMA_CSR_PAUSED_DEFAULT 0x0
#define WLANDXE_DMA_CSR_ECTR_EN_MASK 0x4000
#define WLANDXE_DMA_CSR_ECTR_EN_OFFSET 0xE
#define WLANDXE_DMA_CSR_ECTR_EN_DEFAULT 0x4000
#define WLANDXE_DMA_CSR_B2H_TSTMP_OFF_MASK 0x3E00
#define WLANDXE_DMA_CSR_B2H_TSTMP_OFF_OFFSET 0x9
#define WLANDXE_DMA_CSR_B2H_TSTMP_OFF_DEFAULT 0xE00
#define WLANDXE_DMA_CSR_H2B_TSTMP_OFF_MASK 0x1F0
#define WLANDXE_DMA_CSR_H2B_TSTMP_OFF_OFFSET 0x4
#define WLANDXE_DMA_CSR_H2B_TSTMP_OFF_DEFAULT 0x50
#define WLANDXE_DMA_CSR_TSTMP_EN_MASK 0x8
#define WLANDXE_DMA_CSR_TSTMP_EN_OFFSET 0x3
#define WLANDXE_DMA_CSR_TSTMP_EN_DEFAULT 0x0
#define WLANDXE_DMA_CSR_RESET_MASK 0x4
#define WLANDXE_DMA_CSR_RESET_OFFSET 0x2
#define WLANDXE_DMA_CSR_RESET_DEFAULT 0x0
#endif /* WCN_PRONTO */
#define WLANDXE_DMA_CSR_PAUSE_MASK 0x2
#define WLANDXE_DMA_CSR_PAUSE_OFFSET 0x1
#define WLANDXE_DMA_CSR_PAUSE_DEFAULT 0x0
#define WLANDXE_DMA_CSR_EN_MASK 0x1
#define WLANDXE_DMA_CSR_EN_OFFSET 0x0
#define WLANDXE_DMA_CSR_EN_DEFAULT 0x0
/* DXE CSR Master enable register value */
#define WLANDXE_CSR_DEFAULT_ENABLE (WLANDXE_DMA_CSR_H2H_SYNC_EN_MASK | \
WLANDXE_DMA_CSR_ECTR_EN_MASK | \
WLANDXE_DMA_CSR_EN_MASK)
/* Channel CTRL Register Control mask and offset */
#define WLANDXE_CH_CTRL_RSVD_MASK 0x80000000
#define WLANDXE_CH_CTRL_RSVD_OFFSET 0x1F
#define WLANDXE_CH_CTRL_RSVD_DEFAULT 0x0
#define WLANDXE_CH_CTRL_SWAP_MASK 0x80000000
#define WLANDXE_CH_CTRL_BDT_IDX_MASK 0x60000000
#define WLANDXE_CH_CTRL_BDT_IDX_OFFSET 0x1D
#define WLANDXE_CH_CTRL_BDT_IDX_DEFAULT 0x0
#define WLANDXE_CH_CTRL_DFMT_MASK 0x10000000
#define WLANDXE_CH_CTRL_DFMT_OFFSET 0x1C
#define WLANDXE_CH_CTRL_DFMT_DEFAULT 0x10000000
#define WLANDXE_CH_CTRL_DFMT_ESHORT 0x0
#define WLANDXE_CH_CTRL_DFMT_ELONG 0x1
#define WLANDXE_CH_CTRL_ABORT_MASK 0x8000000
#define WLANDXE_CH_CTRL_ABORT_OFFSET 0x1B
#define WLANDXE_CH_CTRL_ABORT_DEFAULT 0x0
#define WLANDXE_CH_CTRL_ENDIAN_MASK 0x4000000
#define WLANDXE_CH_CTRL_CTR_SEL_MASK 0x3C00000
#define WLANDXE_CH_CTRL_CTR_SEL_OFFSET 0x16
#define WLANDXE_CH_CTRL_CTR_SEL_DEFAULT 0x0
#define WLANDXE_CH_CTRL_EDVEN_MASK 0x200000
#define WLANDXE_CH_CTRL_EDVEN_OFFSET 0x15
#define WLANDXE_CH_CTRL_EDVEN_DEFAULT 0x0
#define WLANDXE_CH_CTRL_EDEN_MASK 0x100000
#define WLANDXE_CH_CTRL_EDEN_OFFSET 0x14
#define WLANDXE_CH_CTRL_EDEN_DEFAULT 0x0
#define WLANDXE_CH_CTRL_INE_DONE_MASK 0x80000
#define WLANDXE_CH_CTRL_INE_DONE_OFFSET 0x13
#define WLANDXE_CH_CTRL_INE_DONE_DEFAULT 0x0
#define WLANDXE_CH_CTRL_INE_ERR_MASK 0x40000
#define WLANDXE_CH_CTRL_INE_ERR_OFFSET 0x12
#define WLANDXE_CH_CTRL_INE_ERR_DEFAULT 0x0
#define WLANDXE_CH_CTRL_INE_ED_MASK 0x20000
#define WLANDXE_CH_CTRL_INE_ED_OFFSET 0x11
#define WLANDXE_CH_CTRL_INE_ED_DEFAULT 0x0
#define WLANDXE_CH_CTRL_STOP_MASK 0x10000
#define WLANDXE_CH_CTRL_STOP_OFFSET 0x10
#define WLANDXE_CH_CTRL_STOP_DEFAULT 0x0
#define WLANDXE_CH_CTRL_PRIO_MASK 0xE000
#define WLANDXE_CH_CTRL_PRIO_OFFSET 0xD
#define WLANDXE_CH_CTRL_PRIO_DEFAULT 0x0
#define WLANDXE_CH_CTRL_BTHLD_SEL_MASK 0x1E00
#define WLANDXE_CH_CTRL_BTHLD_SEL_OFFSET 0x9
#define WLANDXE_CH_CTRL_BTHLD_SEL_DEFAULT 0x600
#define WLANDXE_CH_CTRL_BTHLD_SEL_ERSVD0 0x0
#define WLANDXE_CH_CTRL_BTHLD_SEL_ERSVD1 0x1
#define WLANDXE_CH_CTRL_BTHLD_SEL_ETHLD2 0x2
#define WLANDXE_CH_CTRL_BTHLD_SEL_ETHLD3 0x3
#define WLANDXE_CH_CTRL_BTHLD_SEL_ETHLD4 0x4
#define WLANDXE_CH_CTRL_BTHLD_SEL_ETHLD5 0x5
#define WLANDXE_CH_CTRL_BTHLD_SEL_ETHLD6 0x6
#define WLANDXE_CH_CTRL_BTHLD_SEL_ETHLD7 0x7
#define WLANDXE_CH_CTRL_BTHLD_SEL_ETHLD8 0x8
#define WLANDXE_CH_CTRL_BTHLD_SEL_ETHLD9 0x9
#define WLANDXE_CH_CTRL_BTHLD_SEL_ETHLD10 0xA
#define WLANDXE_CH_CTRL_BTHLD_SEL_ERSVD11 0xB
#define WLANDXE_CH_CTRL_BTHLD_SEL_ERSVD12 0xC
#define WLANDXE_CH_CTRL_BTHLD_SEL_ERSVD13 0xD
#define WLANDXE_CH_CTRL_BTHLD_SEL_ERSVD14 0xE
#define WLANDXE_CH_CTRL_BTHLD_SEL_ERSVD15 0xF
#define WLANDXE_CH_CTRL_PDU_REL_MASK 0x100
#define WLANDXE_CH_CTRL_PDU_REL_OFFSET 0x8
#define WLANDXE_CH_CTRL_PDU_REL_DEFAULT 0x100
#define WLANDXE_CH_CTRL_PDU_REL_EKEEP 0x0
#define WLANDXE_CH_CTRL_PDU_REL_ERELEASE 0x1
#define WLANDXE_CH_CTRL_PIQ_MASK 0x80
#define WLANDXE_CH_CTRL_PIQ_OFFSET 0x7
#define WLANDXE_CH_CTRL_PIQ_DEFAULT 0x0
#define WLANDXE_CH_CTRL_PIQ_EFLAT 0x0
#define WLANDXE_CH_CTRL_PIQ_EQUEUE 0x1
#define WLANDXE_CH_CTRL_DIQ_MASK 0x40
#define WLANDXE_CH_CTRL_DIQ_OFFSET 0x6
#define WLANDXE_CH_CTRL_DIQ_DEFAULT 0x0
#define WLANDXE_CH_CTRL_DIQ_EFLAT 0x0
#define WLANDXE_CH_CTRL_DIQ_EQUEUE 0x1
#define WLANDXE_CH_CTRL_SIQ_MASK 0x20
#define WLANDXE_CH_CTRL_SIQ_OFFSET 0x5
#define WLANDXE_CH_CTRL_SIQ_DEFAULT 0x0
#define WLANDXE_CH_CTRL_SIQ_EFLAT 0x0
#define WLANDXE_CH_CTRL_SIQ_EQUEUE 0x1
#define WLANDXE_CH_CTRL_BDH_MASK 0x10
#define WLANDXE_CH_CTRL_BDH_OFFSET 0x4
#define WLANDXE_CH_CTRL_BDH_DEFAULT 0x0
#define WLANDXE_CH_CTRL_EOP_MASK 0x8
#define WLANDXE_CH_CTRL_EOP_OFFSET 0x3
#define WLANDXE_CH_CTRL_EOP_DEFAULT 0x8
#define WLANDXE_CH_CTRL_XTYPE_MASK 0x6
#define WLANDXE_CH_CTRL_XTYPE_OFFSET 0x1
#define WLANDXE_CH_CTRL_XTYPE_DEFAULT 0x0
#define WLANDXE_CH_CTRL_XTYPE_EH2H 0x0
#define WLANDXE_CH_CTRL_XTYPE_EB2B 0x1
#define WLANDXE_CH_CTRL_XTYPE_EH2B 0x2
#define WLANDXE_CH_CTRL_XTYPE_EB2H 0x3
#define WLANDXE_CH_CTRL_DONE_MASK 0x4
#define WLANDXE_CH_CTRL_ERR_MASK 0x20
#define WLANDXE_CH_CTRL_MASKED_MASK 0x8
#define WLANDXE_CH_CTRL_EN_MASK 0x1
#define WLANDXE_CH_CTRL_EN_OFFSET 0x0
#define WLANDXE_CH_CTRL_EN_DEFAULT 0x0
#define WLANDXE_CH_CTRL_DEFAULT 0x10000708
#define WLANDXE_DESC_CTRL_VALID 0x00000001
#define WLANDXE_DESC_CTRL_XTYPE_MASK 0x00000006
#define WLANDXE_DESC_CTRL_XTYPE_H2H 0x00000000
#define WLANDXE_DESC_CTRL_XTYPE_B2B 0x00000002
#define WLANDXE_DESC_CTRL_XTYPE_H2B 0x00000004
#define WLANDXE_DESC_CTRL_XTYPE_B2H 0x00000006
#define WLANDXE_DESC_CTRL_EOP 0x00000008
#define WLANDXE_DESC_CTRL_BDH 0x00000010
#define WLANDXE_DESC_CTRL_SIQ 0x00000020
#define WLANDXE_DESC_CTRL_DIQ 0x00000040
#define WLANDXE_DESC_CTRL_PIQ 0x00000080
#define WLANDXE_DESC_CTRL_PDU_REL 0x00000100
#define WLANDXE_DESC_CTRL_BTHLD_SEL 0x00001E00
#define WLANDXE_DESC_CTRL_PRIO 0x0000E000
#define WLANDXE_DESC_CTRL_STOP 0x00010000
#define WLANDXE_DESC_CTRL_INT 0x00020000
#define WLANDXE_DESC_CTRL_BDT_SWAP 0x00100000
#define WLANDXE_DESC_CTRL_ENDIANNESS 0x00200000
#define WLANDXE_DESC_CTRL_DFMT 0x10000000
#define WLANDXE_DESC_CTRL_RSVD 0xfffc0000
/* CSR Register Control mask and offset */
#define WLANDXE_CH_STAT_INT_DONE_MASK 0x00008000
#define WLANDXE_CH_STAT_INT_ERR_MASK 0x00004000
#define WLANDXE_CH_STAT_INT_ED_MASK 0x00002000
#define WLANDXE_CH_STAT_ERR_CODE_MASK 0x000007c0
#define WLANDXE_CH_STAT_ERR_CODE_OFFSET (6)
#define WLANDXE_CH_STAT_MASKED_MASK 0x00000008
#define WLANDXE_CH_STAT_ENABLED_MASK 0x00000001
/* Till here WCNSS DXE register information
* This is temporary definition location to make compile and unit test
* If official msmreg.h integrated, this part will be eliminated */
/* Interrupt control channel mask */
#define WLANDXE_INT_MASK_CHAN_0 0x00000001
#define WLANDXE_INT_MASK_CHAN_1 0x00000002
#define WLANDXE_INT_MASK_CHAN_2 0x00000004
#define WLANDXE_INT_MASK_CHAN_3 0x00000008
#define WLANDXE_INT_MASK_CHAN_4 0x00000010
#define WLANDXE_INT_MASK_CHAN_5 0x00000020
#define WLANDXE_INT_MASK_CHAN_6 0x00000040
#define WLANDXE_INT_MASK_CHAN_7 0x00000080
#define WLANDXE_TX_LOW_RES_THRESHOLD (5)
typedef enum {
WLANDXE_ERROR_NONE = 0,
WLANDXE_ERROR_SAHB_ERR = 1,
WLANDXE_ERROR_H2H_RD_BUS_ERR = 2,
WLANDXE_ERROR_H2H_WR_BUS_ERR = 3,
WLANDXE_ERROR_PRG_INV_XTYPE = 4,
WLANDXE_ERROR_BERR_POPWQ = 5,
WLANDXE_ERROR_BERR_PUSHWQ = 6,
WLANDXE_ERROR_BERR_RLSS = 7,
WLANDXE_ERROR_BERR_GETPDU = 8,
WLANDXE_ERROR_PRG_INV_WQ = 9,
WLANDXE_ERROR_PRG_INV_H2H_SRC_QID = 10,
WLANDXE_ERROR_PRG_INV_H2H_DST_QID = 11,
WLANDXE_ERROR_PRG_INV_B2H_SRC_QID = 12,
WLANDXE_ERROR_PRG_INV_B2H_DST_QID = 13,
WLANDXE_ERROR_PRG_INV_B2H_SRC_IDX = 14,
WLANDXE_ERROR_PRG_INV_H2B_SRC_QID = 15,
WLANDXE_ERROR_PRG_INV_H2B_DST_QID = 16,
WLANDXE_ERROR_PRG_INV_H2B_DST_IDX = 17,
WLANDXE_ERROR_PRG_INV_H2B_SZ = 18,
WLANDXE_ERROR_PRG_INV_SADR = 19,
WLANDXE_ERROR_PRG_INV_DADR = 20,
WLANDXE_ERROR_PRG_INV_EDADR = 21,
WLANDXE_ERROR_PRG_INV_SRC_WQID = 22,
WLANDXE_ERROR_PRG_INV_DST_WQID = 23,
WLANDXE_ERROR_PRG_XTYPE_MSMTCH = 24,
WLANDXE_ERROR_PKT_ERR = 25,
WLANDXE_ERROR_ABORT = 26,
WLANDXE_ERROR_PDU_CNT_OVFL = 27,
}WLANDXE_ErrorCode;
/* DXE Descriptor Endian swap macro */
#ifdef WLANDXE_ENDIAN_SWAP_ENABLE
#define WLANDXE_U32_SWAP_ENDIAN(a) (((a & 0x000000FF) << 24) | \
((a & 0x0000FF00) << 8) | \
((a & 0x00FF0000) >> 8) | \
((a & 0xFF000000) >> 24))
#else
/* If DXE HW does not need endian swap, DO NOTHING */
#define WLANDXE_U32_SWAP_ENDIAN(a) (a)
#endif /* WLANDXE_ENDIAN_SWAP_ENABLE */
/* Log Definition will be mappped with PAL MSG */
#define HDXE_MSG WPAL_TRACE
#define HDXE_ASSERT(a) VOS_ASSERT(a)
#define WLANDXE_PRONTO_TX_WQ 0x6
/*----------------------------------------------------------------------------
* Type Declarations
* -------------------------------------------------------------------------*/
/* DMA Channel Q handle Method type
* Linear handle or circular */
typedef enum
{
WLANDXE_CHANNEL_HANDLE_LINEAR,
WLANDXE_CHANNEL_HANDLE_CIRCULA
}WLANDXE_ChannelHandleType;
typedef enum
{
WLANDXE_TX_COMP_INT_LR_THRESHOLD,
WLANDXE_TX_COMP_INT_PER_K_FRAMES,
WLANDXE_TX_COMP_INT_TIMER
} WLANDXE_TXCompIntEnableType;
typedef enum
{
WLANDXE_SHORT_DESCRIPTOR,
WLANDXE_LONG_DESCRIPTOR
} WLANDXE_DescriptorType;
typedef enum
{
WLANDXE_DMA_CHANNEL_0,
WLANDXE_DMA_CHANNEL_1,
WLANDXE_DMA_CHANNEL_2,
WLANDXE_DMA_CHANNEL_3,
WLANDXE_DMA_CHANNEL_4,
WLANDXE_DMA_CHANNEL_5,
WLANDXE_DMA_CHANNEL_6,
WLANDXE_DMA_CHANNEL_7,
WLANDXE_DMA_CHANNEL_MAX
} WLANDXE_DMAChannelType;
enum
{
TRACE_CH_ENABLE,
TRACE_POWER_STATE,
TRACE_RXINT_STATE,
TRACE_TXINT_STATE,
TRACE_SMSM_NOTIFY
};
/** DXE HW Long Descriptor format */
typedef struct
{
wpt_uint32 srcMemAddrL;
wpt_uint32 srcMemAddrH;
wpt_uint32 dstMemAddrL;
wpt_uint32 dstMemAddrH;
wpt_uint32 phyNextL;
wpt_uint32 phyNextH;
} WLANDXE_LongDesc;
/** DXE HW Short Descriptor format */
typedef struct tDXEShortDesc
{
wpt_uint32 srcMemAddrL;
wpt_uint32 dstMemAddrL;
wpt_uint32 phyNextL;
} WLANDXE_ShortDesc;
/* DXE Descriptor Data Type
* Pick up from GEN5 */
typedef struct
{
union
{
wpt_uint32 ctrl;
wpt_uint32 valid :1; //0 = DMA stop, 1 = DMA continue with this descriptor
wpt_uint32 transferType :2; //0 = Host to Host space
wpt_uint32 eop :1; //End of Packet
wpt_uint32 bdHandling :1; //if transferType = Host to BMU, then 0 means first 128 bytes contain BD, and 1 means create new empty BD
wpt_uint32 siq :1; // SIQ
wpt_uint32 diq :1; // DIQ
wpt_uint32 pduRel :1; //0 = don't release BD and PDUs when done, 1 = release them
wpt_uint32 bthldSel :4; //BMU Threshold Select
wpt_uint32 prio :3; //Specifies the priority level to use for the transfer
wpt_uint32 stopChannel :1; //1 = DMA stops processing further, channel requires re-enabling after this
wpt_uint32 intr :1; //Interrupt on Descriptor Done
wpt_uint32 rsvd :1; //reserved
wpt_uint32 transferSize :14; //14 bits used - ignored for BMU transfers, only used for host to host transfers?
} descCtrl;
wpt_uint32 xfrSize;
union
{
WLANDXE_LongDesc dxe_long_desc;
WLANDXE_ShortDesc dxe_short_desc;
}dxedesc;
} WLANDXE_DescType;
typedef struct
{
void *nextCtrlBlk;
wpt_packet *xfrFrame;
WLANDXE_DescType *linkedDesc;
wpt_uint32 linkedDescPhyAddr;
wpt_uint32 ctrlBlkOrder;
} WLANDXE_DescCtrlBlkType;
typedef struct
{
/* Q handle method, linear or ring */
WLANDXE_ChannelHandleType queueMethod;
/* Number of descriptors for DXE that can be queued for transfer at one time */
wpt_uint32 nDescs;
/* Maximum number of receive buffers of shared memory to use for this pipe */
wpt_uint32 nRxBuffers;
/* Reference WQ - for H2B and B2H only */
wpt_uint32 refWQ;
/* for usb only, endpoint info for CH_SADR or CH_DADR */
wpt_uint32 refEP;
/* H2B(Tx), B2H(Rx), H2H(SRAM<->HostMem R/W) */
wpt_uint32 xfrType;
/* Channel Priority 7(Highest) - 0(Lowest) */
wpt_uint32 chPriority;
/* 1 = BD attached to frames for this pipe */
wpt_boolean bdPresent;
wpt_uint32 chk_size;
wpt_uint32 bmuThdSel;
/* Added in Gen5 for Prefetch */
wpt_boolean useLower4G;
wpt_boolean useShortDescFmt;
/* Till here inharited from GEN5 code */
/* From now on, added for PRIMA */
} WLANDXE_ChannelConfigType;
typedef struct
{
wpt_uint32 chDXEBaseAddr;
wpt_uint32 chDXEStatusRegAddr;
wpt_uint32 chDXEDesclRegAddr;
wpt_uint32 chDXEDeschRegAddr;
wpt_uint32 chDXELstDesclRegAddr;
wpt_uint32 chDXECtrlRegAddr;
wpt_uint32 chDXESzRegAddr;
wpt_uint32 chDXEDadrlRegAddr;
wpt_uint32 chDXEDadrhRegAddr;
wpt_uint32 chDXESadrlRegAddr;
wpt_uint32 chDXESadrhRegAddr;
} WLANDXE_ChannelRegisterType;
typedef struct
{
wpt_uint32 refWQ_swapped;
wpt_boolean chEnabled;
wpt_boolean chConfigured;
wpt_uint32 channel;
wpt_uint32 chk_size_mask;
wpt_uint32 bmuThdSel_mask;
wpt_uint32 cw_ctrl_read;
wpt_uint32 cw_ctrl_write;
wpt_uint32 cw_ctrl_write_valid;
wpt_uint32 cw_ctrl_write_eop;
wpt_uint32 cw_ctrl_write_eop_int;
wpt_uint32 chan_mask;
wpt_uint32 chan_mask_read_disable;
wpt_uint32 intMask;
} WLANDXE_ChannelExConfigType;
typedef struct
{
WDTS_ChannelType channelType;
WLANDXE_DescCtrlBlkType *headCtrlBlk;
WLANDXE_DescCtrlBlkType *tailCtrlBlk;
WLANDXE_DescType *descriptorAllocation;
WLANDXE_DescType *DescBottomLoc;
wpt_uint32 descBottomLocPhyAddr;
wpt_uint32 numDesc;
wpt_uint32 numFreeDesc;
wpt_uint32 numRsvdDesc;
wpt_uint32 desc_write_fail_count;
wpt_uint32 maxFrameSize;
wpt_uint32 numFragmentCurrentChain;
wpt_uint32 numFrameBeforeInt;
wpt_uint32 numTotalFrame;
wpt_uint32 doneIntDisabled;
wpt_mutex dxeChannelLock;
wpt_boolean hitLowResource;
WLANDXE_ChannelConfigType channelConfig;
WLANDXE_ChannelRegisterType channelRegister;
WLANDXE_ChannelExConfigType extraConfig;
WLANDXE_DMAChannelType assignedDMAChannel;
wpt_uint64 rxDoneHistogram;
} WLANDXE_ChannelCBType;
typedef struct
{
WLANDXE_TXCompIntEnableType txIntEnable;
unsigned int txLowResourceThreshold_LoPriCh;
unsigned int txLowResourceThreshold_HiPriCh;
unsigned int rxLowResourceThreshold;
unsigned int txInterruptEnableFrameCount;
unsigned int txInterruptEnablePeriod;
} WLANDXE_TxCompIntConfigType;
typedef struct
{
WLANDXE_ChannelCBType dxeChannel[WDTS_CHANNEL_MAX];
WLANDXE_RxFrameReadyCbType rxReadyCB;
WLANDXE_TxCompleteCbType txCompCB;
WLANDXE_LowResourceCbType lowResourceCB;
WLANDXE_MbReceiveMsgCbType receiveMbMsgCB;
WLANDXE_RxLogDoneType receiveLogCompleteCB;
WLANDXE_TxCompIntConfigType txCompInt;
void *clientCtxt;
wpt_uint32 interruptPath;
wpt_msg *rxIsrMsg;
wpt_msg *txIsrMsg;
wpt_msg *rxPktAvailMsg;
volatile WLANDXE_PowerStateType hostPowerState;
wpt_boolean rxIntDisabledByIMPS;
wpt_boolean txIntDisabledByIMPS;
WLANDXE_SetPowerStateCbType setPowerStateCb;
volatile WLANDXE_RivaPowerStateType rivaPowerState;
wpt_boolean ringNotEmpty;
wpt_boolean txIntEnable;
wpt_uint32 txCompletedFrames;
wpt_uint8 ucTxMsgCnt;
wpt_uint16 lastKickOffDxe;
wpt_uint32 smsmRingsEmptyHistogram;
wpt_uint32 smsmDxeHistogram;
wpt_uint32 dxeCookie;
wpt_packet *freeRXPacket;
wpt_boolean rxPalPacketUnavailable;
wpt_boolean driverReloadInProcessing;
wpt_boolean smsmToggled;
wpt_boolean txRingsEmpty;
wpt_boolean hostInitiatedH2H;
#ifdef WLAN_DXE_LOW_RESOURCE_TIMER
wpt_timer rxResourceAvailableTimer;
#endif
wpt_timer dxeSSRTimer;
} WLANDXE_CtrlBlkType;
typedef struct
{
u64 *rxIntDisableReturn;
u64 *rxIntDisableFrame;
wpt_uint8 rxIntChanlSrc;
wpt_uint8 txCmpIntChanlSrc;
wpt_uint8 rx_low_resource_timer;
wpt_uint8 dxe_prev_ps;
wpt_uint8 rx_imps_set_fp;
} WLANDXE_EnvInformation;
typedef struct
{
/* Records are stored in ring buffer */
v_U32_t head;
v_U32_t tail;
v_U32_t num;
/* Config for controlling the trace */
v_U8_t enable;
}dxeTraceData;
typedef struct
{
v_U32_t time;
v_U8_t chan;
v_U8_t code;
v_U32_t data;
}dxeTraceRecord, *pdxeTraceRecord;
/*==========================================================================
@ Function Name
dxeCommonDefaultConfig
@ Description
@ Parameters
WLANDXE_CtrlBlkType *dxeCtrlBlk,
DXE host driver main control block
@ Return
void
===========================================================================*/
extern void dxeCommonDefaultConfig
(
WLANDXE_CtrlBlkType *dxeCtrlBlk
);
/*==========================================================================
@ Function Name
dxeChannelDefaultConfig
@ Description
Get defualt configuration values from pre defined structure
All the channels must have it's own configurations
@ Parameters
WLANDXE_CtrlBlkType *dxeCtrlBlk,
DXE host driver main control block
WLANDXE_ChannelCBType *channelEntry
Channel specific control block
@ Return
wpt_status
===========================================================================*/
extern wpt_status dxeChannelDefaultConfig
(
WLANDXE_CtrlBlkType *dxeCtrlBlk,
WLANDXE_ChannelCBType *channelEntry
);
void dxeSetEnabledChannels
(
wpt_uint8 enabledChannels
);
wpt_uint8 dxeGetEnabledChannels
(
void
);
#endif /* WLAN_QCT_DXE_I_H */