^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-or-later */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) Madge Ambassador ATM Adapter driver.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) Copyright (C) 1995-1999 Madge Networks Ltd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #ifndef AMBASSADOR_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #define AMBASSADOR_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #ifdef CONFIG_ATM_AMBASSADOR_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #define DEBUG_AMBASSADOR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #define DEV_LABEL "amb"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #ifndef PCI_VENDOR_ID_MADGE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define PCI_VENDOR_ID_MADGE 0x10B6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #ifndef PCI_VENDOR_ID_MADGE_AMBASSADOR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define PCI_DEVICE_ID_MADGE_AMBASSADOR 0x1001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #ifndef PCI_VENDOR_ID_MADGE_AMBASSADOR_BAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define PCI_DEVICE_ID_MADGE_AMBASSADOR_BAD 0x1002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) // diagnostic output
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define PRINTK(severity,format,args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) printk(severity DEV_LABEL ": " format "\n" , ## args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #ifdef DEBUG_AMBASSADOR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define DBG_ERR 0x0001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define DBG_WARN 0x0002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define DBG_INFO 0x0004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define DBG_INIT 0x0008
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define DBG_LOAD 0x0010
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define DBG_VCC 0x0020
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define DBG_QOS 0x0040
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define DBG_CMD 0x0080
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define DBG_TX 0x0100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define DBG_RX 0x0200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define DBG_SKB 0x0400
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define DBG_POOL 0x0800
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define DBG_IRQ 0x1000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define DBG_FLOW 0x2000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define DBG_REGS 0x4000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define DBG_DATA 0x8000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define DBG_MASK 0xffff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) /* the ## prevents the annoying double expansion of the macro arguments */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) /* KERN_INFO is used since KERN_DEBUG often does not make it to the console */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define PRINTDB(bits,format,args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) ( (debug & (bits)) ? printk (KERN_INFO DEV_LABEL ": " format , ## args) : 1 )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define PRINTDM(bits,format,args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) ( (debug & (bits)) ? printk (format , ## args) : 1 )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define PRINTDE(bits,format,args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) ( (debug & (bits)) ? printk (format "\n" , ## args) : 1 )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define PRINTD(bits,format,args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) ( (debug & (bits)) ? printk (KERN_INFO DEV_LABEL ": " format "\n" , ## args) : 1 )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #define PRINTD(bits,format,args...)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define PRINTDB(bits,format,args...)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #define PRINTDM(bits,format,args...)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #define PRINTDE(bits,format,args...)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #define PRINTDD(bits,format,args...)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #define PRINTDDB(sec,fmt,args...)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #define PRINTDDM(sec,fmt,args...)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #define PRINTDDE(sec,fmt,args...)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) // tunable values (?)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) /* MUST be powers of two -- why ? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #define COM_Q_ENTRIES 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #define TX_Q_ENTRIES 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) #define RX_Q_ENTRIES 64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) // fixed values
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) // guessing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #define AMB_EXTENT 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) // Minimum allowed size for an Ambassador queue
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) #define MIN_QUEUE_SIZE 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) // Ambassador microcode allows 1 to 4 pools, we use 4 (simpler)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) #define NUM_RX_POOLS 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) // minimum RX buffers required to cope with replenishing delay
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) #define MIN_RX_BUFFERS 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) // minimum PCI latency we will tolerate (32 IS TOO SMALL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #define MIN_PCI_LATENCY 64 // 255
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) // VCs supported by card (VPI always 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #define NUM_VPI_BITS 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define NUM_VCI_BITS 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #define NUM_VCS 1024
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) /* The status field bits defined so far. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #define RX_ERR 0x8000 // always present if there is an error (hmm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #define CRC_ERR 0x4000 // AAL5 CRC error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #define LEN_ERR 0x2000 // overlength frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #define ABORT_ERR 0x1000 // zero length field in received frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #define UNUSED_ERR 0x0800 // buffer returned unused
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) // Adaptor commands
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) #define SRB_OPEN_VC 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) /* par_0: dwordswap(VC_number) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) /* par_1: dwordswap(flags<<16) or wordswap(flags)*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) /* flags: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) /* LANE: 0x0004 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) /* NOT_UBR: 0x0008 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) /* ABR: 0x0010 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) /* RxPool0: 0x0000 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) /* RxPool1: 0x0020 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) /* RxPool2: 0x0040 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) /* RxPool3: 0x0060 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) /* par_2: dwordswap(fp_rate<<16) or wordswap(fp_rate) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) #define SRB_CLOSE_VC 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) /* par_0: dwordswap(VC_number) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) #define SRB_GET_BIA 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) /* returns */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) /* par_0: dwordswap(half BIA) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) /* par_1: dwordswap(half BIA) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) #define SRB_GET_SUNI_STATS 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) /* par_0: dwordswap(physical_host_address) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) #define SRB_SET_BITS_8 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) #define SRB_SET_BITS_16 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) #define SRB_SET_BITS_32 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) #define SRB_CLEAR_BITS_8 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) #define SRB_CLEAR_BITS_16 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) #define SRB_CLEAR_BITS_32 9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) /* par_0: dwordswap(ATMizer address) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) /* par_1: dwordswap(mask) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) #define SRB_SET_8 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) #define SRB_SET_16 11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) #define SRB_SET_32 12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) /* par_0: dwordswap(ATMizer address) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) /* par_1: dwordswap(data) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) #define SRB_GET_32 13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) /* par_0: dwordswap(ATMizer address) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) /* returns */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) /* par_1: dwordswap(ATMizer data) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) #define SRB_GET_VERSION 14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) /* returns */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) /* par_0: dwordswap(Major Version) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) /* par_1: dwordswap(Minor Version) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) #define SRB_FLUSH_BUFFER_Q 15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) /* Only flags to define which buffer pool; all others must be zero */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) /* par_0: dwordswap(flags<<16) or wordswap(flags)*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) #define SRB_GET_DMA_SPEEDS 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) /* returns */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) /* par_0: dwordswap(Read speed (bytes/sec)) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) /* par_1: dwordswap(Write speed (bytes/sec)) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) #define SRB_MODIFY_VC_RATE 17
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) /* par_0: dwordswap(VC_number) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) /* par_1: dwordswap(fp_rate<<16) or wordswap(fp_rate) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) #define SRB_MODIFY_VC_FLAGS 18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) /* par_0: dwordswap(VC_number) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) /* par_1: dwordswap(flags<<16) or wordswap(flags)*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) /* flags: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) /* LANE: 0x0004 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) /* NOT_UBR: 0x0008 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) /* ABR: 0x0010 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) /* RxPool0: 0x0000 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) /* RxPool1: 0x0020 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) /* RxPool2: 0x0040 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) /* RxPool3: 0x0060 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) #define SRB_RATE_SHIFT 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) #define SRB_POOL_SHIFT (SRB_FLAGS_SHIFT+5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) #define SRB_FLAGS_SHIFT 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) #define SRB_STOP_TASKING 19
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) #define SRB_START_TASKING 20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) #define SRB_SHUT_DOWN 21
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) #define MAX_SRB 21
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) #define SRB_COMPLETE 0xffffffff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) #define TX_FRAME 0x80000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) // number of types of SRB MUST be a power of two -- why?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) #define NUM_OF_SRB 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) // number of bits of period info for rate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) #define MAX_RATE_BITS 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) #define TX_UBR 0x0000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) #define TX_UBR_CAPPED 0x0008
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) #define TX_ABR 0x0018
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) #define TX_FRAME_NOTCAP 0x0000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) #define TX_FRAME_CAPPED 0x8000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) #define FP_155_RATE 0x24b1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) #define FP_25_RATE 0x1f9d
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) /* #define VERSION_NUMBER 0x01000000 // initial release */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) /* #define VERSION_NUMBER 0x01010000 // fixed startup probs PLX MB0 not cleared */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) /* #define VERSION_NUMBER 0x01020000 // changed SUNI reset timings; allowed r/w onchip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) /* #define VERSION_NUMBER 0x01030000 // clear local doorbell int reg on reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) /* #define VERSION_NUMBER 0x01040000 // PLX bug work around version PLUS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) /* remove race conditions on basic interface */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) /* indicate to the host that diagnostics */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) /* have finished; if failed, how and what */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) /* failed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) /* fix host memory test to fix PLX bug */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) /* allow flash upgrade and BIA upgrade directly */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) /* */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) #define VERSION_NUMBER 0x01050025 /* Jason's first hacked version. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) /* Change in download algorithm */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) #define DMA_VALID 0xb728e149 /* completely random */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) #define FLASH_BASE 0xa0c00000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) #define FLASH_SIZE 0x00020000 /* 128K */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) #define BIA_BASE (FLASH_BASE+0x0001c000) /* Flash Sector 7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) #define BIA_ADDRESS ((void *)0xa0c1c000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) #define PLX_BASE 0xe0000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) typedef enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) host_memory_test = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) read_adapter_memory,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) write_adapter_memory,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) adapter_start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) get_version_number,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) interrupt_host,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) flash_erase_sector,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) adap_download_block = 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) adap_erase_flash,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) adap_run_in_iram,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) adap_end_download
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) } loader_command;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) #define BAD_COMMAND (-1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) #define COMMAND_IN_PROGRESS 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) #define COMMAND_PASSED_TEST 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) #define COMMAND_FAILED_TEST 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) #define COMMAND_READ_DATA_OK 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) #define COMMAND_READ_BAD_ADDRESS 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) #define COMMAND_WRITE_DATA_OK 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) #define COMMAND_WRITE_BAD_ADDRESS 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) #define COMMAND_WRITE_FLASH_FAILURE 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) #define COMMAND_COMPLETE 9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) #define COMMAND_FLASH_ERASE_FAILURE 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) #define COMMAND_WRITE_BAD_DATA 11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) /* bit fields for mailbox[0] return values */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) #define GPINT_TST_FAILURE 0x00000001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) #define SUNI_DATA_PATTERN_FAILURE 0x00000002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) #define SUNI_DATA_BITS_FAILURE 0x00000004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) #define SUNI_UTOPIA_FAILURE 0x00000008
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) #define SUNI_FIFO_FAILURE 0x00000010
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) #define SRAM_FAILURE 0x00000020
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) #define SELF_TEST_FAILURE 0x0000003f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) /* mailbox[1] = 0 in progress, -1 on completion */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) /* mailbox[2] = current test 00 00 test(8 bit) phase(8 bit) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) /* mailbox[3] = last failure, 00 00 test(8 bit) phase(8 bit) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) /* mailbox[4],mailbox[5],mailbox[6] random failure values */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) /* PLX/etc. memory map including command structure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) /* These registers may also be memory mapped in PCI memory */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) #define UNUSED_LOADER_MAILBOXES 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) typedef struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) u32 stuff[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) u32 result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) u32 ready;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) u32 stuff[UNUSED_LOADER_MAILBOXES];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) } loader;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) u32 cmd_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) u32 tx_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) u32 rx_address[NUM_RX_POOLS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) u32 gen_counter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) u32 spare;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) } adapter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) } mb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) u32 doorbell;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) u32 interrupt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) u32 interrupt_control;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) u32 reset_control;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) } amb_mem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) /* RESET bit, IRQ (card to host) and doorbell (host to card) enable bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) #define AMB_RESET_BITS 0x40000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) #define AMB_INTERRUPT_BITS 0x00000300
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) #define AMB_DOORBELL_BITS 0x00030000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) /* loader commands */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) #define MAX_COMMAND_DATA 13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) #define MAX_TRANSFER_DATA 11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) typedef struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) __be32 address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) __be32 count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) __be32 data[MAX_TRANSFER_DATA];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) } transfer_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) typedef struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) __be32 result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) __be32 command;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) transfer_block transfer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) __be32 version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) __be32 start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) __be32 data[MAX_COMMAND_DATA];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) } payload;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) __be32 valid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) } loader_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) /* command queue */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) /* Again all data are BIG ENDIAN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) typedef struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) __be32 vc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) __be32 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) __be32 rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) } open;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) __be32 vc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) __be32 rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) } modify_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) __be32 vc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) __be32 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) } modify_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) __be32 vc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) } close;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) __be32 lower4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) __be32 upper2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) } bia;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) __be32 address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) } suni;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) __be32 major;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) __be32 minor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) } version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) __be32 read;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) __be32 write;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) } speed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) __be32 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) } flush;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) __be32 address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) __be32 data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) } memory;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) __be32 par[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) } args;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) __be32 request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) } command;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) /* transmit queues and associated structures */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) /* The hosts transmit structure. All BIG ENDIAN; host address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) restricted to first 1GByte, but address passed to the card must
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) have the top MS bit or'ed in. -- check this */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) /* TX is described by 1+ tx_frags followed by a tx_frag_end */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) typedef struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) __be32 bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) __be32 address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) } tx_frag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) /* apart from handle the fields here are for the adapter to play with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) and should be set to zero */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) typedef struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) u32 handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) u16 vc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) u16 next_descriptor_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) u32 next_descriptor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) #ifdef AMB_NEW_MICROCODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) u8 cpcs_uu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) u8 cpi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) u16 pad;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) } tx_frag_end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) typedef struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) tx_frag tx_frag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) tx_frag_end tx_frag_end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) struct sk_buff * skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) } tx_simple;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) typedef union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) tx_frag fragment;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) tx_frag_end end_of_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) } tx_descr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) /* this "points" to the sequence of fragments and trailer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) typedef struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) __be16 vc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) __be16 tx_descr_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) __be32 tx_descr_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) } tx_in;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) /* handle is the handle from tx_in */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) typedef struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) u32 handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) } tx_out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) /* receive frame structure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) /* All BIG ENDIAN; handle is as passed from host; length is zero for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) aborted frames, and frames with errors. Header is actually VC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) number, lec-id is NOT yet supported. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) typedef struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) u32 handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) __be16 vc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) __be16 lec_id; // unused
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) __be16 status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) __be16 length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) } rx_out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) /* buffer supply structure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) typedef struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) u32 handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) __be32 host_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) } rx_in;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) /* This first structure is the area in host memory where the adapter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) writes its pointer values. These pointer values are BIG ENDIAN and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) reside in the same 4MB 'page' as this structure. The host gives the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) adapter the address of this block by sending a doorbell interrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) to the adapter after downloading the code and setting it going. The
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) addresses have the top 10 bits set to 1010000010b -- really?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) The host must initialise these before handing the block to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) adapter. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) typedef struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) __be32 command_start; /* SRB commands completions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) __be32 command_end; /* SRB commands completions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) __be32 tx_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) __be32 tx_end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) __be32 txcom_start; /* tx completions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) __be32 txcom_end; /* tx completions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) __be32 buffer_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) __be32 buffer_end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) u32 buffer_q_get;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) u32 buffer_q_end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) u32 buffer_aptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) __be32 rx_start; /* rx completions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) __be32 rx_end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) u32 rx_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) __be32 buffer_size; /* size of host buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) } rec_struct[NUM_RX_POOLS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) #ifdef AMB_NEW_MICROCODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) u16 init_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) u16 talk_block_spare;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) } adap_talk_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) /* This structure must be kept in line with the vcr image in sarmain.h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) This is the structure in the host filled in by the adapter by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) GET_SUNI_STATS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) typedef struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) u8 racp_chcs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) u8 racp_uhcs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) u16 spare;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) u32 racp_rcell;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) u32 tacp_tcell;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) u32 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) u32 dropped_cells;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) u32 dropped_frames;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) } suni_stats;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) typedef enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) dead
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) } amb_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) #define NEXTQ(current,start,limit) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) ( (current)+1 < (limit) ? (current)+1 : (start) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) typedef struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) command * start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) command * in;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) command * out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) command * limit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) } amb_cq_ptrs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) typedef struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) spinlock_t lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) unsigned int pending;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) unsigned int high;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) unsigned int filled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) unsigned int maximum; // size - 1 (q implementation)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) amb_cq_ptrs ptrs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) } amb_cq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) typedef struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) spinlock_t lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) unsigned int pending;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) unsigned int high;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) unsigned int filled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) unsigned int maximum; // size - 1 (q implementation)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) tx_in * start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) tx_in * ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) tx_in * limit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) } in;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) tx_out * start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) tx_out * ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) tx_out * limit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) } out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) } amb_txq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) typedef struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) spinlock_t lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) unsigned int pending;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) unsigned int low;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) unsigned int emptied;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) unsigned int maximum; // size - 1 (q implementation)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) rx_in * start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) rx_in * ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) rx_in * limit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) } in;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) rx_out * start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) rx_out * ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) rx_out * limit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) } out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) unsigned int buffers_wanted;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) unsigned int buffer_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) } amb_rxq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) typedef struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) unsigned long tx_ok;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) unsigned long ok;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) unsigned long error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) unsigned long badcrc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) unsigned long toolong;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) unsigned long aborted;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) unsigned long unused;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) } rx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) } amb_stats;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) // a single struct pointed to by atm_vcc->dev_data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) typedef struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) u8 tx_vc_bits:7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) u8 tx_present:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) } amb_tx_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) typedef struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) unsigned char pool;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) } amb_rx_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) typedef struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) amb_rx_info rx_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) u16 tx_frame_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) unsigned int tx_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) unsigned int rx_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) } amb_vcc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) struct amb_dev {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) u8 irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) u32 iobase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) u32 * membase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) amb_cq cq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) amb_txq txq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) amb_rxq rxq[NUM_RX_POOLS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) struct mutex vcc_sf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) amb_tx_info txer[NUM_VCS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) struct atm_vcc * rxer[NUM_VCS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) unsigned int tx_avail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) unsigned int rx_avail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) amb_stats stats;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) struct atm_dev * atm_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) struct pci_dev * pci_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) struct timer_list housekeeping;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) typedef struct amb_dev amb_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) #define AMB_DEV(atm_dev) ((amb_dev *) (atm_dev)->dev_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) #define AMB_VCC(atm_vcc) ((amb_vcc *) (atm_vcc)->dev_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) /* rate rounding */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) typedef enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) round_up,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) round_down,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) round_nearest
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) } rounding;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) #endif