| /****************************************************************************** |
| * |
| * This file is provided under a dual license. When you use or |
| * distribute this software, you may choose to be licensed under |
| * version 2 of the GNU General Public License ("GPLv2 License") |
| * or BSD License. |
| * |
| * GPLv2 License |
| * |
| * Copyright(C) 2016 MediaTek Inc. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of version 2 of the GNU General Public License as |
| * published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope that it will be useful, but |
| * WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| * See http://www.gnu.org/licenses/gpl-2.0.html for more details. |
| * |
| * BSD LICENSE |
| * |
| * Copyright(C) 2016 MediaTek Inc. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * |
| * * Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * * Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in |
| * the documentation and/or other materials provided with the |
| * distribution. |
| * * Neither the name of the copyright holder nor the names of its |
| * contributors may be used to endorse or promote products derived |
| * from this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| * |
| *****************************************************************************/ |
| /* |
| *************************************************************************** |
| * MediaTek Inc. |
| * |
| * All rights reserved. source code is an unpublished work and the |
| * use of a copyright notice does not imply otherwise. This source code |
| * contains confidential trade secret material of MediaTek. Any attemp |
| * or participation in deciphering, decoding, reverse engineering or in any |
| * way altering the source code is stricitly prohibited, unless the prior |
| * written consent of MediaTek, Inc. is obtained. |
| *************************************************************************** |
| |
| Module Name: |
| hif_pci.h |
| */ |
| |
| #ifndef __HIF_PCI_H__ |
| #define __HIF_PCI_H__ |
| |
| #define NUM_OF_TX_RING 4 |
| #define NUM_OF_RX_RING 2 |
| |
| #define TX_DMA_1ST_BUFFER_SIZE 128 /* only the 1st physical buffer is pre-allocated */ |
| |
| #define TX_RING_SIZE 4095 |
| #define RX_RING_SIZE 256 /* Max Rx ring size */ |
| |
| #define RX_RING0_SIZE 256 /* Data Rx ring */ |
| #define RX_RING1_SIZE 16 /* Event/MSDU_report Rx ring */ |
| |
| #define TXD_SIZE 16 /* TXD_SIZE = TxD + TxInfo */ |
| #define RXD_SIZE 16 |
| |
| #define RX_BUFFER_AGGRESIZE 3840 |
| #define RX_BUFFER_NORMSIZE 3840 |
| #define TX_BUFFER_NORMSIZE 3840 |
| |
| #define INC_RING_INDEX(_idx, _RingSize) \ |
| { \ |
| (_idx) = (_idx+1) % (_RingSize); \ |
| } |
| |
| #define RTMP_IO_READ32(_A, _R, _pV) \ |
| { \ |
| (*(_pV) = readl((void *)((_A)->CSRBaseAddress + (_R)))); \ |
| } |
| |
| #define RTMP_IO_WRITE32(_A, _R, _V) \ |
| { \ |
| writel(_V, (void *)((_A)->CSRBaseAddress + (_R))); \ |
| } |
| |
| #define MAX_PCIE_BUS_STATIC_MAP_ADDR 0x00040000 |
| |
| #define MT_RINGREG_DIFF 0x10 |
| |
| #define MT_TX_RING_BASE WPDMA_TX_RING0_CTRL0 |
| #define MT_TX_RING_PTR WPDMA_TX_RING0_CTRL0 |
| #define MT_TX_RING_CNT WPDMA_TX_RING0_CTRL1 |
| #define MT_TX_RING_CIDX WPDMA_TX_RING0_CTRL2 |
| #define MT_TX_RING_DIDX WPDMA_TX_RING0_CTRL3 |
| |
| #define MT_RX_RING_BASE WPDMA_RX_RING0_CTRL0 |
| #define MT_RX_RING_PTR WPDMA_RX_RING0_CTRL0 |
| #define MT_RX_RING_CNT WPDMA_RX_RING0_CTRL1 |
| #define MT_RX_RING_CIDX WPDMA_RX_RING0_CTRL2 |
| #define MT_RX_RING_DIDX WPDMA_RX_RING0_CTRL3 |
| |
| typedef enum _ENUM_TX_RING_IDX_T { |
| TX_RING_DATA0_IDX_0 = 0, |
| TX_RING_DATA1_IDX_1, |
| TX_RING_CMD_IDX_2, |
| TX_RING_FWDL_IDX_3, |
| } ENUM_TX_RING_IDX__T; |
| |
| typedef enum _ENUM_RX_RING_IDX_T { |
| RX_RING_DATA_IDX_0 = 0, |
| RX_RING_EVT_IDX_1 |
| } ENUM_RX_RING_IDX_T; |
| |
| /* ============================================================================ |
| * PCI/RBUS TX / RX Frame Descriptors format |
| * |
| * Memory Layout |
| * |
| * 1. Tx Descriptor |
| * TxD (12 bytes) + TXINFO (4 bytes) |
| * 2. Packet Buffer |
| * TXWI + 802.11 |
| * 31 0 |
| * +--------------------------------------------------------------------------+ |
| * | SDP0[31:0] | |
| * +-+--+---------------------+-+--+------------------------------------------+ |
| * |D |L0| SDL0[13:0] |B|L1| SDL1[13:0] | |
| * +-+--+---------------------+-+--+------------------------------------------+ |
| * | SDP1[31:0] | |
| * +--------------------------------------------------------------------------+ |
| * | TXINFO | |
| * +--------------------------------------------------------------------------+ |
| * ========================================================================= |
| */ |
| /* |
| * TX descriptor format for Tx Data/Mgmt Rings |
| */ |
| typedef struct _TXD_STRUCT { |
| /* Word 0 */ |
| UINT_32 SDPtr0; |
| |
| /* Word 1 */ |
| UINT_32 SDLen1:14; |
| UINT_32 LastSec1:1; |
| UINT_32 Burst:1; |
| UINT_32 SDLen0:14; |
| UINT_32 LastSec0:1; |
| UINT_32 DMADONE:1; |
| /*Word2 */ |
| UINT_32 SDPtr1; |
| } TXD_STRUCT; |
| |
| /* |
| * Rx descriptor format for Rx Rings |
| */ |
| typedef struct _RXD_STRUCT { |
| /* Word 0 */ |
| UINT_32 SDP0; |
| |
| /* Word 1 */ |
| UINT_32 SDL1:14; |
| UINT_32 LS1:1; |
| UINT_32 BURST:1; |
| UINT_32 SDL0:14; |
| UINT_32 LS0:1; |
| UINT_32 DDONE:1; |
| |
| /* Word 2 */ |
| UINT_32 SDP1; |
| } RXD_STRUCT; |
| |
| /* |
| * Data buffer for DMA operation, the buffer must be contiguous physical memory |
| * Both DMA to / from CPU use the same structure. |
| */ |
| typedef struct _RTMP_DMABUF { |
| ULONG AllocSize; |
| PVOID AllocVa; /* TxBuf virtual address */ |
| dma_addr_t AllocPa; /* TxBuf physical address */ |
| } RTMP_DMABUF, *PRTMP_DMABUF; |
| |
| /* |
| * Control block (Descriptor) for all ring descriptor DMA operation, buffer must be |
| * contiguous physical memory. NDIS_PACKET stored the binding Rx packet descriptor |
| * which won't be released, driver has to wait until upper layer return the packet |
| * before giveing up this rx ring descriptor to ASIC. NDIS_BUFFER is assocaited pair |
| * to describe the packet buffer. For Tx, NDIS_PACKET stored the tx packet descriptor |
| * which driver should ACK upper layer when the tx is physically done or failed. |
| */ |
| typedef struct _RTMP_DMACB { |
| ULONG AllocSize; /* Control block size */ |
| PVOID AllocVa; /* Control block virtual address */ |
| dma_addr_t AllocPa; /* Control block physical address */ |
| PVOID pPacket; |
| PVOID pBuffer; |
| dma_addr_t PacketPa; |
| RTMP_DMABUF DmaBuf; /* Associated DMA buffer structure */ |
| } RTMP_DMACB, *PRTMP_DMACB; |
| |
| typedef struct _RTMP_TX_RING { |
| RTMP_DMACB Cell[TX_RING_SIZE]; |
| UINT_32 TxCpuIdx; |
| UINT_32 TxDmaIdx; |
| UINT_32 TxSwUsedIdx; |
| UINT_32 u4UsedCnt; |
| UINT_32 hw_desc_base; |
| UINT_32 hw_cidx_addr; |
| UINT_32 hw_didx_addr; |
| UINT_32 hw_cnt_addr; |
| } RTMP_TX_RING, *P_RTMP_TX_RING; |
| |
| typedef struct _RTMP_RX_RING { |
| RTMP_DMACB Cell[RX_RING_SIZE]; |
| UINT_32 RxCpuIdx; |
| UINT_32 RxDmaIdx; |
| INT_32 RxSwReadIdx; /* software next read index */ |
| UINT_32 u4BufSize; |
| UINT_32 u4RingSize; |
| BOOLEAN fgRxSegPkt; |
| |
| UINT_32 hw_desc_base; |
| UINT_32 hw_cidx_addr; |
| UINT_32 hw_didx_addr; |
| UINT_32 hw_cnt_addr; |
| } RTMP_RX_RING, *P_RTMP_RX_RING; |
| |
| typedef struct _PCIE_CHIP_CR_MAPPING { |
| UINT_32 u4ChipAddr; |
| UINT_32 u4BusAddr; |
| UINT_32 u4Range; |
| } PCIE_CHIP_CR_MAPPING, *P_PCIE_CHIP_CR_MAPPING; |
| |
| |
| #endif /* HIF_PCI_H__ */ |