18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci Madge Ambassador ATM Adapter driver. 48c2ecf20Sopenharmony_ci Copyright (C) 1995-1999 Madge Networks Ltd. 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci*/ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#ifndef AMBASSADOR_H 98c2ecf20Sopenharmony_ci#define AMBASSADOR_H 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#ifdef CONFIG_ATM_AMBASSADOR_DEBUG 138c2ecf20Sopenharmony_ci#define DEBUG_AMBASSADOR 148c2ecf20Sopenharmony_ci#endif 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci#define DEV_LABEL "amb" 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci#ifndef PCI_VENDOR_ID_MADGE 198c2ecf20Sopenharmony_ci#define PCI_VENDOR_ID_MADGE 0x10B6 208c2ecf20Sopenharmony_ci#endif 218c2ecf20Sopenharmony_ci#ifndef PCI_VENDOR_ID_MADGE_AMBASSADOR 228c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_MADGE_AMBASSADOR 0x1001 238c2ecf20Sopenharmony_ci#endif 248c2ecf20Sopenharmony_ci#ifndef PCI_VENDOR_ID_MADGE_AMBASSADOR_BAD 258c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_MADGE_AMBASSADOR_BAD 0x1002 268c2ecf20Sopenharmony_ci#endif 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci// diagnostic output 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci#define PRINTK(severity,format,args...) \ 318c2ecf20Sopenharmony_ci printk(severity DEV_LABEL ": " format "\n" , ## args) 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci#ifdef DEBUG_AMBASSADOR 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci#define DBG_ERR 0x0001 368c2ecf20Sopenharmony_ci#define DBG_WARN 0x0002 378c2ecf20Sopenharmony_ci#define DBG_INFO 0x0004 388c2ecf20Sopenharmony_ci#define DBG_INIT 0x0008 398c2ecf20Sopenharmony_ci#define DBG_LOAD 0x0010 408c2ecf20Sopenharmony_ci#define DBG_VCC 0x0020 418c2ecf20Sopenharmony_ci#define DBG_QOS 0x0040 428c2ecf20Sopenharmony_ci#define DBG_CMD 0x0080 438c2ecf20Sopenharmony_ci#define DBG_TX 0x0100 448c2ecf20Sopenharmony_ci#define DBG_RX 0x0200 458c2ecf20Sopenharmony_ci#define DBG_SKB 0x0400 468c2ecf20Sopenharmony_ci#define DBG_POOL 0x0800 478c2ecf20Sopenharmony_ci#define DBG_IRQ 0x1000 488c2ecf20Sopenharmony_ci#define DBG_FLOW 0x2000 498c2ecf20Sopenharmony_ci#define DBG_REGS 0x4000 508c2ecf20Sopenharmony_ci#define DBG_DATA 0x8000 518c2ecf20Sopenharmony_ci#define DBG_MASK 0xffff 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci/* the ## prevents the annoying double expansion of the macro arguments */ 548c2ecf20Sopenharmony_ci/* KERN_INFO is used since KERN_DEBUG often does not make it to the console */ 558c2ecf20Sopenharmony_ci#define PRINTDB(bits,format,args...) \ 568c2ecf20Sopenharmony_ci ( (debug & (bits)) ? printk (KERN_INFO DEV_LABEL ": " format , ## args) : 1 ) 578c2ecf20Sopenharmony_ci#define PRINTDM(bits,format,args...) \ 588c2ecf20Sopenharmony_ci ( (debug & (bits)) ? printk (format , ## args) : 1 ) 598c2ecf20Sopenharmony_ci#define PRINTDE(bits,format,args...) \ 608c2ecf20Sopenharmony_ci ( (debug & (bits)) ? printk (format "\n" , ## args) : 1 ) 618c2ecf20Sopenharmony_ci#define PRINTD(bits,format,args...) \ 628c2ecf20Sopenharmony_ci ( (debug & (bits)) ? printk (KERN_INFO DEV_LABEL ": " format "\n" , ## args) : 1 ) 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_ci#else 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ci#define PRINTD(bits,format,args...) 678c2ecf20Sopenharmony_ci#define PRINTDB(bits,format,args...) 688c2ecf20Sopenharmony_ci#define PRINTDM(bits,format,args...) 698c2ecf20Sopenharmony_ci#define PRINTDE(bits,format,args...) 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_ci#endif 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci#define PRINTDD(bits,format,args...) 748c2ecf20Sopenharmony_ci#define PRINTDDB(sec,fmt,args...) 758c2ecf20Sopenharmony_ci#define PRINTDDM(sec,fmt,args...) 768c2ecf20Sopenharmony_ci#define PRINTDDE(sec,fmt,args...) 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ci// tunable values (?) 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci/* MUST be powers of two -- why ? */ 818c2ecf20Sopenharmony_ci#define COM_Q_ENTRIES 8 828c2ecf20Sopenharmony_ci#define TX_Q_ENTRIES 32 838c2ecf20Sopenharmony_ci#define RX_Q_ENTRIES 64 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_ci// fixed values 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_ci// guessing 888c2ecf20Sopenharmony_ci#define AMB_EXTENT 0x80 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci// Minimum allowed size for an Ambassador queue 918c2ecf20Sopenharmony_ci#define MIN_QUEUE_SIZE 2 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_ci// Ambassador microcode allows 1 to 4 pools, we use 4 (simpler) 948c2ecf20Sopenharmony_ci#define NUM_RX_POOLS 4 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_ci// minimum RX buffers required to cope with replenishing delay 978c2ecf20Sopenharmony_ci#define MIN_RX_BUFFERS 1 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci// minimum PCI latency we will tolerate (32 IS TOO SMALL) 1008c2ecf20Sopenharmony_ci#define MIN_PCI_LATENCY 64 // 255 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci// VCs supported by card (VPI always 0) 1038c2ecf20Sopenharmony_ci#define NUM_VPI_BITS 0 1048c2ecf20Sopenharmony_ci#define NUM_VCI_BITS 10 1058c2ecf20Sopenharmony_ci#define NUM_VCS 1024 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_ci/* The status field bits defined so far. */ 1088c2ecf20Sopenharmony_ci#define RX_ERR 0x8000 // always present if there is an error (hmm) 1098c2ecf20Sopenharmony_ci#define CRC_ERR 0x4000 // AAL5 CRC error 1108c2ecf20Sopenharmony_ci#define LEN_ERR 0x2000 // overlength frame 1118c2ecf20Sopenharmony_ci#define ABORT_ERR 0x1000 // zero length field in received frame 1128c2ecf20Sopenharmony_ci#define UNUSED_ERR 0x0800 // buffer returned unused 1138c2ecf20Sopenharmony_ci 1148c2ecf20Sopenharmony_ci// Adaptor commands 1158c2ecf20Sopenharmony_ci 1168c2ecf20Sopenharmony_ci#define SRB_OPEN_VC 0 1178c2ecf20Sopenharmony_ci/* par_0: dwordswap(VC_number) */ 1188c2ecf20Sopenharmony_ci/* par_1: dwordswap(flags<<16) or wordswap(flags)*/ 1198c2ecf20Sopenharmony_ci/* flags: */ 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_ci/* LANE: 0x0004 */ 1228c2ecf20Sopenharmony_ci/* NOT_UBR: 0x0008 */ 1238c2ecf20Sopenharmony_ci/* ABR: 0x0010 */ 1248c2ecf20Sopenharmony_ci 1258c2ecf20Sopenharmony_ci/* RxPool0: 0x0000 */ 1268c2ecf20Sopenharmony_ci/* RxPool1: 0x0020 */ 1278c2ecf20Sopenharmony_ci/* RxPool2: 0x0040 */ 1288c2ecf20Sopenharmony_ci/* RxPool3: 0x0060 */ 1298c2ecf20Sopenharmony_ci 1308c2ecf20Sopenharmony_ci/* par_2: dwordswap(fp_rate<<16) or wordswap(fp_rate) */ 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_ci#define SRB_CLOSE_VC 1 1338c2ecf20Sopenharmony_ci/* par_0: dwordswap(VC_number) */ 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_ci#define SRB_GET_BIA 2 1368c2ecf20Sopenharmony_ci/* returns */ 1378c2ecf20Sopenharmony_ci/* par_0: dwordswap(half BIA) */ 1388c2ecf20Sopenharmony_ci/* par_1: dwordswap(half BIA) */ 1398c2ecf20Sopenharmony_ci 1408c2ecf20Sopenharmony_ci#define SRB_GET_SUNI_STATS 3 1418c2ecf20Sopenharmony_ci/* par_0: dwordswap(physical_host_address) */ 1428c2ecf20Sopenharmony_ci 1438c2ecf20Sopenharmony_ci#define SRB_SET_BITS_8 4 1448c2ecf20Sopenharmony_ci#define SRB_SET_BITS_16 5 1458c2ecf20Sopenharmony_ci#define SRB_SET_BITS_32 6 1468c2ecf20Sopenharmony_ci#define SRB_CLEAR_BITS_8 7 1478c2ecf20Sopenharmony_ci#define SRB_CLEAR_BITS_16 8 1488c2ecf20Sopenharmony_ci#define SRB_CLEAR_BITS_32 9 1498c2ecf20Sopenharmony_ci/* par_0: dwordswap(ATMizer address) */ 1508c2ecf20Sopenharmony_ci/* par_1: dwordswap(mask) */ 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_ci#define SRB_SET_8 10 1538c2ecf20Sopenharmony_ci#define SRB_SET_16 11 1548c2ecf20Sopenharmony_ci#define SRB_SET_32 12 1558c2ecf20Sopenharmony_ci/* par_0: dwordswap(ATMizer address) */ 1568c2ecf20Sopenharmony_ci/* par_1: dwordswap(data) */ 1578c2ecf20Sopenharmony_ci 1588c2ecf20Sopenharmony_ci#define SRB_GET_32 13 1598c2ecf20Sopenharmony_ci/* par_0: dwordswap(ATMizer address) */ 1608c2ecf20Sopenharmony_ci/* returns */ 1618c2ecf20Sopenharmony_ci/* par_1: dwordswap(ATMizer data) */ 1628c2ecf20Sopenharmony_ci 1638c2ecf20Sopenharmony_ci#define SRB_GET_VERSION 14 1648c2ecf20Sopenharmony_ci/* returns */ 1658c2ecf20Sopenharmony_ci/* par_0: dwordswap(Major Version) */ 1668c2ecf20Sopenharmony_ci/* par_1: dwordswap(Minor Version) */ 1678c2ecf20Sopenharmony_ci 1688c2ecf20Sopenharmony_ci#define SRB_FLUSH_BUFFER_Q 15 1698c2ecf20Sopenharmony_ci/* Only flags to define which buffer pool; all others must be zero */ 1708c2ecf20Sopenharmony_ci/* par_0: dwordswap(flags<<16) or wordswap(flags)*/ 1718c2ecf20Sopenharmony_ci 1728c2ecf20Sopenharmony_ci#define SRB_GET_DMA_SPEEDS 16 1738c2ecf20Sopenharmony_ci/* returns */ 1748c2ecf20Sopenharmony_ci/* par_0: dwordswap(Read speed (bytes/sec)) */ 1758c2ecf20Sopenharmony_ci/* par_1: dwordswap(Write speed (bytes/sec)) */ 1768c2ecf20Sopenharmony_ci 1778c2ecf20Sopenharmony_ci#define SRB_MODIFY_VC_RATE 17 1788c2ecf20Sopenharmony_ci/* par_0: dwordswap(VC_number) */ 1798c2ecf20Sopenharmony_ci/* par_1: dwordswap(fp_rate<<16) or wordswap(fp_rate) */ 1808c2ecf20Sopenharmony_ci 1818c2ecf20Sopenharmony_ci#define SRB_MODIFY_VC_FLAGS 18 1828c2ecf20Sopenharmony_ci/* par_0: dwordswap(VC_number) */ 1838c2ecf20Sopenharmony_ci/* par_1: dwordswap(flags<<16) or wordswap(flags)*/ 1848c2ecf20Sopenharmony_ci 1858c2ecf20Sopenharmony_ci/* flags: */ 1868c2ecf20Sopenharmony_ci 1878c2ecf20Sopenharmony_ci/* LANE: 0x0004 */ 1888c2ecf20Sopenharmony_ci/* NOT_UBR: 0x0008 */ 1898c2ecf20Sopenharmony_ci/* ABR: 0x0010 */ 1908c2ecf20Sopenharmony_ci 1918c2ecf20Sopenharmony_ci/* RxPool0: 0x0000 */ 1928c2ecf20Sopenharmony_ci/* RxPool1: 0x0020 */ 1938c2ecf20Sopenharmony_ci/* RxPool2: 0x0040 */ 1948c2ecf20Sopenharmony_ci/* RxPool3: 0x0060 */ 1958c2ecf20Sopenharmony_ci 1968c2ecf20Sopenharmony_ci#define SRB_RATE_SHIFT 16 1978c2ecf20Sopenharmony_ci#define SRB_POOL_SHIFT (SRB_FLAGS_SHIFT+5) 1988c2ecf20Sopenharmony_ci#define SRB_FLAGS_SHIFT 16 1998c2ecf20Sopenharmony_ci 2008c2ecf20Sopenharmony_ci#define SRB_STOP_TASKING 19 2018c2ecf20Sopenharmony_ci#define SRB_START_TASKING 20 2028c2ecf20Sopenharmony_ci#define SRB_SHUT_DOWN 21 2038c2ecf20Sopenharmony_ci#define MAX_SRB 21 2048c2ecf20Sopenharmony_ci 2058c2ecf20Sopenharmony_ci#define SRB_COMPLETE 0xffffffff 2068c2ecf20Sopenharmony_ci 2078c2ecf20Sopenharmony_ci#define TX_FRAME 0x80000000 2088c2ecf20Sopenharmony_ci 2098c2ecf20Sopenharmony_ci// number of types of SRB MUST be a power of two -- why? 2108c2ecf20Sopenharmony_ci#define NUM_OF_SRB 32 2118c2ecf20Sopenharmony_ci 2128c2ecf20Sopenharmony_ci// number of bits of period info for rate 2138c2ecf20Sopenharmony_ci#define MAX_RATE_BITS 6 2148c2ecf20Sopenharmony_ci 2158c2ecf20Sopenharmony_ci#define TX_UBR 0x0000 2168c2ecf20Sopenharmony_ci#define TX_UBR_CAPPED 0x0008 2178c2ecf20Sopenharmony_ci#define TX_ABR 0x0018 2188c2ecf20Sopenharmony_ci#define TX_FRAME_NOTCAP 0x0000 2198c2ecf20Sopenharmony_ci#define TX_FRAME_CAPPED 0x8000 2208c2ecf20Sopenharmony_ci 2218c2ecf20Sopenharmony_ci#define FP_155_RATE 0x24b1 2228c2ecf20Sopenharmony_ci#define FP_25_RATE 0x1f9d 2238c2ecf20Sopenharmony_ci 2248c2ecf20Sopenharmony_ci/* #define VERSION_NUMBER 0x01000000 // initial release */ 2258c2ecf20Sopenharmony_ci/* #define VERSION_NUMBER 0x01010000 // fixed startup probs PLX MB0 not cleared */ 2268c2ecf20Sopenharmony_ci/* #define VERSION_NUMBER 0x01020000 // changed SUNI reset timings; allowed r/w onchip */ 2278c2ecf20Sopenharmony_ci 2288c2ecf20Sopenharmony_ci/* #define VERSION_NUMBER 0x01030000 // clear local doorbell int reg on reset */ 2298c2ecf20Sopenharmony_ci/* #define VERSION_NUMBER 0x01040000 // PLX bug work around version PLUS */ 2308c2ecf20Sopenharmony_ci/* remove race conditions on basic interface */ 2318c2ecf20Sopenharmony_ci/* indicate to the host that diagnostics */ 2328c2ecf20Sopenharmony_ci/* have finished; if failed, how and what */ 2338c2ecf20Sopenharmony_ci/* failed */ 2348c2ecf20Sopenharmony_ci/* fix host memory test to fix PLX bug */ 2358c2ecf20Sopenharmony_ci/* allow flash upgrade and BIA upgrade directly */ 2368c2ecf20Sopenharmony_ci/* */ 2378c2ecf20Sopenharmony_ci#define VERSION_NUMBER 0x01050025 /* Jason's first hacked version. */ 2388c2ecf20Sopenharmony_ci/* Change in download algorithm */ 2398c2ecf20Sopenharmony_ci 2408c2ecf20Sopenharmony_ci#define DMA_VALID 0xb728e149 /* completely random */ 2418c2ecf20Sopenharmony_ci 2428c2ecf20Sopenharmony_ci#define FLASH_BASE 0xa0c00000 2438c2ecf20Sopenharmony_ci#define FLASH_SIZE 0x00020000 /* 128K */ 2448c2ecf20Sopenharmony_ci#define BIA_BASE (FLASH_BASE+0x0001c000) /* Flash Sector 7 */ 2458c2ecf20Sopenharmony_ci#define BIA_ADDRESS ((void *)0xa0c1c000) 2468c2ecf20Sopenharmony_ci#define PLX_BASE 0xe0000000 2478c2ecf20Sopenharmony_ci 2488c2ecf20Sopenharmony_citypedef enum { 2498c2ecf20Sopenharmony_ci host_memory_test = 1, 2508c2ecf20Sopenharmony_ci read_adapter_memory, 2518c2ecf20Sopenharmony_ci write_adapter_memory, 2528c2ecf20Sopenharmony_ci adapter_start, 2538c2ecf20Sopenharmony_ci get_version_number, 2548c2ecf20Sopenharmony_ci interrupt_host, 2558c2ecf20Sopenharmony_ci flash_erase_sector, 2568c2ecf20Sopenharmony_ci adap_download_block = 0x20, 2578c2ecf20Sopenharmony_ci adap_erase_flash, 2588c2ecf20Sopenharmony_ci adap_run_in_iram, 2598c2ecf20Sopenharmony_ci adap_end_download 2608c2ecf20Sopenharmony_ci} loader_command; 2618c2ecf20Sopenharmony_ci 2628c2ecf20Sopenharmony_ci#define BAD_COMMAND (-1) 2638c2ecf20Sopenharmony_ci#define COMMAND_IN_PROGRESS 1 2648c2ecf20Sopenharmony_ci#define COMMAND_PASSED_TEST 2 2658c2ecf20Sopenharmony_ci#define COMMAND_FAILED_TEST 3 2668c2ecf20Sopenharmony_ci#define COMMAND_READ_DATA_OK 4 2678c2ecf20Sopenharmony_ci#define COMMAND_READ_BAD_ADDRESS 5 2688c2ecf20Sopenharmony_ci#define COMMAND_WRITE_DATA_OK 6 2698c2ecf20Sopenharmony_ci#define COMMAND_WRITE_BAD_ADDRESS 7 2708c2ecf20Sopenharmony_ci#define COMMAND_WRITE_FLASH_FAILURE 8 2718c2ecf20Sopenharmony_ci#define COMMAND_COMPLETE 9 2728c2ecf20Sopenharmony_ci#define COMMAND_FLASH_ERASE_FAILURE 10 2738c2ecf20Sopenharmony_ci#define COMMAND_WRITE_BAD_DATA 11 2748c2ecf20Sopenharmony_ci 2758c2ecf20Sopenharmony_ci/* bit fields for mailbox[0] return values */ 2768c2ecf20Sopenharmony_ci 2778c2ecf20Sopenharmony_ci#define GPINT_TST_FAILURE 0x00000001 2788c2ecf20Sopenharmony_ci#define SUNI_DATA_PATTERN_FAILURE 0x00000002 2798c2ecf20Sopenharmony_ci#define SUNI_DATA_BITS_FAILURE 0x00000004 2808c2ecf20Sopenharmony_ci#define SUNI_UTOPIA_FAILURE 0x00000008 2818c2ecf20Sopenharmony_ci#define SUNI_FIFO_FAILURE 0x00000010 2828c2ecf20Sopenharmony_ci#define SRAM_FAILURE 0x00000020 2838c2ecf20Sopenharmony_ci#define SELF_TEST_FAILURE 0x0000003f 2848c2ecf20Sopenharmony_ci 2858c2ecf20Sopenharmony_ci/* mailbox[1] = 0 in progress, -1 on completion */ 2868c2ecf20Sopenharmony_ci/* mailbox[2] = current test 00 00 test(8 bit) phase(8 bit) */ 2878c2ecf20Sopenharmony_ci/* mailbox[3] = last failure, 00 00 test(8 bit) phase(8 bit) */ 2888c2ecf20Sopenharmony_ci/* mailbox[4],mailbox[5],mailbox[6] random failure values */ 2898c2ecf20Sopenharmony_ci 2908c2ecf20Sopenharmony_ci/* PLX/etc. memory map including command structure */ 2918c2ecf20Sopenharmony_ci 2928c2ecf20Sopenharmony_ci/* These registers may also be memory mapped in PCI memory */ 2938c2ecf20Sopenharmony_ci 2948c2ecf20Sopenharmony_ci#define UNUSED_LOADER_MAILBOXES 6 2958c2ecf20Sopenharmony_ci 2968c2ecf20Sopenharmony_citypedef struct { 2978c2ecf20Sopenharmony_ci u32 stuff[16]; 2988c2ecf20Sopenharmony_ci union { 2998c2ecf20Sopenharmony_ci struct { 3008c2ecf20Sopenharmony_ci u32 result; 3018c2ecf20Sopenharmony_ci u32 ready; 3028c2ecf20Sopenharmony_ci u32 stuff[UNUSED_LOADER_MAILBOXES]; 3038c2ecf20Sopenharmony_ci } loader; 3048c2ecf20Sopenharmony_ci struct { 3058c2ecf20Sopenharmony_ci u32 cmd_address; 3068c2ecf20Sopenharmony_ci u32 tx_address; 3078c2ecf20Sopenharmony_ci u32 rx_address[NUM_RX_POOLS]; 3088c2ecf20Sopenharmony_ci u32 gen_counter; 3098c2ecf20Sopenharmony_ci u32 spare; 3108c2ecf20Sopenharmony_ci } adapter; 3118c2ecf20Sopenharmony_ci } mb; 3128c2ecf20Sopenharmony_ci u32 doorbell; 3138c2ecf20Sopenharmony_ci u32 interrupt; 3148c2ecf20Sopenharmony_ci u32 interrupt_control; 3158c2ecf20Sopenharmony_ci u32 reset_control; 3168c2ecf20Sopenharmony_ci} amb_mem; 3178c2ecf20Sopenharmony_ci 3188c2ecf20Sopenharmony_ci/* RESET bit, IRQ (card to host) and doorbell (host to card) enable bits */ 3198c2ecf20Sopenharmony_ci#define AMB_RESET_BITS 0x40000000 3208c2ecf20Sopenharmony_ci#define AMB_INTERRUPT_BITS 0x00000300 3218c2ecf20Sopenharmony_ci#define AMB_DOORBELL_BITS 0x00030000 3228c2ecf20Sopenharmony_ci 3238c2ecf20Sopenharmony_ci/* loader commands */ 3248c2ecf20Sopenharmony_ci 3258c2ecf20Sopenharmony_ci#define MAX_COMMAND_DATA 13 3268c2ecf20Sopenharmony_ci#define MAX_TRANSFER_DATA 11 3278c2ecf20Sopenharmony_ci 3288c2ecf20Sopenharmony_citypedef struct { 3298c2ecf20Sopenharmony_ci __be32 address; 3308c2ecf20Sopenharmony_ci __be32 count; 3318c2ecf20Sopenharmony_ci __be32 data[MAX_TRANSFER_DATA]; 3328c2ecf20Sopenharmony_ci} transfer_block; 3338c2ecf20Sopenharmony_ci 3348c2ecf20Sopenharmony_citypedef struct { 3358c2ecf20Sopenharmony_ci __be32 result; 3368c2ecf20Sopenharmony_ci __be32 command; 3378c2ecf20Sopenharmony_ci union { 3388c2ecf20Sopenharmony_ci transfer_block transfer; 3398c2ecf20Sopenharmony_ci __be32 version; 3408c2ecf20Sopenharmony_ci __be32 start; 3418c2ecf20Sopenharmony_ci __be32 data[MAX_COMMAND_DATA]; 3428c2ecf20Sopenharmony_ci } payload; 3438c2ecf20Sopenharmony_ci __be32 valid; 3448c2ecf20Sopenharmony_ci} loader_block; 3458c2ecf20Sopenharmony_ci 3468c2ecf20Sopenharmony_ci/* command queue */ 3478c2ecf20Sopenharmony_ci 3488c2ecf20Sopenharmony_ci/* Again all data are BIG ENDIAN */ 3498c2ecf20Sopenharmony_ci 3508c2ecf20Sopenharmony_citypedef struct { 3518c2ecf20Sopenharmony_ci union { 3528c2ecf20Sopenharmony_ci struct { 3538c2ecf20Sopenharmony_ci __be32 vc; 3548c2ecf20Sopenharmony_ci __be32 flags; 3558c2ecf20Sopenharmony_ci __be32 rate; 3568c2ecf20Sopenharmony_ci } open; 3578c2ecf20Sopenharmony_ci struct { 3588c2ecf20Sopenharmony_ci __be32 vc; 3598c2ecf20Sopenharmony_ci __be32 rate; 3608c2ecf20Sopenharmony_ci } modify_rate; 3618c2ecf20Sopenharmony_ci struct { 3628c2ecf20Sopenharmony_ci __be32 vc; 3638c2ecf20Sopenharmony_ci __be32 flags; 3648c2ecf20Sopenharmony_ci } modify_flags; 3658c2ecf20Sopenharmony_ci struct { 3668c2ecf20Sopenharmony_ci __be32 vc; 3678c2ecf20Sopenharmony_ci } close; 3688c2ecf20Sopenharmony_ci struct { 3698c2ecf20Sopenharmony_ci __be32 lower4; 3708c2ecf20Sopenharmony_ci __be32 upper2; 3718c2ecf20Sopenharmony_ci } bia; 3728c2ecf20Sopenharmony_ci struct { 3738c2ecf20Sopenharmony_ci __be32 address; 3748c2ecf20Sopenharmony_ci } suni; 3758c2ecf20Sopenharmony_ci struct { 3768c2ecf20Sopenharmony_ci __be32 major; 3778c2ecf20Sopenharmony_ci __be32 minor; 3788c2ecf20Sopenharmony_ci } version; 3798c2ecf20Sopenharmony_ci struct { 3808c2ecf20Sopenharmony_ci __be32 read; 3818c2ecf20Sopenharmony_ci __be32 write; 3828c2ecf20Sopenharmony_ci } speed; 3838c2ecf20Sopenharmony_ci struct { 3848c2ecf20Sopenharmony_ci __be32 flags; 3858c2ecf20Sopenharmony_ci } flush; 3868c2ecf20Sopenharmony_ci struct { 3878c2ecf20Sopenharmony_ci __be32 address; 3888c2ecf20Sopenharmony_ci __be32 data; 3898c2ecf20Sopenharmony_ci } memory; 3908c2ecf20Sopenharmony_ci __be32 par[3]; 3918c2ecf20Sopenharmony_ci } args; 3928c2ecf20Sopenharmony_ci __be32 request; 3938c2ecf20Sopenharmony_ci} command; 3948c2ecf20Sopenharmony_ci 3958c2ecf20Sopenharmony_ci/* transmit queues and associated structures */ 3968c2ecf20Sopenharmony_ci 3978c2ecf20Sopenharmony_ci/* The hosts transmit structure. All BIG ENDIAN; host address 3988c2ecf20Sopenharmony_ci restricted to first 1GByte, but address passed to the card must 3998c2ecf20Sopenharmony_ci have the top MS bit or'ed in. -- check this */ 4008c2ecf20Sopenharmony_ci 4018c2ecf20Sopenharmony_ci/* TX is described by 1+ tx_frags followed by a tx_frag_end */ 4028c2ecf20Sopenharmony_ci 4038c2ecf20Sopenharmony_citypedef struct { 4048c2ecf20Sopenharmony_ci __be32 bytes; 4058c2ecf20Sopenharmony_ci __be32 address; 4068c2ecf20Sopenharmony_ci} tx_frag; 4078c2ecf20Sopenharmony_ci 4088c2ecf20Sopenharmony_ci/* apart from handle the fields here are for the adapter to play with 4098c2ecf20Sopenharmony_ci and should be set to zero */ 4108c2ecf20Sopenharmony_ci 4118c2ecf20Sopenharmony_citypedef struct { 4128c2ecf20Sopenharmony_ci u32 handle; 4138c2ecf20Sopenharmony_ci u16 vc; 4148c2ecf20Sopenharmony_ci u16 next_descriptor_length; 4158c2ecf20Sopenharmony_ci u32 next_descriptor; 4168c2ecf20Sopenharmony_ci#ifdef AMB_NEW_MICROCODE 4178c2ecf20Sopenharmony_ci u8 cpcs_uu; 4188c2ecf20Sopenharmony_ci u8 cpi; 4198c2ecf20Sopenharmony_ci u16 pad; 4208c2ecf20Sopenharmony_ci#endif 4218c2ecf20Sopenharmony_ci} tx_frag_end; 4228c2ecf20Sopenharmony_ci 4238c2ecf20Sopenharmony_citypedef struct { 4248c2ecf20Sopenharmony_ci tx_frag tx_frag; 4258c2ecf20Sopenharmony_ci tx_frag_end tx_frag_end; 4268c2ecf20Sopenharmony_ci struct sk_buff * skb; 4278c2ecf20Sopenharmony_ci} tx_simple; 4288c2ecf20Sopenharmony_ci 4298c2ecf20Sopenharmony_ci#if 0 4308c2ecf20Sopenharmony_citypedef union { 4318c2ecf20Sopenharmony_ci tx_frag fragment; 4328c2ecf20Sopenharmony_ci tx_frag_end end_of_list; 4338c2ecf20Sopenharmony_ci} tx_descr; 4348c2ecf20Sopenharmony_ci#endif 4358c2ecf20Sopenharmony_ci 4368c2ecf20Sopenharmony_ci/* this "points" to the sequence of fragments and trailer */ 4378c2ecf20Sopenharmony_ci 4388c2ecf20Sopenharmony_citypedef struct { 4398c2ecf20Sopenharmony_ci __be16 vc; 4408c2ecf20Sopenharmony_ci __be16 tx_descr_length; 4418c2ecf20Sopenharmony_ci __be32 tx_descr_addr; 4428c2ecf20Sopenharmony_ci} tx_in; 4438c2ecf20Sopenharmony_ci 4448c2ecf20Sopenharmony_ci/* handle is the handle from tx_in */ 4458c2ecf20Sopenharmony_ci 4468c2ecf20Sopenharmony_citypedef struct { 4478c2ecf20Sopenharmony_ci u32 handle; 4488c2ecf20Sopenharmony_ci} tx_out; 4498c2ecf20Sopenharmony_ci 4508c2ecf20Sopenharmony_ci/* receive frame structure */ 4518c2ecf20Sopenharmony_ci 4528c2ecf20Sopenharmony_ci/* All BIG ENDIAN; handle is as passed from host; length is zero for 4538c2ecf20Sopenharmony_ci aborted frames, and frames with errors. Header is actually VC 4548c2ecf20Sopenharmony_ci number, lec-id is NOT yet supported. */ 4558c2ecf20Sopenharmony_ci 4568c2ecf20Sopenharmony_citypedef struct { 4578c2ecf20Sopenharmony_ci u32 handle; 4588c2ecf20Sopenharmony_ci __be16 vc; 4598c2ecf20Sopenharmony_ci __be16 lec_id; // unused 4608c2ecf20Sopenharmony_ci __be16 status; 4618c2ecf20Sopenharmony_ci __be16 length; 4628c2ecf20Sopenharmony_ci} rx_out; 4638c2ecf20Sopenharmony_ci 4648c2ecf20Sopenharmony_ci/* buffer supply structure */ 4658c2ecf20Sopenharmony_ci 4668c2ecf20Sopenharmony_citypedef struct { 4678c2ecf20Sopenharmony_ci u32 handle; 4688c2ecf20Sopenharmony_ci __be32 host_address; 4698c2ecf20Sopenharmony_ci} rx_in; 4708c2ecf20Sopenharmony_ci 4718c2ecf20Sopenharmony_ci/* This first structure is the area in host memory where the adapter 4728c2ecf20Sopenharmony_ci writes its pointer values. These pointer values are BIG ENDIAN and 4738c2ecf20Sopenharmony_ci reside in the same 4MB 'page' as this structure. The host gives the 4748c2ecf20Sopenharmony_ci adapter the address of this block by sending a doorbell interrupt 4758c2ecf20Sopenharmony_ci to the adapter after downloading the code and setting it going. The 4768c2ecf20Sopenharmony_ci addresses have the top 10 bits set to 1010000010b -- really? 4778c2ecf20Sopenharmony_ci 4788c2ecf20Sopenharmony_ci The host must initialise these before handing the block to the 4798c2ecf20Sopenharmony_ci adapter. */ 4808c2ecf20Sopenharmony_ci 4818c2ecf20Sopenharmony_citypedef struct { 4828c2ecf20Sopenharmony_ci __be32 command_start; /* SRB commands completions */ 4838c2ecf20Sopenharmony_ci __be32 command_end; /* SRB commands completions */ 4848c2ecf20Sopenharmony_ci __be32 tx_start; 4858c2ecf20Sopenharmony_ci __be32 tx_end; 4868c2ecf20Sopenharmony_ci __be32 txcom_start; /* tx completions */ 4878c2ecf20Sopenharmony_ci __be32 txcom_end; /* tx completions */ 4888c2ecf20Sopenharmony_ci struct { 4898c2ecf20Sopenharmony_ci __be32 buffer_start; 4908c2ecf20Sopenharmony_ci __be32 buffer_end; 4918c2ecf20Sopenharmony_ci u32 buffer_q_get; 4928c2ecf20Sopenharmony_ci u32 buffer_q_end; 4938c2ecf20Sopenharmony_ci u32 buffer_aptr; 4948c2ecf20Sopenharmony_ci __be32 rx_start; /* rx completions */ 4958c2ecf20Sopenharmony_ci __be32 rx_end; 4968c2ecf20Sopenharmony_ci u32 rx_ptr; 4978c2ecf20Sopenharmony_ci __be32 buffer_size; /* size of host buffer */ 4988c2ecf20Sopenharmony_ci } rec_struct[NUM_RX_POOLS]; 4998c2ecf20Sopenharmony_ci#ifdef AMB_NEW_MICROCODE 5008c2ecf20Sopenharmony_ci u16 init_flags; 5018c2ecf20Sopenharmony_ci u16 talk_block_spare; 5028c2ecf20Sopenharmony_ci#endif 5038c2ecf20Sopenharmony_ci} adap_talk_block; 5048c2ecf20Sopenharmony_ci 5058c2ecf20Sopenharmony_ci/* This structure must be kept in line with the vcr image in sarmain.h 5068c2ecf20Sopenharmony_ci 5078c2ecf20Sopenharmony_ci This is the structure in the host filled in by the adapter by 5088c2ecf20Sopenharmony_ci GET_SUNI_STATS */ 5098c2ecf20Sopenharmony_ci 5108c2ecf20Sopenharmony_citypedef struct { 5118c2ecf20Sopenharmony_ci u8 racp_chcs; 5128c2ecf20Sopenharmony_ci u8 racp_uhcs; 5138c2ecf20Sopenharmony_ci u16 spare; 5148c2ecf20Sopenharmony_ci u32 racp_rcell; 5158c2ecf20Sopenharmony_ci u32 tacp_tcell; 5168c2ecf20Sopenharmony_ci u32 flags; 5178c2ecf20Sopenharmony_ci u32 dropped_cells; 5188c2ecf20Sopenharmony_ci u32 dropped_frames; 5198c2ecf20Sopenharmony_ci} suni_stats; 5208c2ecf20Sopenharmony_ci 5218c2ecf20Sopenharmony_citypedef enum { 5228c2ecf20Sopenharmony_ci dead 5238c2ecf20Sopenharmony_ci} amb_flags; 5248c2ecf20Sopenharmony_ci 5258c2ecf20Sopenharmony_ci#define NEXTQ(current,start,limit) \ 5268c2ecf20Sopenharmony_ci ( (current)+1 < (limit) ? (current)+1 : (start) ) 5278c2ecf20Sopenharmony_ci 5288c2ecf20Sopenharmony_citypedef struct { 5298c2ecf20Sopenharmony_ci command * start; 5308c2ecf20Sopenharmony_ci command * in; 5318c2ecf20Sopenharmony_ci command * out; 5328c2ecf20Sopenharmony_ci command * limit; 5338c2ecf20Sopenharmony_ci} amb_cq_ptrs; 5348c2ecf20Sopenharmony_ci 5358c2ecf20Sopenharmony_citypedef struct { 5368c2ecf20Sopenharmony_ci spinlock_t lock; 5378c2ecf20Sopenharmony_ci unsigned int pending; 5388c2ecf20Sopenharmony_ci unsigned int high; 5398c2ecf20Sopenharmony_ci unsigned int filled; 5408c2ecf20Sopenharmony_ci unsigned int maximum; // size - 1 (q implementation) 5418c2ecf20Sopenharmony_ci amb_cq_ptrs ptrs; 5428c2ecf20Sopenharmony_ci} amb_cq; 5438c2ecf20Sopenharmony_ci 5448c2ecf20Sopenharmony_citypedef struct { 5458c2ecf20Sopenharmony_ci spinlock_t lock; 5468c2ecf20Sopenharmony_ci unsigned int pending; 5478c2ecf20Sopenharmony_ci unsigned int high; 5488c2ecf20Sopenharmony_ci unsigned int filled; 5498c2ecf20Sopenharmony_ci unsigned int maximum; // size - 1 (q implementation) 5508c2ecf20Sopenharmony_ci struct { 5518c2ecf20Sopenharmony_ci tx_in * start; 5528c2ecf20Sopenharmony_ci tx_in * ptr; 5538c2ecf20Sopenharmony_ci tx_in * limit; 5548c2ecf20Sopenharmony_ci } in; 5558c2ecf20Sopenharmony_ci struct { 5568c2ecf20Sopenharmony_ci tx_out * start; 5578c2ecf20Sopenharmony_ci tx_out * ptr; 5588c2ecf20Sopenharmony_ci tx_out * limit; 5598c2ecf20Sopenharmony_ci } out; 5608c2ecf20Sopenharmony_ci} amb_txq; 5618c2ecf20Sopenharmony_ci 5628c2ecf20Sopenharmony_citypedef struct { 5638c2ecf20Sopenharmony_ci spinlock_t lock; 5648c2ecf20Sopenharmony_ci unsigned int pending; 5658c2ecf20Sopenharmony_ci unsigned int low; 5668c2ecf20Sopenharmony_ci unsigned int emptied; 5678c2ecf20Sopenharmony_ci unsigned int maximum; // size - 1 (q implementation) 5688c2ecf20Sopenharmony_ci struct { 5698c2ecf20Sopenharmony_ci rx_in * start; 5708c2ecf20Sopenharmony_ci rx_in * ptr; 5718c2ecf20Sopenharmony_ci rx_in * limit; 5728c2ecf20Sopenharmony_ci } in; 5738c2ecf20Sopenharmony_ci struct { 5748c2ecf20Sopenharmony_ci rx_out * start; 5758c2ecf20Sopenharmony_ci rx_out * ptr; 5768c2ecf20Sopenharmony_ci rx_out * limit; 5778c2ecf20Sopenharmony_ci } out; 5788c2ecf20Sopenharmony_ci unsigned int buffers_wanted; 5798c2ecf20Sopenharmony_ci unsigned int buffer_size; 5808c2ecf20Sopenharmony_ci} amb_rxq; 5818c2ecf20Sopenharmony_ci 5828c2ecf20Sopenharmony_citypedef struct { 5838c2ecf20Sopenharmony_ci unsigned long tx_ok; 5848c2ecf20Sopenharmony_ci struct { 5858c2ecf20Sopenharmony_ci unsigned long ok; 5868c2ecf20Sopenharmony_ci unsigned long error; 5878c2ecf20Sopenharmony_ci unsigned long badcrc; 5888c2ecf20Sopenharmony_ci unsigned long toolong; 5898c2ecf20Sopenharmony_ci unsigned long aborted; 5908c2ecf20Sopenharmony_ci unsigned long unused; 5918c2ecf20Sopenharmony_ci } rx; 5928c2ecf20Sopenharmony_ci} amb_stats; 5938c2ecf20Sopenharmony_ci 5948c2ecf20Sopenharmony_ci// a single struct pointed to by atm_vcc->dev_data 5958c2ecf20Sopenharmony_ci 5968c2ecf20Sopenharmony_citypedef struct { 5978c2ecf20Sopenharmony_ci u8 tx_vc_bits:7; 5988c2ecf20Sopenharmony_ci u8 tx_present:1; 5998c2ecf20Sopenharmony_ci} amb_tx_info; 6008c2ecf20Sopenharmony_ci 6018c2ecf20Sopenharmony_citypedef struct { 6028c2ecf20Sopenharmony_ci unsigned char pool; 6038c2ecf20Sopenharmony_ci} amb_rx_info; 6048c2ecf20Sopenharmony_ci 6058c2ecf20Sopenharmony_citypedef struct { 6068c2ecf20Sopenharmony_ci amb_rx_info rx_info; 6078c2ecf20Sopenharmony_ci u16 tx_frame_bits; 6088c2ecf20Sopenharmony_ci unsigned int tx_rate; 6098c2ecf20Sopenharmony_ci unsigned int rx_rate; 6108c2ecf20Sopenharmony_ci} amb_vcc; 6118c2ecf20Sopenharmony_ci 6128c2ecf20Sopenharmony_cistruct amb_dev { 6138c2ecf20Sopenharmony_ci u8 irq; 6148c2ecf20Sopenharmony_ci unsigned long flags; 6158c2ecf20Sopenharmony_ci u32 iobase; 6168c2ecf20Sopenharmony_ci u32 * membase; 6178c2ecf20Sopenharmony_ci 6188c2ecf20Sopenharmony_ci amb_cq cq; 6198c2ecf20Sopenharmony_ci amb_txq txq; 6208c2ecf20Sopenharmony_ci amb_rxq rxq[NUM_RX_POOLS]; 6218c2ecf20Sopenharmony_ci 6228c2ecf20Sopenharmony_ci struct mutex vcc_sf; 6238c2ecf20Sopenharmony_ci amb_tx_info txer[NUM_VCS]; 6248c2ecf20Sopenharmony_ci struct atm_vcc * rxer[NUM_VCS]; 6258c2ecf20Sopenharmony_ci unsigned int tx_avail; 6268c2ecf20Sopenharmony_ci unsigned int rx_avail; 6278c2ecf20Sopenharmony_ci 6288c2ecf20Sopenharmony_ci amb_stats stats; 6298c2ecf20Sopenharmony_ci 6308c2ecf20Sopenharmony_ci struct atm_dev * atm_dev; 6318c2ecf20Sopenharmony_ci struct pci_dev * pci_dev; 6328c2ecf20Sopenharmony_ci struct timer_list housekeeping; 6338c2ecf20Sopenharmony_ci}; 6348c2ecf20Sopenharmony_ci 6358c2ecf20Sopenharmony_citypedef struct amb_dev amb_dev; 6368c2ecf20Sopenharmony_ci 6378c2ecf20Sopenharmony_ci#define AMB_DEV(atm_dev) ((amb_dev *) (atm_dev)->dev_data) 6388c2ecf20Sopenharmony_ci#define AMB_VCC(atm_vcc) ((amb_vcc *) (atm_vcc)->dev_data) 6398c2ecf20Sopenharmony_ci 6408c2ecf20Sopenharmony_ci/* rate rounding */ 6418c2ecf20Sopenharmony_ci 6428c2ecf20Sopenharmony_citypedef enum { 6438c2ecf20Sopenharmony_ci round_up, 6448c2ecf20Sopenharmony_ci round_down, 6458c2ecf20Sopenharmony_ci round_nearest 6468c2ecf20Sopenharmony_ci} rounding; 6478c2ecf20Sopenharmony_ci 6488c2ecf20Sopenharmony_ci#endif 649