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