162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef _FORE200E_H 362306a36Sopenharmony_ci#define _FORE200E_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#ifdef __KERNEL__ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci/* rx buffer sizes */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#define SMALL_BUFFER_SIZE 384 /* size of small buffers (multiple of 48 (PCA) and 64 (SBA) bytes) */ 1062306a36Sopenharmony_ci#define LARGE_BUFFER_SIZE 4032 /* size of large buffers (multiple of 48 (PCA) and 64 (SBA) bytes) */ 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#define RBD_BLK_SIZE 32 /* nbr of supplied rx buffers per rbd */ 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#define MAX_PDU_SIZE 65535 /* maximum PDU size supported by AALs */ 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#define BUFFER_S1_SIZE SMALL_BUFFER_SIZE /* size of small buffers, scheme 1 */ 2062306a36Sopenharmony_ci#define BUFFER_L1_SIZE LARGE_BUFFER_SIZE /* size of large buffers, scheme 1 */ 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#define BUFFER_S2_SIZE SMALL_BUFFER_SIZE /* size of small buffers, scheme 2 */ 2362306a36Sopenharmony_ci#define BUFFER_L2_SIZE LARGE_BUFFER_SIZE /* size of large buffers, scheme 2 */ 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci#define BUFFER_S1_NBR (RBD_BLK_SIZE * 6) 2662306a36Sopenharmony_ci#define BUFFER_L1_NBR (RBD_BLK_SIZE * 4) 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#define BUFFER_S2_NBR (RBD_BLK_SIZE * 6) 2962306a36Sopenharmony_ci#define BUFFER_L2_NBR (RBD_BLK_SIZE * 4) 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci#define QUEUE_SIZE_CMD 16 /* command queue capacity */ 3362306a36Sopenharmony_ci#define QUEUE_SIZE_RX 64 /* receive queue capacity */ 3462306a36Sopenharmony_ci#define QUEUE_SIZE_TX 256 /* transmit queue capacity */ 3562306a36Sopenharmony_ci#define QUEUE_SIZE_BS 32 /* buffer supply queue capacity */ 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci#define FORE200E_VPI_BITS 0 3862306a36Sopenharmony_ci#define FORE200E_VCI_BITS 10 3962306a36Sopenharmony_ci#define NBR_CONNECT (1 << (FORE200E_VPI_BITS + FORE200E_VCI_BITS)) /* number of connections */ 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci#define TSD_FIXED 2 4362306a36Sopenharmony_ci#define TSD_EXTENSION 0 4462306a36Sopenharmony_ci#define TSD_NBR (TSD_FIXED + TSD_EXTENSION) 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci/* the cp starts putting a received PDU into one *small* buffer, 4862306a36Sopenharmony_ci then it uses a number of *large* buffers for the trailing data. 4962306a36Sopenharmony_ci we compute here the total number of receive segment descriptors 5062306a36Sopenharmony_ci required to hold the largest possible PDU */ 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci#define RSD_REQUIRED (((MAX_PDU_SIZE - SMALL_BUFFER_SIZE + LARGE_BUFFER_SIZE) / LARGE_BUFFER_SIZE) + 1) 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci#define RSD_FIXED 3 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci/* RSD_REQUIRED receive segment descriptors are enough to describe a max-sized PDU, 5762306a36Sopenharmony_ci but we have to keep the size of the receive PDU descriptor multiple of 32 bytes, 5862306a36Sopenharmony_ci so we add one extra RSD to RSD_EXTENSION 5962306a36Sopenharmony_ci (WARNING: THIS MAY CHANGE IF BUFFER SIZES ARE MODIFIED) */ 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci#define RSD_EXTENSION ((RSD_REQUIRED - RSD_FIXED) + 1) 6262306a36Sopenharmony_ci#define RSD_NBR (RSD_FIXED + RSD_EXTENSION) 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci#define FORE200E_DEV(d) ((struct fore200e*)((d)->dev_data)) 6662306a36Sopenharmony_ci#define FORE200E_VCC(d) ((struct fore200e_vcc*)((d)->dev_data)) 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci/* bitfields endian games */ 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci#if defined(__LITTLE_ENDIAN_BITFIELD) 7162306a36Sopenharmony_ci#define BITFIELD2(b1, b2) b1; b2; 7262306a36Sopenharmony_ci#define BITFIELD3(b1, b2, b3) b1; b2; b3; 7362306a36Sopenharmony_ci#define BITFIELD4(b1, b2, b3, b4) b1; b2; b3; b4; 7462306a36Sopenharmony_ci#define BITFIELD5(b1, b2, b3, b4, b5) b1; b2; b3; b4; b5; 7562306a36Sopenharmony_ci#define BITFIELD6(b1, b2, b3, b4, b5, b6) b1; b2; b3; b4; b5; b6; 7662306a36Sopenharmony_ci#elif defined(__BIG_ENDIAN_BITFIELD) 7762306a36Sopenharmony_ci#define BITFIELD2(b1, b2) b2; b1; 7862306a36Sopenharmony_ci#define BITFIELD3(b1, b2, b3) b3; b2; b1; 7962306a36Sopenharmony_ci#define BITFIELD4(b1, b2, b3, b4) b4; b3; b2; b1; 8062306a36Sopenharmony_ci#define BITFIELD5(b1, b2, b3, b4, b5) b5; b4; b3; b2; b1; 8162306a36Sopenharmony_ci#define BITFIELD6(b1, b2, b3, b4, b5, b6) b6; b5; b4; b3; b2; b1; 8262306a36Sopenharmony_ci#else 8362306a36Sopenharmony_ci#error unknown bitfield endianess 8462306a36Sopenharmony_ci#endif 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci/* ATM cell header (minus HEC byte) */ 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_citypedef struct atm_header { 9062306a36Sopenharmony_ci BITFIELD5( 9162306a36Sopenharmony_ci u32 clp : 1, /* cell loss priority */ 9262306a36Sopenharmony_ci u32 plt : 3, /* payload type */ 9362306a36Sopenharmony_ci u32 vci : 16, /* virtual channel identifier */ 9462306a36Sopenharmony_ci u32 vpi : 8, /* virtual path identifier */ 9562306a36Sopenharmony_ci u32 gfc : 4 /* generic flow control */ 9662306a36Sopenharmony_ci ) 9762306a36Sopenharmony_ci} atm_header_t; 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci/* ATM adaptation layer id */ 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_citypedef enum fore200e_aal { 10362306a36Sopenharmony_ci FORE200E_AAL0 = 0, 10462306a36Sopenharmony_ci FORE200E_AAL34 = 4, 10562306a36Sopenharmony_ci FORE200E_AAL5 = 5, 10662306a36Sopenharmony_ci} fore200e_aal_t; 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci/* transmit PDU descriptor specification */ 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_citypedef struct tpd_spec { 11262306a36Sopenharmony_ci BITFIELD4( 11362306a36Sopenharmony_ci u32 length : 16, /* total PDU length */ 11462306a36Sopenharmony_ci u32 nseg : 8, /* number of transmit segments */ 11562306a36Sopenharmony_ci enum fore200e_aal aal : 4, /* adaptation layer */ 11662306a36Sopenharmony_ci u32 intr : 4 /* interrupt requested */ 11762306a36Sopenharmony_ci ) 11862306a36Sopenharmony_ci} tpd_spec_t; 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci/* transmit PDU rate control */ 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_citypedef struct tpd_rate 12462306a36Sopenharmony_ci{ 12562306a36Sopenharmony_ci BITFIELD2( 12662306a36Sopenharmony_ci u32 idle_cells : 16, /* number of idle cells to insert */ 12762306a36Sopenharmony_ci u32 data_cells : 16 /* number of data cells to transmit */ 12862306a36Sopenharmony_ci ) 12962306a36Sopenharmony_ci} tpd_rate_t; 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci/* transmit segment descriptor */ 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_citypedef struct tsd { 13562306a36Sopenharmony_ci u32 buffer; /* transmit buffer DMA address */ 13662306a36Sopenharmony_ci u32 length; /* number of bytes in buffer */ 13762306a36Sopenharmony_ci} tsd_t; 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci/* transmit PDU descriptor */ 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_citypedef struct tpd { 14362306a36Sopenharmony_ci struct atm_header atm_header; /* ATM header minus HEC byte */ 14462306a36Sopenharmony_ci struct tpd_spec spec; /* tpd specification */ 14562306a36Sopenharmony_ci struct tpd_rate rate; /* tpd rate control */ 14662306a36Sopenharmony_ci u32 pad; /* reserved */ 14762306a36Sopenharmony_ci struct tsd tsd[ TSD_NBR ]; /* transmit segment descriptors */ 14862306a36Sopenharmony_ci} tpd_t; 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci/* receive segment descriptor */ 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_citypedef struct rsd { 15462306a36Sopenharmony_ci u32 handle; /* host supplied receive buffer handle */ 15562306a36Sopenharmony_ci u32 length; /* number of bytes in buffer */ 15662306a36Sopenharmony_ci} rsd_t; 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ci/* receive PDU descriptor */ 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_citypedef struct rpd { 16262306a36Sopenharmony_ci struct atm_header atm_header; /* ATM header minus HEC byte */ 16362306a36Sopenharmony_ci u32 nseg; /* number of receive segments */ 16462306a36Sopenharmony_ci struct rsd rsd[ RSD_NBR ]; /* receive segment descriptors */ 16562306a36Sopenharmony_ci} rpd_t; 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci/* buffer scheme */ 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_citypedef enum buffer_scheme { 17162306a36Sopenharmony_ci BUFFER_SCHEME_ONE, 17262306a36Sopenharmony_ci BUFFER_SCHEME_TWO, 17362306a36Sopenharmony_ci BUFFER_SCHEME_NBR /* always last */ 17462306a36Sopenharmony_ci} buffer_scheme_t; 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci/* buffer magnitude */ 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_citypedef enum buffer_magn { 18062306a36Sopenharmony_ci BUFFER_MAGN_SMALL, 18162306a36Sopenharmony_ci BUFFER_MAGN_LARGE, 18262306a36Sopenharmony_ci BUFFER_MAGN_NBR /* always last */ 18362306a36Sopenharmony_ci} buffer_magn_t; 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci/* receive buffer descriptor */ 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_citypedef struct rbd { 18962306a36Sopenharmony_ci u32 handle; /* host supplied handle */ 19062306a36Sopenharmony_ci u32 buffer_haddr; /* host DMA address of host buffer */ 19162306a36Sopenharmony_ci} rbd_t; 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci/* receive buffer descriptor block */ 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_citypedef struct rbd_block { 19762306a36Sopenharmony_ci struct rbd rbd[ RBD_BLK_SIZE ]; /* receive buffer descriptor */ 19862306a36Sopenharmony_ci} rbd_block_t; 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_ci/* tpd DMA address */ 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_citypedef struct tpd_haddr { 20462306a36Sopenharmony_ci BITFIELD3( 20562306a36Sopenharmony_ci u32 size : 4, /* tpd size expressed in 32 byte blocks */ 20662306a36Sopenharmony_ci u32 pad : 1, /* reserved */ 20762306a36Sopenharmony_ci u32 haddr : 27 /* tpd DMA addr aligned on 32 byte boundary */ 20862306a36Sopenharmony_ci ) 20962306a36Sopenharmony_ci} tpd_haddr_t; 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci#define TPD_HADDR_SHIFT 5 /* addr aligned on 32 byte boundary */ 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ci/* cp resident transmit queue entry */ 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_citypedef struct cp_txq_entry { 21662306a36Sopenharmony_ci struct tpd_haddr tpd_haddr; /* host DMA address of tpd */ 21762306a36Sopenharmony_ci u32 status_haddr; /* host DMA address of completion status */ 21862306a36Sopenharmony_ci} cp_txq_entry_t; 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci/* cp resident receive queue entry */ 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_citypedef struct cp_rxq_entry { 22462306a36Sopenharmony_ci u32 rpd_haddr; /* host DMA address of rpd */ 22562306a36Sopenharmony_ci u32 status_haddr; /* host DMA address of completion status */ 22662306a36Sopenharmony_ci} cp_rxq_entry_t; 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci/* cp resident buffer supply queue entry */ 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_citypedef struct cp_bsq_entry { 23262306a36Sopenharmony_ci u32 rbd_block_haddr; /* host DMA address of rbd block */ 23362306a36Sopenharmony_ci u32 status_haddr; /* host DMA address of completion status */ 23462306a36Sopenharmony_ci} cp_bsq_entry_t; 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci/* completion status */ 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_citypedef volatile enum status { 24062306a36Sopenharmony_ci STATUS_PENDING = (1<<0), /* initial status (written by host) */ 24162306a36Sopenharmony_ci STATUS_COMPLETE = (1<<1), /* completion status (written by cp) */ 24262306a36Sopenharmony_ci STATUS_FREE = (1<<2), /* initial status (written by host) */ 24362306a36Sopenharmony_ci STATUS_ERROR = (1<<3) /* completion status (written by cp) */ 24462306a36Sopenharmony_ci} status_t; 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_ci/* cp operation code */ 24862306a36Sopenharmony_ci 24962306a36Sopenharmony_citypedef enum opcode { 25062306a36Sopenharmony_ci OPCODE_INITIALIZE = 1, /* initialize board */ 25162306a36Sopenharmony_ci OPCODE_ACTIVATE_VCIN, /* activate incoming VCI */ 25262306a36Sopenharmony_ci OPCODE_ACTIVATE_VCOUT, /* activate outgoing VCI */ 25362306a36Sopenharmony_ci OPCODE_DEACTIVATE_VCIN, /* deactivate incoming VCI */ 25462306a36Sopenharmony_ci OPCODE_DEACTIVATE_VCOUT, /* deactivate incoing VCI */ 25562306a36Sopenharmony_ci OPCODE_GET_STATS, /* get board statistics */ 25662306a36Sopenharmony_ci OPCODE_SET_OC3, /* set OC-3 registers */ 25762306a36Sopenharmony_ci OPCODE_GET_OC3, /* get OC-3 registers */ 25862306a36Sopenharmony_ci OPCODE_RESET_STATS, /* reset board statistics */ 25962306a36Sopenharmony_ci OPCODE_GET_PROM, /* get expansion PROM data (PCI specific) */ 26062306a36Sopenharmony_ci OPCODE_SET_VPI_BITS, /* set x bits of those decoded by the 26162306a36Sopenharmony_ci firmware to be low order bits from 26262306a36Sopenharmony_ci the VPI field of the ATM cell header */ 26362306a36Sopenharmony_ci OPCODE_REQUEST_INTR = (1<<7) /* request interrupt */ 26462306a36Sopenharmony_ci} opcode_t; 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ci/* virtual path / virtual channel identifiers */ 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_citypedef struct vpvc { 27062306a36Sopenharmony_ci BITFIELD3( 27162306a36Sopenharmony_ci u32 vci : 16, /* virtual channel identifier */ 27262306a36Sopenharmony_ci u32 vpi : 8, /* virtual path identifier */ 27362306a36Sopenharmony_ci u32 pad : 8 /* reserved */ 27462306a36Sopenharmony_ci ) 27562306a36Sopenharmony_ci} vpvc_t; 27662306a36Sopenharmony_ci 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_ci/* activate VC command opcode */ 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_citypedef struct activate_opcode { 28162306a36Sopenharmony_ci BITFIELD4( 28262306a36Sopenharmony_ci enum opcode opcode : 8, /* cp opcode */ 28362306a36Sopenharmony_ci enum fore200e_aal aal : 8, /* adaptation layer */ 28462306a36Sopenharmony_ci enum buffer_scheme scheme : 8, /* buffer scheme */ 28562306a36Sopenharmony_ci u32 pad : 8 /* reserved */ 28662306a36Sopenharmony_ci ) 28762306a36Sopenharmony_ci} activate_opcode_t; 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_ci/* activate VC command block */ 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_citypedef struct activate_block { 29362306a36Sopenharmony_ci struct activate_opcode opcode; /* activate VC command opcode */ 29462306a36Sopenharmony_ci struct vpvc vpvc; /* VPI/VCI */ 29562306a36Sopenharmony_ci u32 mtu; /* for AAL0 only */ 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_ci} activate_block_t; 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_ci/* deactivate VC command opcode */ 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_citypedef struct deactivate_opcode { 30362306a36Sopenharmony_ci BITFIELD2( 30462306a36Sopenharmony_ci enum opcode opcode : 8, /* cp opcode */ 30562306a36Sopenharmony_ci u32 pad : 24 /* reserved */ 30662306a36Sopenharmony_ci ) 30762306a36Sopenharmony_ci} deactivate_opcode_t; 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_ci/* deactivate VC command block */ 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_citypedef struct deactivate_block { 31362306a36Sopenharmony_ci struct deactivate_opcode opcode; /* deactivate VC command opcode */ 31462306a36Sopenharmony_ci struct vpvc vpvc; /* VPI/VCI */ 31562306a36Sopenharmony_ci} deactivate_block_t; 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_ci/* OC-3 registers */ 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_citypedef struct oc3_regs { 32162306a36Sopenharmony_ci u32 reg[ 128 ]; /* see the PMC Sierra PC5346 S/UNI-155-Lite 32262306a36Sopenharmony_ci Saturn User Network Interface documentation 32362306a36Sopenharmony_ci for a description of the OC-3 chip registers */ 32462306a36Sopenharmony_ci} oc3_regs_t; 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_ci/* set/get OC-3 regs command opcode */ 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_citypedef struct oc3_opcode { 33062306a36Sopenharmony_ci BITFIELD4( 33162306a36Sopenharmony_ci enum opcode opcode : 8, /* cp opcode */ 33262306a36Sopenharmony_ci u32 reg : 8, /* register index */ 33362306a36Sopenharmony_ci u32 value : 8, /* register value */ 33462306a36Sopenharmony_ci u32 mask : 8 /* register mask that specifies which 33562306a36Sopenharmony_ci bits of the register value field 33662306a36Sopenharmony_ci are significant */ 33762306a36Sopenharmony_ci ) 33862306a36Sopenharmony_ci} oc3_opcode_t; 33962306a36Sopenharmony_ci 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_ci/* set/get OC-3 regs command block */ 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_citypedef struct oc3_block { 34462306a36Sopenharmony_ci struct oc3_opcode opcode; /* set/get OC-3 regs command opcode */ 34562306a36Sopenharmony_ci u32 regs_haddr; /* host DMA address of OC-3 regs buffer */ 34662306a36Sopenharmony_ci} oc3_block_t; 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_ci/* physical encoding statistics */ 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_citypedef struct stats_phy { 35262306a36Sopenharmony_ci __be32 crc_header_errors; /* cells received with bad header CRC */ 35362306a36Sopenharmony_ci __be32 framing_errors; /* cells received with bad framing */ 35462306a36Sopenharmony_ci __be32 pad[ 2 ]; /* i960 padding */ 35562306a36Sopenharmony_ci} stats_phy_t; 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_ci 35862306a36Sopenharmony_ci/* OC-3 statistics */ 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_citypedef struct stats_oc3 { 36162306a36Sopenharmony_ci __be32 section_bip8_errors; /* section 8 bit interleaved parity */ 36262306a36Sopenharmony_ci __be32 path_bip8_errors; /* path 8 bit interleaved parity */ 36362306a36Sopenharmony_ci __be32 line_bip24_errors; /* line 24 bit interleaved parity */ 36462306a36Sopenharmony_ci __be32 line_febe_errors; /* line far end block errors */ 36562306a36Sopenharmony_ci __be32 path_febe_errors; /* path far end block errors */ 36662306a36Sopenharmony_ci __be32 corr_hcs_errors; /* correctable header check sequence */ 36762306a36Sopenharmony_ci __be32 ucorr_hcs_errors; /* uncorrectable header check sequence */ 36862306a36Sopenharmony_ci __be32 pad[ 1 ]; /* i960 padding */ 36962306a36Sopenharmony_ci} stats_oc3_t; 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_ci 37262306a36Sopenharmony_ci/* ATM statistics */ 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_citypedef struct stats_atm { 37562306a36Sopenharmony_ci __be32 cells_transmitted; /* cells transmitted */ 37662306a36Sopenharmony_ci __be32 cells_received; /* cells received */ 37762306a36Sopenharmony_ci __be32 vpi_bad_range; /* cell drops: VPI out of range */ 37862306a36Sopenharmony_ci __be32 vpi_no_conn; /* cell drops: no connection for VPI */ 37962306a36Sopenharmony_ci __be32 vci_bad_range; /* cell drops: VCI out of range */ 38062306a36Sopenharmony_ci __be32 vci_no_conn; /* cell drops: no connection for VCI */ 38162306a36Sopenharmony_ci __be32 pad[ 2 ]; /* i960 padding */ 38262306a36Sopenharmony_ci} stats_atm_t; 38362306a36Sopenharmony_ci 38462306a36Sopenharmony_ci/* AAL0 statistics */ 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_citypedef struct stats_aal0 { 38762306a36Sopenharmony_ci __be32 cells_transmitted; /* cells transmitted */ 38862306a36Sopenharmony_ci __be32 cells_received; /* cells received */ 38962306a36Sopenharmony_ci __be32 cells_dropped; /* cells dropped */ 39062306a36Sopenharmony_ci __be32 pad[ 1 ]; /* i960 padding */ 39162306a36Sopenharmony_ci} stats_aal0_t; 39262306a36Sopenharmony_ci 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_ci/* AAL3/4 statistics */ 39562306a36Sopenharmony_ci 39662306a36Sopenharmony_citypedef struct stats_aal34 { 39762306a36Sopenharmony_ci __be32 cells_transmitted; /* cells transmitted from segmented PDUs */ 39862306a36Sopenharmony_ci __be32 cells_received; /* cells reassembled into PDUs */ 39962306a36Sopenharmony_ci __be32 cells_crc_errors; /* payload CRC error count */ 40062306a36Sopenharmony_ci __be32 cells_protocol_errors; /* SAR or CS layer protocol errors */ 40162306a36Sopenharmony_ci __be32 cells_dropped; /* cells dropped: partial reassembly */ 40262306a36Sopenharmony_ci __be32 cspdus_transmitted; /* CS PDUs transmitted */ 40362306a36Sopenharmony_ci __be32 cspdus_received; /* CS PDUs received */ 40462306a36Sopenharmony_ci __be32 cspdus_protocol_errors; /* CS layer protocol errors */ 40562306a36Sopenharmony_ci __be32 cspdus_dropped; /* reassembled PDUs drop'd (in cells) */ 40662306a36Sopenharmony_ci __be32 pad[ 3 ]; /* i960 padding */ 40762306a36Sopenharmony_ci} stats_aal34_t; 40862306a36Sopenharmony_ci 40962306a36Sopenharmony_ci 41062306a36Sopenharmony_ci/* AAL5 statistics */ 41162306a36Sopenharmony_ci 41262306a36Sopenharmony_citypedef struct stats_aal5 { 41362306a36Sopenharmony_ci __be32 cells_transmitted; /* cells transmitted from segmented SDUs */ 41462306a36Sopenharmony_ci __be32 cells_received; /* cells reassembled into SDUs */ 41562306a36Sopenharmony_ci __be32 cells_dropped; /* reassembled PDUs dropped (in cells) */ 41662306a36Sopenharmony_ci __be32 congestion_experienced; /* CRC error and length wrong */ 41762306a36Sopenharmony_ci __be32 cspdus_transmitted; /* CS PDUs transmitted */ 41862306a36Sopenharmony_ci __be32 cspdus_received; /* CS PDUs received */ 41962306a36Sopenharmony_ci __be32 cspdus_crc_errors; /* CS PDUs CRC errors */ 42062306a36Sopenharmony_ci __be32 cspdus_protocol_errors; /* CS layer protocol errors */ 42162306a36Sopenharmony_ci __be32 cspdus_dropped; /* reassembled PDUs dropped */ 42262306a36Sopenharmony_ci __be32 pad[ 3 ]; /* i960 padding */ 42362306a36Sopenharmony_ci} stats_aal5_t; 42462306a36Sopenharmony_ci 42562306a36Sopenharmony_ci 42662306a36Sopenharmony_ci/* auxiliary statistics */ 42762306a36Sopenharmony_ci 42862306a36Sopenharmony_citypedef struct stats_aux { 42962306a36Sopenharmony_ci __be32 small_b1_failed; /* receive BD allocation failures */ 43062306a36Sopenharmony_ci __be32 large_b1_failed; /* receive BD allocation failures */ 43162306a36Sopenharmony_ci __be32 small_b2_failed; /* receive BD allocation failures */ 43262306a36Sopenharmony_ci __be32 large_b2_failed; /* receive BD allocation failures */ 43362306a36Sopenharmony_ci __be32 rpd_alloc_failed; /* receive PDU allocation failures */ 43462306a36Sopenharmony_ci __be32 receive_carrier; /* no carrier = 0, carrier = 1 */ 43562306a36Sopenharmony_ci __be32 pad[ 2 ]; /* i960 padding */ 43662306a36Sopenharmony_ci} stats_aux_t; 43762306a36Sopenharmony_ci 43862306a36Sopenharmony_ci 43962306a36Sopenharmony_ci/* whole statistics buffer */ 44062306a36Sopenharmony_ci 44162306a36Sopenharmony_citypedef struct stats { 44262306a36Sopenharmony_ci struct stats_phy phy; /* physical encoding statistics */ 44362306a36Sopenharmony_ci struct stats_oc3 oc3; /* OC-3 statistics */ 44462306a36Sopenharmony_ci struct stats_atm atm; /* ATM statistics */ 44562306a36Sopenharmony_ci struct stats_aal0 aal0; /* AAL0 statistics */ 44662306a36Sopenharmony_ci struct stats_aal34 aal34; /* AAL3/4 statistics */ 44762306a36Sopenharmony_ci struct stats_aal5 aal5; /* AAL5 statistics */ 44862306a36Sopenharmony_ci struct stats_aux aux; /* auxiliary statistics */ 44962306a36Sopenharmony_ci} stats_t; 45062306a36Sopenharmony_ci 45162306a36Sopenharmony_ci 45262306a36Sopenharmony_ci/* get statistics command opcode */ 45362306a36Sopenharmony_ci 45462306a36Sopenharmony_citypedef struct stats_opcode { 45562306a36Sopenharmony_ci BITFIELD2( 45662306a36Sopenharmony_ci enum opcode opcode : 8, /* cp opcode */ 45762306a36Sopenharmony_ci u32 pad : 24 /* reserved */ 45862306a36Sopenharmony_ci ) 45962306a36Sopenharmony_ci} stats_opcode_t; 46062306a36Sopenharmony_ci 46162306a36Sopenharmony_ci 46262306a36Sopenharmony_ci/* get statistics command block */ 46362306a36Sopenharmony_ci 46462306a36Sopenharmony_citypedef struct stats_block { 46562306a36Sopenharmony_ci struct stats_opcode opcode; /* get statistics command opcode */ 46662306a36Sopenharmony_ci u32 stats_haddr; /* host DMA address of stats buffer */ 46762306a36Sopenharmony_ci} stats_block_t; 46862306a36Sopenharmony_ci 46962306a36Sopenharmony_ci 47062306a36Sopenharmony_ci/* expansion PROM data (PCI specific) */ 47162306a36Sopenharmony_ci 47262306a36Sopenharmony_citypedef struct prom_data { 47362306a36Sopenharmony_ci u32 hw_revision; /* hardware revision */ 47462306a36Sopenharmony_ci u32 serial_number; /* board serial number */ 47562306a36Sopenharmony_ci u8 mac_addr[ 8 ]; /* board MAC address */ 47662306a36Sopenharmony_ci} prom_data_t; 47762306a36Sopenharmony_ci 47862306a36Sopenharmony_ci 47962306a36Sopenharmony_ci/* get expansion PROM data command opcode */ 48062306a36Sopenharmony_ci 48162306a36Sopenharmony_citypedef struct prom_opcode { 48262306a36Sopenharmony_ci BITFIELD2( 48362306a36Sopenharmony_ci enum opcode opcode : 8, /* cp opcode */ 48462306a36Sopenharmony_ci u32 pad : 24 /* reserved */ 48562306a36Sopenharmony_ci ) 48662306a36Sopenharmony_ci} prom_opcode_t; 48762306a36Sopenharmony_ci 48862306a36Sopenharmony_ci 48962306a36Sopenharmony_ci/* get expansion PROM data command block */ 49062306a36Sopenharmony_ci 49162306a36Sopenharmony_citypedef struct prom_block { 49262306a36Sopenharmony_ci struct prom_opcode opcode; /* get PROM data command opcode */ 49362306a36Sopenharmony_ci u32 prom_haddr; /* host DMA address of PROM buffer */ 49462306a36Sopenharmony_ci} prom_block_t; 49562306a36Sopenharmony_ci 49662306a36Sopenharmony_ci 49762306a36Sopenharmony_ci/* cp command */ 49862306a36Sopenharmony_ci 49962306a36Sopenharmony_citypedef union cmd { 50062306a36Sopenharmony_ci enum opcode opcode; /* operation code */ 50162306a36Sopenharmony_ci struct activate_block activate_block; /* activate VC */ 50262306a36Sopenharmony_ci struct deactivate_block deactivate_block; /* deactivate VC */ 50362306a36Sopenharmony_ci struct stats_block stats_block; /* get statistics */ 50462306a36Sopenharmony_ci struct prom_block prom_block; /* get expansion PROM data */ 50562306a36Sopenharmony_ci struct oc3_block oc3_block; /* get/set OC-3 registers */ 50662306a36Sopenharmony_ci u32 pad[ 4 ]; /* i960 padding */ 50762306a36Sopenharmony_ci} cmd_t; 50862306a36Sopenharmony_ci 50962306a36Sopenharmony_ci 51062306a36Sopenharmony_ci/* cp resident command queue */ 51162306a36Sopenharmony_ci 51262306a36Sopenharmony_citypedef struct cp_cmdq_entry { 51362306a36Sopenharmony_ci union cmd cmd; /* command */ 51462306a36Sopenharmony_ci u32 status_haddr; /* host DMA address of completion status */ 51562306a36Sopenharmony_ci u32 pad[ 3 ]; /* i960 padding */ 51662306a36Sopenharmony_ci} cp_cmdq_entry_t; 51762306a36Sopenharmony_ci 51862306a36Sopenharmony_ci 51962306a36Sopenharmony_ci/* host resident transmit queue entry */ 52062306a36Sopenharmony_ci 52162306a36Sopenharmony_citypedef struct host_txq_entry { 52262306a36Sopenharmony_ci struct cp_txq_entry __iomem *cp_entry; /* addr of cp resident tx queue entry */ 52362306a36Sopenharmony_ci enum status* status; /* addr of host resident status */ 52462306a36Sopenharmony_ci struct tpd* tpd; /* addr of transmit PDU descriptor */ 52562306a36Sopenharmony_ci u32 tpd_dma; /* DMA address of tpd */ 52662306a36Sopenharmony_ci struct sk_buff* skb; /* related skb */ 52762306a36Sopenharmony_ci void* data; /* copy of misaligned data */ 52862306a36Sopenharmony_ci unsigned long incarn; /* vc_map incarnation when submitted for tx */ 52962306a36Sopenharmony_ci struct fore200e_vc_map* vc_map; 53062306a36Sopenharmony_ci 53162306a36Sopenharmony_ci} host_txq_entry_t; 53262306a36Sopenharmony_ci 53362306a36Sopenharmony_ci 53462306a36Sopenharmony_ci/* host resident receive queue entry */ 53562306a36Sopenharmony_ci 53662306a36Sopenharmony_citypedef struct host_rxq_entry { 53762306a36Sopenharmony_ci struct cp_rxq_entry __iomem *cp_entry; /* addr of cp resident rx queue entry */ 53862306a36Sopenharmony_ci enum status* status; /* addr of host resident status */ 53962306a36Sopenharmony_ci struct rpd* rpd; /* addr of receive PDU descriptor */ 54062306a36Sopenharmony_ci u32 rpd_dma; /* DMA address of rpd */ 54162306a36Sopenharmony_ci} host_rxq_entry_t; 54262306a36Sopenharmony_ci 54362306a36Sopenharmony_ci 54462306a36Sopenharmony_ci/* host resident buffer supply queue entry */ 54562306a36Sopenharmony_ci 54662306a36Sopenharmony_citypedef struct host_bsq_entry { 54762306a36Sopenharmony_ci struct cp_bsq_entry __iomem *cp_entry; /* addr of cp resident buffer supply queue entry */ 54862306a36Sopenharmony_ci enum status* status; /* addr of host resident status */ 54962306a36Sopenharmony_ci struct rbd_block* rbd_block; /* addr of receive buffer descriptor block */ 55062306a36Sopenharmony_ci u32 rbd_block_dma; /* DMA address od rdb */ 55162306a36Sopenharmony_ci} host_bsq_entry_t; 55262306a36Sopenharmony_ci 55362306a36Sopenharmony_ci 55462306a36Sopenharmony_ci/* host resident command queue entry */ 55562306a36Sopenharmony_ci 55662306a36Sopenharmony_citypedef struct host_cmdq_entry { 55762306a36Sopenharmony_ci struct cp_cmdq_entry __iomem *cp_entry; /* addr of cp resident cmd queue entry */ 55862306a36Sopenharmony_ci enum status *status; /* addr of host resident status */ 55962306a36Sopenharmony_ci} host_cmdq_entry_t; 56062306a36Sopenharmony_ci 56162306a36Sopenharmony_ci 56262306a36Sopenharmony_ci/* chunk of memory */ 56362306a36Sopenharmony_ci 56462306a36Sopenharmony_citypedef struct chunk { 56562306a36Sopenharmony_ci void* alloc_addr; /* base address of allocated chunk */ 56662306a36Sopenharmony_ci void* align_addr; /* base address of aligned chunk */ 56762306a36Sopenharmony_ci dma_addr_t dma_addr; /* DMA address of aligned chunk */ 56862306a36Sopenharmony_ci int direction; /* direction of DMA mapping */ 56962306a36Sopenharmony_ci u32 alloc_size; /* length of allocated chunk */ 57062306a36Sopenharmony_ci u32 align_size; /* length of aligned chunk */ 57162306a36Sopenharmony_ci} chunk_t; 57262306a36Sopenharmony_ci 57362306a36Sopenharmony_ci#define dma_size align_size /* DMA useable size */ 57462306a36Sopenharmony_ci 57562306a36Sopenharmony_ci 57662306a36Sopenharmony_ci/* host resident receive buffer */ 57762306a36Sopenharmony_ci 57862306a36Sopenharmony_citypedef struct buffer { 57962306a36Sopenharmony_ci struct buffer* next; /* next receive buffer */ 58062306a36Sopenharmony_ci enum buffer_scheme scheme; /* buffer scheme */ 58162306a36Sopenharmony_ci enum buffer_magn magn; /* buffer magnitude */ 58262306a36Sopenharmony_ci struct chunk data; /* data buffer */ 58362306a36Sopenharmony_ci#ifdef FORE200E_BSQ_DEBUG 58462306a36Sopenharmony_ci unsigned long index; /* buffer # in queue */ 58562306a36Sopenharmony_ci int supplied; /* 'buffer supplied' flag */ 58662306a36Sopenharmony_ci#endif 58762306a36Sopenharmony_ci} buffer_t; 58862306a36Sopenharmony_ci 58962306a36Sopenharmony_ci 59062306a36Sopenharmony_ci#if (BITS_PER_LONG == 32) 59162306a36Sopenharmony_ci#define FORE200E_BUF2HDL(buffer) ((u32)(buffer)) 59262306a36Sopenharmony_ci#define FORE200E_HDL2BUF(handle) ((struct buffer*)(handle)) 59362306a36Sopenharmony_ci#else /* deal with 64 bit pointers */ 59462306a36Sopenharmony_ci#define FORE200E_BUF2HDL(buffer) ((u32)((u64)(buffer))) 59562306a36Sopenharmony_ci#define FORE200E_HDL2BUF(handle) ((struct buffer*)(((u64)(handle)) | PAGE_OFFSET)) 59662306a36Sopenharmony_ci#endif 59762306a36Sopenharmony_ci 59862306a36Sopenharmony_ci 59962306a36Sopenharmony_ci/* host resident command queue */ 60062306a36Sopenharmony_ci 60162306a36Sopenharmony_citypedef struct host_cmdq { 60262306a36Sopenharmony_ci struct host_cmdq_entry host_entry[ QUEUE_SIZE_CMD ]; /* host resident cmd queue entries */ 60362306a36Sopenharmony_ci int head; /* head of cmd queue */ 60462306a36Sopenharmony_ci struct chunk status; /* array of completion status */ 60562306a36Sopenharmony_ci} host_cmdq_t; 60662306a36Sopenharmony_ci 60762306a36Sopenharmony_ci 60862306a36Sopenharmony_ci/* host resident transmit queue */ 60962306a36Sopenharmony_ci 61062306a36Sopenharmony_citypedef struct host_txq { 61162306a36Sopenharmony_ci struct host_txq_entry host_entry[ QUEUE_SIZE_TX ]; /* host resident tx queue entries */ 61262306a36Sopenharmony_ci int head; /* head of tx queue */ 61362306a36Sopenharmony_ci int tail; /* tail of tx queue */ 61462306a36Sopenharmony_ci struct chunk tpd; /* array of tpds */ 61562306a36Sopenharmony_ci struct chunk status; /* arry of completion status */ 61662306a36Sopenharmony_ci int txing; /* number of pending PDUs in tx queue */ 61762306a36Sopenharmony_ci} host_txq_t; 61862306a36Sopenharmony_ci 61962306a36Sopenharmony_ci 62062306a36Sopenharmony_ci/* host resident receive queue */ 62162306a36Sopenharmony_ci 62262306a36Sopenharmony_citypedef struct host_rxq { 62362306a36Sopenharmony_ci struct host_rxq_entry host_entry[ QUEUE_SIZE_RX ]; /* host resident rx queue entries */ 62462306a36Sopenharmony_ci int head; /* head of rx queue */ 62562306a36Sopenharmony_ci struct chunk rpd; /* array of rpds */ 62662306a36Sopenharmony_ci struct chunk status; /* array of completion status */ 62762306a36Sopenharmony_ci} host_rxq_t; 62862306a36Sopenharmony_ci 62962306a36Sopenharmony_ci 63062306a36Sopenharmony_ci/* host resident buffer supply queues */ 63162306a36Sopenharmony_ci 63262306a36Sopenharmony_citypedef struct host_bsq { 63362306a36Sopenharmony_ci struct host_bsq_entry host_entry[ QUEUE_SIZE_BS ]; /* host resident buffer supply queue entries */ 63462306a36Sopenharmony_ci int head; /* head of buffer supply queue */ 63562306a36Sopenharmony_ci struct chunk rbd_block; /* array of rbds */ 63662306a36Sopenharmony_ci struct chunk status; /* array of completion status */ 63762306a36Sopenharmony_ci struct buffer* buffer; /* array of rx buffers */ 63862306a36Sopenharmony_ci struct buffer* freebuf; /* list of free rx buffers */ 63962306a36Sopenharmony_ci volatile int freebuf_count; /* count of free rx buffers */ 64062306a36Sopenharmony_ci} host_bsq_t; 64162306a36Sopenharmony_ci 64262306a36Sopenharmony_ci 64362306a36Sopenharmony_ci/* header of the firmware image */ 64462306a36Sopenharmony_ci 64562306a36Sopenharmony_citypedef struct fw_header { 64662306a36Sopenharmony_ci __le32 magic; /* magic number */ 64762306a36Sopenharmony_ci __le32 version; /* firmware version id */ 64862306a36Sopenharmony_ci __le32 load_offset; /* fw load offset in board memory */ 64962306a36Sopenharmony_ci __le32 start_offset; /* fw execution start address in board memory */ 65062306a36Sopenharmony_ci} fw_header_t; 65162306a36Sopenharmony_ci 65262306a36Sopenharmony_ci#define FW_HEADER_MAGIC 0x65726f66 /* 'fore' */ 65362306a36Sopenharmony_ci 65462306a36Sopenharmony_ci 65562306a36Sopenharmony_ci/* receive buffer supply queues scheme specification */ 65662306a36Sopenharmony_ci 65762306a36Sopenharmony_citypedef struct bs_spec { 65862306a36Sopenharmony_ci u32 queue_length; /* queue capacity */ 65962306a36Sopenharmony_ci u32 buffer_size; /* host buffer size */ 66062306a36Sopenharmony_ci u32 pool_size; /* number of rbds */ 66162306a36Sopenharmony_ci u32 supply_blksize; /* num of rbds in I/O block (multiple 66262306a36Sopenharmony_ci of 4 between 4 and 124 inclusive) */ 66362306a36Sopenharmony_ci} bs_spec_t; 66462306a36Sopenharmony_ci 66562306a36Sopenharmony_ci 66662306a36Sopenharmony_ci/* initialization command block (one-time command, not in cmd queue) */ 66762306a36Sopenharmony_ci 66862306a36Sopenharmony_citypedef struct init_block { 66962306a36Sopenharmony_ci enum opcode opcode; /* initialize command */ 67062306a36Sopenharmony_ci enum status status; /* related status word */ 67162306a36Sopenharmony_ci u32 receive_threshold; /* not used */ 67262306a36Sopenharmony_ci u32 num_connect; /* ATM connections */ 67362306a36Sopenharmony_ci u32 cmd_queue_len; /* length of command queue */ 67462306a36Sopenharmony_ci u32 tx_queue_len; /* length of transmit queue */ 67562306a36Sopenharmony_ci u32 rx_queue_len; /* length of receive queue */ 67662306a36Sopenharmony_ci u32 rsd_extension; /* number of extra 32 byte blocks */ 67762306a36Sopenharmony_ci u32 tsd_extension; /* number of extra 32 byte blocks */ 67862306a36Sopenharmony_ci u32 conless_vpvc; /* not used */ 67962306a36Sopenharmony_ci u32 pad[ 2 ]; /* force quad alignment */ 68062306a36Sopenharmony_ci struct bs_spec bs_spec[ BUFFER_SCHEME_NBR ][ BUFFER_MAGN_NBR ]; /* buffer supply queues spec */ 68162306a36Sopenharmony_ci} init_block_t; 68262306a36Sopenharmony_ci 68362306a36Sopenharmony_ci 68462306a36Sopenharmony_citypedef enum media_type { 68562306a36Sopenharmony_ci MEDIA_TYPE_CAT5_UTP = 0x06, /* unshielded twisted pair */ 68662306a36Sopenharmony_ci MEDIA_TYPE_MM_OC3_ST = 0x16, /* multimode fiber ST */ 68762306a36Sopenharmony_ci MEDIA_TYPE_MM_OC3_SC = 0x26, /* multimode fiber SC */ 68862306a36Sopenharmony_ci MEDIA_TYPE_SM_OC3_ST = 0x36, /* single-mode fiber ST */ 68962306a36Sopenharmony_ci MEDIA_TYPE_SM_OC3_SC = 0x46 /* single-mode fiber SC */ 69062306a36Sopenharmony_ci} media_type_t; 69162306a36Sopenharmony_ci 69262306a36Sopenharmony_ci#define FORE200E_MEDIA_INDEX(media_type) ((media_type)>>4) 69362306a36Sopenharmony_ci 69462306a36Sopenharmony_ci 69562306a36Sopenharmony_ci/* cp resident queues */ 69662306a36Sopenharmony_ci 69762306a36Sopenharmony_citypedef struct cp_queues { 69862306a36Sopenharmony_ci u32 cp_cmdq; /* command queue */ 69962306a36Sopenharmony_ci u32 cp_txq; /* transmit queue */ 70062306a36Sopenharmony_ci u32 cp_rxq; /* receive queue */ 70162306a36Sopenharmony_ci u32 cp_bsq[ BUFFER_SCHEME_NBR ][ BUFFER_MAGN_NBR ]; /* buffer supply queues */ 70262306a36Sopenharmony_ci u32 imask; /* 1 enables cp to host interrupts */ 70362306a36Sopenharmony_ci u32 istat; /* 1 for interrupt posted */ 70462306a36Sopenharmony_ci u32 heap_base; /* offset form beginning of ram */ 70562306a36Sopenharmony_ci u32 heap_size; /* space available for queues */ 70662306a36Sopenharmony_ci u32 hlogger; /* non zero for host logging */ 70762306a36Sopenharmony_ci u32 heartbeat; /* cp heartbeat */ 70862306a36Sopenharmony_ci u32 fw_release; /* firmware version */ 70962306a36Sopenharmony_ci u32 mon960_release; /* i960 monitor version */ 71062306a36Sopenharmony_ci u32 tq_plen; /* transmit throughput measurements */ 71162306a36Sopenharmony_ci /* make sure the init block remains on a quad word boundary */ 71262306a36Sopenharmony_ci struct init_block init; /* one time cmd, not in cmd queue */ 71362306a36Sopenharmony_ci enum media_type media_type; /* media type id */ 71462306a36Sopenharmony_ci u32 oc3_revision; /* OC-3 revision number */ 71562306a36Sopenharmony_ci} cp_queues_t; 71662306a36Sopenharmony_ci 71762306a36Sopenharmony_ci 71862306a36Sopenharmony_ci/* boot status */ 71962306a36Sopenharmony_ci 72062306a36Sopenharmony_citypedef enum boot_status { 72162306a36Sopenharmony_ci BSTAT_COLD_START = (u32) 0xc01dc01d, /* cold start */ 72262306a36Sopenharmony_ci BSTAT_SELFTEST_OK = (u32) 0x02201958, /* self-test ok */ 72362306a36Sopenharmony_ci BSTAT_SELFTEST_FAIL = (u32) 0xadbadbad, /* self-test failed */ 72462306a36Sopenharmony_ci BSTAT_CP_RUNNING = (u32) 0xce11feed, /* cp is running */ 72562306a36Sopenharmony_ci BSTAT_MON_TOO_BIG = (u32) 0x10aded00 /* i960 monitor is too big */ 72662306a36Sopenharmony_ci} boot_status_t; 72762306a36Sopenharmony_ci 72862306a36Sopenharmony_ci 72962306a36Sopenharmony_ci/* software UART */ 73062306a36Sopenharmony_ci 73162306a36Sopenharmony_citypedef struct soft_uart { 73262306a36Sopenharmony_ci u32 send; /* write register */ 73362306a36Sopenharmony_ci u32 recv; /* read register */ 73462306a36Sopenharmony_ci} soft_uart_t; 73562306a36Sopenharmony_ci 73662306a36Sopenharmony_ci#define FORE200E_CP_MONITOR_UART_FREE 0x00000000 73762306a36Sopenharmony_ci#define FORE200E_CP_MONITOR_UART_AVAIL 0x01000000 73862306a36Sopenharmony_ci 73962306a36Sopenharmony_ci 74062306a36Sopenharmony_ci/* i960 monitor */ 74162306a36Sopenharmony_ci 74262306a36Sopenharmony_citypedef struct cp_monitor { 74362306a36Sopenharmony_ci struct soft_uart soft_uart; /* software UART */ 74462306a36Sopenharmony_ci enum boot_status bstat; /* boot status */ 74562306a36Sopenharmony_ci u32 app_base; /* application base offset */ 74662306a36Sopenharmony_ci u32 mon_version; /* i960 monitor version */ 74762306a36Sopenharmony_ci} cp_monitor_t; 74862306a36Sopenharmony_ci 74962306a36Sopenharmony_ci 75062306a36Sopenharmony_ci/* device state */ 75162306a36Sopenharmony_ci 75262306a36Sopenharmony_citypedef enum fore200e_state { 75362306a36Sopenharmony_ci FORE200E_STATE_BLANK, /* initial state */ 75462306a36Sopenharmony_ci FORE200E_STATE_REGISTER, /* device registered */ 75562306a36Sopenharmony_ci FORE200E_STATE_CONFIGURE, /* bus interface configured */ 75662306a36Sopenharmony_ci FORE200E_STATE_MAP, /* board space mapped in host memory */ 75762306a36Sopenharmony_ci FORE200E_STATE_RESET, /* board resetted */ 75862306a36Sopenharmony_ci FORE200E_STATE_START_FW, /* firmware started */ 75962306a36Sopenharmony_ci FORE200E_STATE_INITIALIZE, /* initialize command successful */ 76062306a36Sopenharmony_ci FORE200E_STATE_INIT_CMDQ, /* command queue initialized */ 76162306a36Sopenharmony_ci FORE200E_STATE_INIT_TXQ, /* transmit queue initialized */ 76262306a36Sopenharmony_ci FORE200E_STATE_INIT_RXQ, /* receive queue initialized */ 76362306a36Sopenharmony_ci FORE200E_STATE_INIT_BSQ, /* buffer supply queue initialized */ 76462306a36Sopenharmony_ci FORE200E_STATE_ALLOC_BUF, /* receive buffers allocated */ 76562306a36Sopenharmony_ci FORE200E_STATE_IRQ, /* host interrupt requested */ 76662306a36Sopenharmony_ci FORE200E_STATE_COMPLETE /* initialization completed */ 76762306a36Sopenharmony_ci} fore200e_state; 76862306a36Sopenharmony_ci 76962306a36Sopenharmony_ci 77062306a36Sopenharmony_ci/* PCA-200E registers */ 77162306a36Sopenharmony_ci 77262306a36Sopenharmony_citypedef struct fore200e_pca_regs { 77362306a36Sopenharmony_ci volatile u32 __iomem * hcr; /* address of host control register */ 77462306a36Sopenharmony_ci volatile u32 __iomem * imr; /* address of host interrupt mask register */ 77562306a36Sopenharmony_ci volatile u32 __iomem * psr; /* address of PCI specific register */ 77662306a36Sopenharmony_ci} fore200e_pca_regs_t; 77762306a36Sopenharmony_ci 77862306a36Sopenharmony_ci 77962306a36Sopenharmony_ci/* SBA-200E registers */ 78062306a36Sopenharmony_ci 78162306a36Sopenharmony_citypedef struct fore200e_sba_regs { 78262306a36Sopenharmony_ci u32 __iomem *hcr; /* address of host control register */ 78362306a36Sopenharmony_ci u32 __iomem *bsr; /* address of burst transfer size register */ 78462306a36Sopenharmony_ci u32 __iomem *isr; /* address of interrupt level selection register */ 78562306a36Sopenharmony_ci} fore200e_sba_regs_t; 78662306a36Sopenharmony_ci 78762306a36Sopenharmony_ci 78862306a36Sopenharmony_ci/* model-specific registers */ 78962306a36Sopenharmony_ci 79062306a36Sopenharmony_citypedef union fore200e_regs { 79162306a36Sopenharmony_ci struct fore200e_pca_regs pca; /* PCA-200E registers */ 79262306a36Sopenharmony_ci struct fore200e_sba_regs sba; /* SBA-200E registers */ 79362306a36Sopenharmony_ci} fore200e_regs; 79462306a36Sopenharmony_ci 79562306a36Sopenharmony_ci 79662306a36Sopenharmony_cistruct fore200e; 79762306a36Sopenharmony_ci 79862306a36Sopenharmony_ci/* bus-dependent data */ 79962306a36Sopenharmony_ci 80062306a36Sopenharmony_citypedef struct fore200e_bus { 80162306a36Sopenharmony_ci char* model_name; /* board model name */ 80262306a36Sopenharmony_ci char* proc_name; /* board name under /proc/atm */ 80362306a36Sopenharmony_ci int descr_alignment; /* tpd/rpd/rbd DMA alignment requirement */ 80462306a36Sopenharmony_ci int buffer_alignment; /* rx buffers DMA alignment requirement */ 80562306a36Sopenharmony_ci int status_alignment; /* status words DMA alignment requirement */ 80662306a36Sopenharmony_ci u32 (*read)(volatile u32 __iomem *); 80762306a36Sopenharmony_ci void (*write)(u32, volatile u32 __iomem *); 80862306a36Sopenharmony_ci int (*configure)(struct fore200e*); 80962306a36Sopenharmony_ci int (*map)(struct fore200e*); 81062306a36Sopenharmony_ci void (*reset)(struct fore200e*); 81162306a36Sopenharmony_ci int (*prom_read)(struct fore200e*, struct prom_data*); 81262306a36Sopenharmony_ci void (*unmap)(struct fore200e*); 81362306a36Sopenharmony_ci void (*irq_enable)(struct fore200e*); 81462306a36Sopenharmony_ci int (*irq_check)(struct fore200e*); 81562306a36Sopenharmony_ci void (*irq_ack)(struct fore200e*); 81662306a36Sopenharmony_ci int (*proc_read)(struct fore200e*, char*); 81762306a36Sopenharmony_ci} fore200e_bus_t; 81862306a36Sopenharmony_ci 81962306a36Sopenharmony_ci/* vc mapping */ 82062306a36Sopenharmony_ci 82162306a36Sopenharmony_citypedef struct fore200e_vc_map { 82262306a36Sopenharmony_ci struct atm_vcc* vcc; /* vcc entry */ 82362306a36Sopenharmony_ci unsigned long incarn; /* vcc incarnation number */ 82462306a36Sopenharmony_ci} fore200e_vc_map_t; 82562306a36Sopenharmony_ci 82662306a36Sopenharmony_ci#define FORE200E_VC_MAP(fore200e, vpi, vci) \ 82762306a36Sopenharmony_ci (& (fore200e)->vc_map[ ((vpi) << FORE200E_VCI_BITS) | (vci) ]) 82862306a36Sopenharmony_ci 82962306a36Sopenharmony_ci 83062306a36Sopenharmony_ci/* per-device data */ 83162306a36Sopenharmony_ci 83262306a36Sopenharmony_citypedef struct fore200e { 83362306a36Sopenharmony_ci struct list_head entry; /* next device */ 83462306a36Sopenharmony_ci const struct fore200e_bus* bus; /* bus-dependent code and data */ 83562306a36Sopenharmony_ci union fore200e_regs regs; /* bus-dependent registers */ 83662306a36Sopenharmony_ci struct atm_dev* atm_dev; /* ATM device */ 83762306a36Sopenharmony_ci 83862306a36Sopenharmony_ci enum fore200e_state state; /* device state */ 83962306a36Sopenharmony_ci 84062306a36Sopenharmony_ci char name[16]; /* device name */ 84162306a36Sopenharmony_ci struct device *dev; 84262306a36Sopenharmony_ci int irq; /* irq number */ 84362306a36Sopenharmony_ci unsigned long phys_base; /* physical base address */ 84462306a36Sopenharmony_ci void __iomem * virt_base; /* virtual base address */ 84562306a36Sopenharmony_ci 84662306a36Sopenharmony_ci unsigned char esi[ ESI_LEN ]; /* end system identifier */ 84762306a36Sopenharmony_ci 84862306a36Sopenharmony_ci struct cp_monitor __iomem * cp_monitor; /* i960 monitor address */ 84962306a36Sopenharmony_ci struct cp_queues __iomem * cp_queues; /* cp resident queues */ 85062306a36Sopenharmony_ci struct host_cmdq host_cmdq; /* host resident cmd queue */ 85162306a36Sopenharmony_ci struct host_txq host_txq; /* host resident tx queue */ 85262306a36Sopenharmony_ci struct host_rxq host_rxq; /* host resident rx queue */ 85362306a36Sopenharmony_ci /* host resident buffer supply queues */ 85462306a36Sopenharmony_ci struct host_bsq host_bsq[ BUFFER_SCHEME_NBR ][ BUFFER_MAGN_NBR ]; 85562306a36Sopenharmony_ci 85662306a36Sopenharmony_ci u32 available_cell_rate; /* remaining pseudo-CBR bw on link */ 85762306a36Sopenharmony_ci 85862306a36Sopenharmony_ci int loop_mode; /* S/UNI loopback mode */ 85962306a36Sopenharmony_ci 86062306a36Sopenharmony_ci struct stats* stats; /* last snapshot of the stats */ 86162306a36Sopenharmony_ci 86262306a36Sopenharmony_ci struct mutex rate_mtx; /* protects rate reservation ops */ 86362306a36Sopenharmony_ci spinlock_t q_lock; /* protects queue ops */ 86462306a36Sopenharmony_ci#ifdef FORE200E_USE_TASKLET 86562306a36Sopenharmony_ci struct tasklet_struct tx_tasklet; /* performs tx interrupt work */ 86662306a36Sopenharmony_ci struct tasklet_struct rx_tasklet; /* performs rx interrupt work */ 86762306a36Sopenharmony_ci#endif 86862306a36Sopenharmony_ci unsigned long tx_sat; /* tx queue saturation count */ 86962306a36Sopenharmony_ci 87062306a36Sopenharmony_ci unsigned long incarn_count; 87162306a36Sopenharmony_ci struct fore200e_vc_map vc_map[ NBR_CONNECT ]; /* vc mapping */ 87262306a36Sopenharmony_ci} fore200e_t; 87362306a36Sopenharmony_ci 87462306a36Sopenharmony_ci 87562306a36Sopenharmony_ci/* per-vcc data */ 87662306a36Sopenharmony_ci 87762306a36Sopenharmony_citypedef struct fore200e_vcc { 87862306a36Sopenharmony_ci enum buffer_scheme scheme; /* rx buffer scheme */ 87962306a36Sopenharmony_ci struct tpd_rate rate; /* tx rate control data */ 88062306a36Sopenharmony_ci int rx_min_pdu; /* size of smallest PDU received */ 88162306a36Sopenharmony_ci int rx_max_pdu; /* size of largest PDU received */ 88262306a36Sopenharmony_ci int tx_min_pdu; /* size of smallest PDU transmitted */ 88362306a36Sopenharmony_ci int tx_max_pdu; /* size of largest PDU transmitted */ 88462306a36Sopenharmony_ci unsigned long tx_pdu; /* nbr of tx pdus */ 88562306a36Sopenharmony_ci unsigned long rx_pdu; /* nbr of rx pdus */ 88662306a36Sopenharmony_ci} fore200e_vcc_t; 88762306a36Sopenharmony_ci 88862306a36Sopenharmony_ci 88962306a36Sopenharmony_ci 89062306a36Sopenharmony_ci/* 200E-series common memory layout */ 89162306a36Sopenharmony_ci 89262306a36Sopenharmony_ci#define FORE200E_CP_MONITOR_OFFSET 0x00000400 /* i960 monitor interface */ 89362306a36Sopenharmony_ci#define FORE200E_CP_QUEUES_OFFSET 0x00004d40 /* cp resident queues */ 89462306a36Sopenharmony_ci 89562306a36Sopenharmony_ci 89662306a36Sopenharmony_ci/* PCA-200E memory layout */ 89762306a36Sopenharmony_ci 89862306a36Sopenharmony_ci#define PCA200E_IOSPACE_LENGTH 0x00200000 89962306a36Sopenharmony_ci 90062306a36Sopenharmony_ci#define PCA200E_HCR_OFFSET 0x00100000 /* board control register */ 90162306a36Sopenharmony_ci#define PCA200E_IMR_OFFSET 0x00100004 /* host IRQ mask register */ 90262306a36Sopenharmony_ci#define PCA200E_PSR_OFFSET 0x00100008 /* PCI specific register */ 90362306a36Sopenharmony_ci 90462306a36Sopenharmony_ci 90562306a36Sopenharmony_ci/* PCA-200E host control register */ 90662306a36Sopenharmony_ci 90762306a36Sopenharmony_ci#define PCA200E_HCR_RESET (1<<0) /* read / write */ 90862306a36Sopenharmony_ci#define PCA200E_HCR_HOLD_LOCK (1<<1) /* read / write */ 90962306a36Sopenharmony_ci#define PCA200E_HCR_I960FAIL (1<<2) /* read */ 91062306a36Sopenharmony_ci#define PCA200E_HCR_INTRB (1<<2) /* write */ 91162306a36Sopenharmony_ci#define PCA200E_HCR_HOLD_ACK (1<<3) /* read */ 91262306a36Sopenharmony_ci#define PCA200E_HCR_INTRA (1<<3) /* write */ 91362306a36Sopenharmony_ci#define PCA200E_HCR_OUTFULL (1<<4) /* read */ 91462306a36Sopenharmony_ci#define PCA200E_HCR_CLRINTR (1<<4) /* write */ 91562306a36Sopenharmony_ci#define PCA200E_HCR_ESPHOLD (1<<5) /* read */ 91662306a36Sopenharmony_ci#define PCA200E_HCR_INFULL (1<<6) /* read */ 91762306a36Sopenharmony_ci#define PCA200E_HCR_TESTMODE (1<<7) /* read */ 91862306a36Sopenharmony_ci 91962306a36Sopenharmony_ci 92062306a36Sopenharmony_ci/* PCA-200E PCI bus interface regs (offsets in PCI config space) */ 92162306a36Sopenharmony_ci 92262306a36Sopenharmony_ci#define PCA200E_PCI_LATENCY 0x40 /* maximum slave latenty */ 92362306a36Sopenharmony_ci#define PCA200E_PCI_MASTER_CTRL 0x41 /* master control */ 92462306a36Sopenharmony_ci#define PCA200E_PCI_THRESHOLD 0x42 /* burst / continuous req threshold */ 92562306a36Sopenharmony_ci 92662306a36Sopenharmony_ci/* PBI master control register */ 92762306a36Sopenharmony_ci 92862306a36Sopenharmony_ci#define PCA200E_CTRL_DIS_CACHE_RD (1<<0) /* disable cache-line reads */ 92962306a36Sopenharmony_ci#define PCA200E_CTRL_DIS_WRT_INVAL (1<<1) /* disable writes and invalidates */ 93062306a36Sopenharmony_ci#define PCA200E_CTRL_2_CACHE_WRT_INVAL (1<<2) /* require 2 cache-lines for writes and invalidates */ 93162306a36Sopenharmony_ci#define PCA200E_CTRL_IGN_LAT_TIMER (1<<3) /* ignore the latency timer */ 93262306a36Sopenharmony_ci#define PCA200E_CTRL_ENA_CONT_REQ_MODE (1<<4) /* enable continuous request mode */ 93362306a36Sopenharmony_ci#define PCA200E_CTRL_LARGE_PCI_BURSTS (1<<5) /* force large PCI bus bursts */ 93462306a36Sopenharmony_ci#define PCA200E_CTRL_CONVERT_ENDIAN (1<<6) /* convert endianess of slave RAM accesses */ 93562306a36Sopenharmony_ci 93662306a36Sopenharmony_ci 93762306a36Sopenharmony_ci 93862306a36Sopenharmony_ci#define SBA200E_PROM_NAME "FORE,sba-200e" /* device name in openprom tree */ 93962306a36Sopenharmony_ci 94062306a36Sopenharmony_ci 94162306a36Sopenharmony_ci/* size of SBA-200E registers */ 94262306a36Sopenharmony_ci 94362306a36Sopenharmony_ci#define SBA200E_HCR_LENGTH 4 94462306a36Sopenharmony_ci#define SBA200E_BSR_LENGTH 4 94562306a36Sopenharmony_ci#define SBA200E_ISR_LENGTH 4 94662306a36Sopenharmony_ci#define SBA200E_RAM_LENGTH 0x40000 94762306a36Sopenharmony_ci 94862306a36Sopenharmony_ci 94962306a36Sopenharmony_ci/* SBA-200E SBUS burst transfer size register */ 95062306a36Sopenharmony_ci 95162306a36Sopenharmony_ci#define SBA200E_BSR_BURST4 0x04 95262306a36Sopenharmony_ci#define SBA200E_BSR_BURST8 0x08 95362306a36Sopenharmony_ci#define SBA200E_BSR_BURST16 0x10 95462306a36Sopenharmony_ci 95562306a36Sopenharmony_ci 95662306a36Sopenharmony_ci/* SBA-200E host control register */ 95762306a36Sopenharmony_ci 95862306a36Sopenharmony_ci#define SBA200E_HCR_RESET (1<<0) /* read / write (sticky) */ 95962306a36Sopenharmony_ci#define SBA200E_HCR_HOLD_LOCK (1<<1) /* read / write (sticky) */ 96062306a36Sopenharmony_ci#define SBA200E_HCR_I960FAIL (1<<2) /* read */ 96162306a36Sopenharmony_ci#define SBA200E_HCR_I960SETINTR (1<<2) /* write */ 96262306a36Sopenharmony_ci#define SBA200E_HCR_OUTFULL (1<<3) /* read */ 96362306a36Sopenharmony_ci#define SBA200E_HCR_INTR_CLR (1<<3) /* write */ 96462306a36Sopenharmony_ci#define SBA200E_HCR_INTR_ENA (1<<4) /* read / write (sticky) */ 96562306a36Sopenharmony_ci#define SBA200E_HCR_ESPHOLD (1<<5) /* read */ 96662306a36Sopenharmony_ci#define SBA200E_HCR_INFULL (1<<6) /* read */ 96762306a36Sopenharmony_ci#define SBA200E_HCR_TESTMODE (1<<7) /* read */ 96862306a36Sopenharmony_ci#define SBA200E_HCR_INTR_REQ (1<<8) /* read */ 96962306a36Sopenharmony_ci 97062306a36Sopenharmony_ci#define SBA200E_HCR_STICKY (SBA200E_HCR_RESET | SBA200E_HCR_HOLD_LOCK | SBA200E_HCR_INTR_ENA) 97162306a36Sopenharmony_ci 97262306a36Sopenharmony_ci 97362306a36Sopenharmony_ci#endif /* __KERNEL__ */ 97462306a36Sopenharmony_ci#endif /* _FORE200E_H */ 975