477 lines
18 KiB
C
477 lines
18 KiB
C
/*-
|
|
* Copyright (c) 2003
|
|
* Fraunhofer Institute for Open Communication Systems (FhG Fokus).
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. 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.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
|
|
*
|
|
* Author: Hartmut Brandt <harti@freebsd.org>
|
|
*
|
|
* $FreeBSD$
|
|
*
|
|
* Register definitions for the IDT77252 chip.
|
|
*/
|
|
|
|
#define PCI_VENDOR_IDT 0x111D
|
|
#define PCI_DEVICE_IDT77252 3
|
|
#define PCI_DEVICE_IDT77v252 4
|
|
#define PCI_DEVICE_IDT77v222 5
|
|
|
|
#define IDT_PCI_REG_MEMBASE 0x14
|
|
|
|
#define IDT_NOR_D0 0x00 /* R/W Data register 0 */
|
|
#define IDT_NOR_D1 0x04 /* R/W Data register 1 */
|
|
#define IDT_NOR_D2 0x08 /* R/W Data register 2 */
|
|
#define IDT_NOR_D3 0x0C /* R/W Data register 3 */
|
|
#define IDT_NOR_CMD 0x10 /* R/W Command */
|
|
#define IDT_NOR_CFG 0x14 /* R/W Configuration */
|
|
#define IDT_NOR_STAT 0x18 /* R/W Status */
|
|
#define IDT_NOR_RSQB 0x1C /* R/W Receive status queue base */
|
|
#define IDT_NOR_RSQT 0x20 /* R Receive status queue tail */
|
|
#define IDT_NOR_RSQH 0x24 /* R/W Receive status queue tail */
|
|
#define IDT_NOR_CDC 0x28 /* R/W Cell drop counter */
|
|
#define IDT_NOR_VPEC 0x2C /* R/W VPI/VCI Lookup error counter */
|
|
#define IDT_NOR_ICC 0x30 /* R/W Invalid cell counter */
|
|
#define IDT_NOR_RAWCT 0x34 /* R Raw cell tail */
|
|
#define IDT_NOR_TMR 0x38 /* R Timer */
|
|
#define IDT_NOR_TSTB 0x3C /* R/W Transmit schedule table base */
|
|
#define IDT_NOR_TSQB 0x40 /* R/W Transmit Status queue base */
|
|
#define IDT_NOR_TSQT 0x44 /* R/W Transmit Status queue tail */
|
|
#define IDT_NOR_TSQH 0x48 /* R/W Transmit Status queue head */
|
|
#define IDT_NOR_GP 0x4C /* R/W General purpose */
|
|
#define IDT_NOR_VPM 0x50 /* R/W VPI/VCI mask */
|
|
#define IDT_NOR_RXFD 0x54 /* R/W Receive FIFO descriptor */
|
|
#define IDT_NOR_RXFT 0x58 /* R/W Receive FIFO tail */
|
|
#define IDT_NOR_RXFH 0x5C /* R/W Receive FIFO head */
|
|
#define IDT_NOR_RAWHND 0x60 /* R/W Raw cell handle */
|
|
#define IDT_NOR_RXSTAT 0x64 /* R Receive connection state */
|
|
#define IDT_NOR_ABRSTD 0x68 /* R/W ABR & VBR Schedule table descriptor */
|
|
#define IDT_NOR_ABRRQ 0x6C /* R/W ABR Ready queue pointer */
|
|
#define IDT_NOR_VBRRQ 0x70 /* R/W VBR Ready queue pointer */
|
|
#define IDT_NOR_RTBL 0x74 /* R/W Rate table descriptor */
|
|
#define IDT_NOR_MXDFCT 0x78 /* R/W Maximum deficit counter */
|
|
#define IDT_NOR_TXSTAT 0x7C /* R/W Transmit connection state */
|
|
#define IDT_NOR_TCMDQ 0x80 /* W Transmit command queue */
|
|
#define IDT_NOR_IRCP 0x84 /* R/W Inactive receive connection pointer */
|
|
#define IDT_NOR_FBQP0 0x88 /* R/W Free buffer queue 0 pointer */
|
|
#define IDT_NOR_FBQP1 0x8C /* R/W Free buffer queue 1 pointer */
|
|
#define IDT_NOR_FBQP2 0x90 /* R/W Free buffer queue 2 pointer */
|
|
#define IDT_NOR_FBQP3 0x94 /* R/W Free buffer queue 3 pointer */
|
|
#define IDT_NOR_FBQS0 0x98 /* R/W Free buffer queue 0 size */
|
|
#define IDT_NOR_FBQS1 0x9C /* R/W Free buffer queue 1 size */
|
|
#define IDT_NOR_FBQS2 0xA0 /* R/W Free buffer queue 2 size */
|
|
#define IDT_NOR_FBQS3 0xA4 /* R/W Free buffer queue 3 size */
|
|
#define IDT_NOR_FBQWP0 0xA8 /* R/W Free buffer queue 0 write pointer */
|
|
#define IDT_NOR_FBQWP1 0xAC /* R/W Free buffer queue 1 write pointer */
|
|
#define IDT_NOR_FBQWP2 0xB0 /* R/W Free buffer queue 2 write pointer */
|
|
#define IDT_NOR_FBQWP3 0xB4 /* R/W Free buffer queue 3 write pointer */
|
|
#define IDT_NOR_NOW 0xB8 /* R Current transmit schedule table addr */
|
|
#define IDT_NOR_DNOW 0xBC /* R Dynamic Now register */
|
|
#define IDT_NOR_END 0xC0
|
|
|
|
/*
|
|
* Command (IDT_NOR_CMD)
|
|
*/
|
|
#define IDT_CMD_NOP 0x00000000 /* No operation */
|
|
#define IDT_CMD_OPCL 0x20000000 /* Open/Close connection */
|
|
#define IDT_CMD_WSRAM 0x40000000 /* Write SRAM */
|
|
#define IDT_CMD_RSRAM 0x50000000 /* Read SRAM */
|
|
#define IDT_CMD_WFBQ 0x60000000 /* Write free buffer queue */
|
|
#define IDT_CMD_RUTIL 0x80000000 /* Read utility bus */
|
|
#define IDT_CMD_WUTIL 0x90000000 /* Write utility bus */
|
|
|
|
#define IDT_MKCMD_OPEN(VC) (IDT_CMD_OPCL | (1 << 19) | ((V) << 4))
|
|
#define IDT_MKCMD_CLOSE(VC) (IDT_CMD_OPCL | (0 << 19) | ((V) << 4))
|
|
#define IDT_MKCMD_WSRAM(A, S) (IDT_CMD_WSRAM | ((A) << 2) | (S))
|
|
#define IDT_MKCMD_RSRAM(A) (IDT_CMD_RSRAM | ((A) << 2))
|
|
#define IDT_MKCMD_WFBQ(Q) (IDT_CMD_WFBQ | (Q))
|
|
#define IDT_MKCMD_RUTIL(S0, S1, A) \
|
|
(IDT_CMD_RUTIL | ((S1) << 9) | ((S0) << 8) | (A))
|
|
#define IDT_MKCMD_WUTIL(S0, S1, A) \
|
|
(IDT_CMD_WUTIL | ((S1) << 9) | ((S0) << 8) | (A))
|
|
|
|
/*
|
|
* Configuration register (CFG)
|
|
*/
|
|
#define IDT_CFG_SWRST 0x80000000 /* software reset */
|
|
#define IDT_CFG_LOOP 0x40000000 /* internal loopback enable */
|
|
#define IDT_CFG_RXPTH 0x20000000 /* receive path enable */
|
|
#define IDT_CFG_IDLECLP 0x10000000 /* set CLP in null cells */
|
|
#define IDT_CFG_TXFIFO9 0x00000000 /* Tx FIFO 9 cells */
|
|
#define IDT_CFG_TXFIFO1 0x04000000 /* Tx FIFO 1 cells */
|
|
#define IDT_CFG_TXFIFO2 0x08000000 /* Tx FIFO 2 cells */
|
|
#define IDT_CFG_TXFIFO4 0x0C000000 /* Tx FIFO 4 cells */
|
|
#define IDT_CFG_NOIDLE 0x02000000 /* don't send idle cells */
|
|
#define IDT_CFG_RXQ128 0x00000000 /* Rx Status Queue 128 entries */
|
|
#define IDT_CFG_RXQ256 0x00400000 /* Rx Status Queue 256 entries */
|
|
#define IDT_CFG_RXQ512 0x00800000 /* Rx Status Queue 512 entries */
|
|
#define IDT_CFG_ICAPT 0x00200000 /* Invalid cell accept */
|
|
#define IDT_CFG_IGGFC 0x00100000 /* Ignore GFC field */
|
|
#define IDT_CFG_VP0 0x00000000 /* 0 VPI bits */
|
|
#define IDT_CFG_VP1 0x00040000 /* 1 VPI bit */
|
|
#define IDT_CFG_VP2 0x00080000 /* 2 VPI bits */
|
|
#define IDT_CFG_VP8 0x000C0000 /* 8 VPI bits */
|
|
#define IDT_CFG_CTS1K 0x00000000 /* Rx Connection table 1024 entries */
|
|
#define IDT_CFG_CTS4K 0x00010000 /* Rx Connection table 4096 entries */
|
|
#define IDT_CFG_CTS16K 0x00020000 /* Rx Connection table 16384 entries */
|
|
#define IDT_CFG_CTS512 0x00030000 /* Rx Connection table 512 entries */
|
|
#define IDT_CFG_VPECA 0x00008000 /* VPI/VCI error cell accept */
|
|
#define IDT_CFG_RXINONE 0x00000000 /* No interrupt on receive */
|
|
#define IDT_CFG_RXIIMM 0x00001000 /* immediate interrupt */
|
|
#define IDT_CFG_RXI28 0x00002000 /* every 0x2800 clocks */
|
|
#define IDT_CFG_RXI4F 0x00003000 /* every 0x4F00 clocks */
|
|
#define IDT_CFG_RXI74 0x00004000 /* every 0x7400 clocks */
|
|
#define IDT_CFG_RAWIE 0x00000800 /* raw cell queue interrupt enable */
|
|
#define IDT_CFG_RQFIE 0x00000400 /* Rx status queue almost full IE */
|
|
#define IDT_CFG_CACHE 0x00000100 /* begin DMA on cache line */
|
|
#define IDT_CFG_TIMOIE 0x00000080 /* timer roll over interrupt enable */
|
|
#define IDT_CFG_FBIE 0x00000040 /* free buffer queue interrupt enable */
|
|
#define IDT_CFG_TXENB 0x00000020 /* Tx enable */
|
|
#define IDT_CFG_TXINT 0x00000010 /* Tx status interrupt enable */
|
|
#define IDT_CFG_TXUIE 0x00000008 /* Tx underrun interrupt enable */
|
|
#define IDT_CFG_UMODE 0x00000004 /* utopia byte mode */
|
|
#define IDT_CFG_TXSFI 0x00000002 /* Tx status full interrupt enable */
|
|
#define IDT_CFG_PHYIE 0x00000001 /* PHY interrupt enable */
|
|
|
|
/*
|
|
* Status register (STAT)
|
|
*/
|
|
#define IDT_STAT_FRAC3(S) (((S) >> 28) & 0xf) /* FBQ3 valid */
|
|
#define IDT_STAT_FRAC2(S) (((S) >> 24) & 0xf) /* FBQ2 valid */
|
|
#define IDT_STAT_FRAC1(S) (((S) >> 20) & 0xf) /* FBQ1 valid */
|
|
#define IDT_STAT_FRAC0(S) (((S) >> 16) & 0xf) /* FBQ0 valid */
|
|
#define IDT_STAT_TSIF 0x00008000 /* Tx status indicator flag */
|
|
#define IDT_STAT_TXICP 0x00004000 /* Tx incomplete PDU */
|
|
#define IDT_STAT_TSQF 0x00001000 /* Tx status queue full */
|
|
#define IDT_STAT_TMROF 0x00000800 /* Timer overflow */
|
|
#define IDT_STAT_PHYI 0x00000400 /* PHY interrupt */
|
|
#define IDT_STAT_CMDBZ 0x00000200 /* command busy */
|
|
#define IDT_STAT_FBQ3A 0x00000100 /* FBQ 3 attention flag */
|
|
#define IDT_STAT_FBQ2A 0x00000080 /* FBQ 2 attention flag */
|
|
#define IDT_STAT_RSQF 0x00000040 /* Rx status queue full */
|
|
#define IDT_STAT_EPDU 0x00000020 /* end of CS-PDU */
|
|
#define IDT_STAT_RAWCF 0x00000010 /* raw cell flag */
|
|
#define IDT_STAT_FBQ1A 0x00000008 /* FBQ 1 attention flag */
|
|
#define IDT_STAT_FBQ0A 0x00000004 /* FBQ 0 attention flag */
|
|
#define IDT_STAT_RSQAF 0x00000002 /* Rx status queue almost full */
|
|
|
|
/*
|
|
* Cell drop count (CDC)
|
|
*/
|
|
#define IDT_CDC_RMID 0x00400000 /* RM cell ID error */
|
|
#define IDT_CDC_CTE 0x00200000 /* Rx connection table error */
|
|
#define IDT_CDC_NFB 0x00100000 /* No free buffers */
|
|
#define IDT_CDC_OAMCRC 0x00080000 /* bad OAM CRC */
|
|
#define IDT_CDC_RMCRC 0x00040000 /* bad RM CRC */
|
|
#define IDT_CDC_RMFIFO 0x00020000 /* RM FIFO full */
|
|
#define IDT_CDC_RXFIFO 0x00010000 /* Rx FIFO full */
|
|
#define IDT_CDC(S) ((S) & 0xffff) /* cell drop counter */
|
|
|
|
/*
|
|
* VPI/VCI lookup error count (VPEC)
|
|
*/
|
|
#define IDT_VPEC(S) ((S) & 0xffff)
|
|
|
|
/*
|
|
* Invalid cell count (ICC)
|
|
*/
|
|
#define IDT_ICC(S) ((S) & 0xffff)
|
|
|
|
/*
|
|
* General purpose register
|
|
*/
|
|
#define IDT_GP_TXNCC(S) (((S) >> 24) & 0xff) /* Tx negative cell count */
|
|
#define IDT_GP_EEDI 0x00010000 /* EEPROM data in */
|
|
#define IDT_GP_BIGE 0x00008000 /* big endian enable */
|
|
#define IDT_GP_RM 0x00000000 /* process RM cells */
|
|
#define IDT_GP_RM_TEE 0x00002000 /* process RM cells and put in RawQ */
|
|
#define IDT_GP_RM_RAW 0x00006000 /* put RM cells in RawQ */
|
|
#define IDT_GP_DLOOP 0x00001000 /* double loopback */
|
|
#define IDT_GP_PCIPAR 0x00000010 /* force PCI parity error */
|
|
#define IDT_GP_PCIPERR 0x00000020 /* force PERR */
|
|
#define IDT_GP_PCISERR 0x00000040 /* force SERR */
|
|
#define IDT_GP_PHY_RST 0x00000008 /* PHY reset */
|
|
#define IDT_GP_EESCLK 0x00000004 /* EEPROM clock */
|
|
#define IDT_GP_EECS 0x00000002 /* EEPROM chip select */
|
|
#define IDT_GP_EEDO 0x00000001 /* EEPROM data out */
|
|
|
|
/*
|
|
* Receive FIFO descriptor register (RXFD)
|
|
*/
|
|
#define IDT_RXFD(A, S) (((S) << 24) | ((A) << 2))
|
|
#define IDT_RXFDS(V) (((V) >> 24) & 0xf)
|
|
#define IDT_RXFDA(V) (((V) & 0x1ffffc) >> 2)
|
|
|
|
/*
|
|
* ABR & VBR schedule table descriptor register
|
|
*/
|
|
#define IDT_ABRSTD(A, S) (((S) << 24) | ((A) << 2))
|
|
#define IDT_ABRSTDS(V) (((V) >> 24) & 0x7)
|
|
#define IDT_ABRSTDA(V) (((V) & 0x1ffffc) >> 2)
|
|
|
|
/*
|
|
* ABR/VBR ready queue register
|
|
*/
|
|
#define IDT_ABRRQH(V) (((V) >> 16) & 0x3fff)
|
|
#define IDT_ABRRQT(V) (((V) >> 0) & 0x3fff)
|
|
#define IDT_VBRRQH(V) (((V) >> 16) & 0x3fff)
|
|
#define IDT_VBRRQT(V) (((V) >> 0) & 0x3fff)
|
|
|
|
/*
|
|
* Maximum deficit limit register
|
|
*/
|
|
#define IDT_MDFCT_LCI 0x00020000 /* local congestion indicator enable */
|
|
#define IDT_MDFCT_LNI 0x00010000 /* local no incread enable */
|
|
|
|
/*
|
|
* Transmit command queue register
|
|
*/
|
|
#define IDT_TCMDQ_NOP() ((0x0 << 24)) /* no operation */
|
|
#define IDT_TCMDQ_START(C) ((0x1 << 24) | (C)) /* start connection */
|
|
#define IDT_TCMDQ_ULACR(C, L) ((0x2 << 24) | (C) | ((L) << 16))
|
|
/* update LACR */
|
|
#define IDT_TCMDQ_SLACR(C, L) ((0x3 << 24) | (C) | ((L) << 16))
|
|
/* start and update LACR */
|
|
#define IDT_TCMDQ_UIER(C, L) ((0x4 << 24) | (C) | ((L) << 16))
|
|
/* update Int ER */
|
|
#define IDT_TCMDQ_HALT(C) ((0x5 << 24) | (C)) /* halt connection */
|
|
|
|
/*
|
|
* Free buffer queue size registers
|
|
*/
|
|
#define IDT_FBQS(T, N, C, S) (((T) << 28) | ((N) << 24) | ((C) << 20) | (S))
|
|
|
|
/*
|
|
* Receive status queue
|
|
*/
|
|
struct idt_rsqe {
|
|
uint32_t cid; /* VPI/VCI */
|
|
uint32_t handle; /* buffer handle */
|
|
uint32_t crc; /* AAL-5 CRC */
|
|
uint32_t stat; /* div. flags */
|
|
};
|
|
#define IDT_RSQE_SIZE 16 /* bytes */
|
|
#define IDT_RSQE_VPI(CID) (((CID) >> 16) & 0xff)
|
|
#define IDT_RSQE_VCI(CID) ((CID) & 0xffff)
|
|
#define IDT_RSQE_TYPE(S) (((S) >> 30) & 0x3)
|
|
#define IDT_RSQE_DATA 0x2
|
|
#define IDT_RSQE_IDLE 0x3
|
|
#define IDT_RSQE_VALID 0x80000000
|
|
#define IDT_RSQE_POOL(S) (((S) >> 16) & 0x3)
|
|
#define IDT_RSQE_BUF 0x8000
|
|
#define IDT_RSQE_NZGFC 0x4000
|
|
#define IDT_RSQE_EPDU 0x2000
|
|
#define IDT_RSQE_CBUF 0x1000
|
|
#define IDT_RSQE_EFCIE 0x0800
|
|
#define IDT_RSQE_CLP 0x0400
|
|
#define IDT_RSQE_CRC 0x0200
|
|
#define IDT_RSQE_CNT(S) ((S) & 0x1ff)
|
|
|
|
#define IDT_RSQH(R) (((R) & 0x1ffc) >> 2)
|
|
#define IDT_RSQT(R) (((R) & 0x1ffc) >> 2)
|
|
|
|
/*
|
|
* Transmit status queue
|
|
*/
|
|
#define IDT_TSQ_SIZE 1024 /* no. of entries */
|
|
#define IDT_TSQE_SIZE 8 /* bytes */
|
|
#define IDT_TSQE_SHIFT 3
|
|
struct idt_tsqe {
|
|
uint32_t stat;
|
|
uint32_t stamp;
|
|
};
|
|
#define IDT_TSQE_EMPTY 0x80000000
|
|
#define IDT_TSQE_TYPE(E) (((E) >> 29) & 0x3)
|
|
#define IDT_TSQE_TIMER 0x0
|
|
#define IDT_TSQE_TSR 0x1
|
|
#define IDT_TSQE_IDLE 0x2
|
|
#define IDT_TSQE_TBD 0x3
|
|
#define IDT_TSQE_TAG(E) (((E) >> 24) & 0x1f)
|
|
#define IDT_TSQE_HALTED 0x10
|
|
#define IDT_TSQE_STAMP(E) ((E) & 0xffffff)
|
|
#define IDT_TSQE_TAG_SPACE 32
|
|
|
|
/*
|
|
* Raw cell handle
|
|
*/
|
|
struct idt_rawhnd {
|
|
uint32_t tail;
|
|
uint32_t handle;
|
|
};
|
|
#define IDT_RAWHND_SIZE 8
|
|
|
|
/*
|
|
* TST
|
|
*/
|
|
#define IDT_TST_NULL (0 << 29) /* transmit NULL cell */
|
|
#define IDT_TST_CBR (1 << 29) /* transmit CBR cell */
|
|
#define IDT_TST_VBR (2 << 29) /* transmit [AVU]BR cell */
|
|
#define IDT_TST_BR (3 << 29) /* branch */
|
|
#define IDT_TST_MASK 0x7ffff
|
|
|
|
/*
|
|
* Free buffer queue
|
|
*/
|
|
#define IDT_FBQ_SIZE 512 /* entries */
|
|
|
|
/*
|
|
* Receive connection table
|
|
*/
|
|
#define IDT_RCT_FBP2 0x00400000 /* use FBQ 2 */
|
|
#define IDT_RCT_OPEN 0x00080000 /* connection open */
|
|
#define IDT_RCT_AAL0 0x00000000 /* AAL 0 */
|
|
#define IDT_RCT_AAL34 0x00010000 /* AAL 3/4 */
|
|
#define IDT_RCT_AAL5 0x00020000 /* AAL 5 */
|
|
#define IDT_RCT_AALRAW 0x00030000 /* raw cells */
|
|
#define IDT_RCT_AALOAM 0x00040000 /* OAM cells */
|
|
#define IDT_RCT_RCI 0x00008000 /* raw cell interrupt enable */
|
|
#define IDT_RCT_IACT_CNT_MASK 0x1c000000
|
|
#define IDT_RCT_IACT_CNT_SHIFT 26
|
|
#define IDT_RCT_ENTRY_SIZE 4 /* words */
|
|
|
|
/*
|
|
* Transmit connection table
|
|
*/
|
|
#define IDT_TCT_CBR 0x00000000
|
|
#define IDT_TCT_VBR 0x40000000
|
|
#define IDT_TCT_ABR 0x80000000
|
|
#define IDT_TCT_UBR 0x00000000
|
|
#define IDT_TCT_UBR_FLG 0x80000000 /* word8 flag */
|
|
#define IDT_TCT_HALT 0x80000000 /* connection halted */
|
|
#define IDT_TCT_IDLE 0x40000000 /* connection idle */
|
|
#define IDT_TCT_TSIF 0x00004000
|
|
#define IDT_TCT_MAXIDLE 0x7f000000
|
|
#define IDT_TCT_MBS_SHIFT 16
|
|
#define IDT_TCT_CRM_SHIFT 29
|
|
#define IDT_TCT_NAGE_SHIFT 21
|
|
#define IDT_TCT_LMCR_SHIFT 24
|
|
#define IDT_TCT_CDF_SHIFT 20
|
|
#define IDT_TCT_RDF_SHIFT 14
|
|
#define IDT_TCT_AIR_SHIFT 8
|
|
#define IDT_TCT_ACRI_SHIFT 16
|
|
|
|
/*
|
|
* Segmentation channel queue
|
|
*/
|
|
#define IDT_SCQ_SIZE 64 /* number of entries */
|
|
struct idt_tbd {
|
|
uint32_t flags;
|
|
uint32_t addr;
|
|
uint32_t aal5;
|
|
uint32_t hdr;
|
|
};
|
|
#define IDT_TBD_SIZE 16 /* bytes */
|
|
#define IDT_TBD_SHIFT 4
|
|
#define IDT_TBD_TSR 0x80000000 /* TSR entry */
|
|
#define IDT_TBD_EPDU 0x40000000 /* end of AAL PDU */
|
|
#define IDT_TBD_TSIF 0x20000000 /* generate status */
|
|
#define IDT_TBD_AAL0 0x00000000 /* AAL0 */
|
|
#define IDT_TBD_AAL34 0x04000000 /* AAL3/4 */
|
|
#define IDT_TBD_AAL5 0x08000000 /* AAL5 */
|
|
#define IDT_TBD_AALOAM 0x10000000 /* OAM cells */
|
|
#define IDT_TBD_GTSI 0x02000000 /* generate transmit status entry */
|
|
#define IDT_TBD_TAG_SHIFT 20
|
|
#define IDT_TBD_HDR(VPI, VCI, PTI, CLP) \
|
|
(((VPI) << 20) | ((VCI) << 4) | ((PTI) << 1) | (CLP))
|
|
#define IDT_TBD_VPI(H) (((H) >> 20) & 0xff)
|
|
#define IDT_TBD_VCI(H) (((H) >> 4) & 0xffff)
|
|
|
|
/*
|
|
* Segmentation channel descriptor
|
|
*/
|
|
#define IDT_SCD_SIZE 12 /* words */
|
|
|
|
/*
|
|
* Memory map for the different RAM sizes
|
|
*
|
|
* 16k 32k 128k 512k
|
|
*
|
|
* TxCT 0x00000/4k 0x00000/8x 0x00000/32k 0x00000/128k
|
|
* RxCT 0x01000/2k 0x02000/4k 0x08000/16k 0x20000/64k
|
|
* FBQ0 0x01800/1k 0x03000/1k 0x0c000/1k 0x30000/1k
|
|
* FBQ1 0x01c00/1k 0x03400/1k 0x0c400/1k 0x30400/1k
|
|
* FBQ2 0x02000/1k 0x03800/1k 0x0c800/1k 0x30800/1k
|
|
* FBQ3 - - - -
|
|
* RT 0x02400/4.5k 0x03c00/4.5k 0x0cc00/4.5k 0x30c00/4.5k
|
|
* SCD 0x03600/597 0x04e00/1621 0x0de00/9358 0x31e00/43036
|
|
* TST 0x06000/2x2k 0x0c000/2x4k 0x37000/2x8k 0xef000/2x16k
|
|
* ABR ST 0x07000/2x1k 0x0e000/2x2k 0x3b000/2x8k 0xf7000/2x16k
|
|
* RxFIFO 0x07800/2k 0x0f000/4k 0x3f000/4k 0xff000/4k
|
|
* End 0x08000 0x10000 0x40000 0x100000
|
|
*/
|
|
struct idt_mmap {
|
|
u_int sram; /* K SRAM */
|
|
u_int max_conn; /* connections */
|
|
u_int vcbits; /* VPI + VCI bits */
|
|
u_int rxtab; /* CFG word for CNTBL field */
|
|
u_int rct; /* RCT base */
|
|
u_int rtables; /* rate table address */
|
|
u_int scd_base; /* SCD area base address */
|
|
u_int scd_num; /* number of SCDs */
|
|
u_int tst1base; /* base address of TST 1 */
|
|
u_int tst_size; /* TST size in words */
|
|
u_int abrstd_addr; /* schedule table address */
|
|
u_int abrstd_size; /* schedule table size */
|
|
u_int abrstd_code; /* schedule table size */
|
|
u_int rxfifo_addr; /* address */
|
|
u_int rxfifo_size; /* in words */
|
|
u_int rxfifo_code; /* size */
|
|
};
|
|
#define IDT_MMAP { \
|
|
{ /* 16k x 32, 512 connections */ \
|
|
16, 512, 9, IDT_CFG_CTS512, /* RAM, connections, VC bits */ \
|
|
0x01000, /* RCT base */ \
|
|
0x02400, /* rate table address */ \
|
|
0x03600, 597, /* SCD base and num */ \
|
|
0x06000, 2048, /* TST/words, base */ \
|
|
0x07000, 2048, 0x1, /* ABR schedule table */ \
|
|
0x07800, 2048, 0x2 /* RxFIFO size in words */ \
|
|
}, \
|
|
{ /* 32k x 32, 1024 connections */ \
|
|
32, 1024, 10, IDT_CFG_CTS1K, /* RAM, connections, VC bits */ \
|
|
0x02000, /* RCT base */ \
|
|
0x03c00, /* rate table address */ \
|
|
0x04e00, 1621, /* SCD base and num */ \
|
|
0x0c000, 4096, /* TST/words, base */ \
|
|
0x0e000, 4096, 0x2, /* ABR schedule table */ \
|
|
0x0f000, 4096, 0x3 /* RxFIFO size in words */ \
|
|
}, \
|
|
{ /* 128k x 32, 4096 connections */ \
|
|
128, 4096, 12, IDT_CFG_CTS4K, /* RAM, connections, VC bits */ \
|
|
0x08000, /* RCT base */ \
|
|
0x0cc00, /* rate table address */ \
|
|
0x0de00, 9358, /* SCD base and num */ \
|
|
0x37000, 8192, /* TST/words, base */ \
|
|
0x3b000, 16384, 0x4, /* ABR schedule table */ \
|
|
0x3f000, 4096, 0x3 /* RxFIFO size in words */ \
|
|
}, \
|
|
{ /* 512k x 32, 512 connections */ \
|
|
512, 16384, 14, IDT_CFG_CTS16K, /* RAM, connections, VC bits */\
|
|
0x20000, /* RCT base */ \
|
|
0x30c00, /* rate table address */ \
|
|
0x31e00, 43036, /* SCD base and num */ \
|
|
0xef000, 16384, /* TST/words, base */ \
|
|
0xf7000, 16384, 0x5, /* ABR schedule table */ \
|
|
0xff000, 4096, 0x3 /* RxFIFO size in words */ \
|
|
}, \
|
|
}
|