1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun Madge Horizon ATM Adapter driver. 4*4882a593Smuzhiyun Copyright (C) 1995-1999 Madge Networks Ltd. 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun /* 9*4882a593Smuzhiyun IMPORTANT NOTE: Madge Networks no longer makes the adapters 10*4882a593Smuzhiyun supported by this driver and makes no commitment to maintain it. 11*4882a593Smuzhiyun */ 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun /* too many macros - change to inline functions */ 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #ifndef DRIVER_ATM_HORIZON_H 16*4882a593Smuzhiyun #define DRIVER_ATM_HORIZON_H 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #ifdef CONFIG_ATM_HORIZON_DEBUG 20*4882a593Smuzhiyun #define DEBUG_HORIZON 21*4882a593Smuzhiyun #endif 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun #define DEV_LABEL "hrz" 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun #ifndef PCI_VENDOR_ID_MADGE 26*4882a593Smuzhiyun #define PCI_VENDOR_ID_MADGE 0x10B6 27*4882a593Smuzhiyun #endif 28*4882a593Smuzhiyun #ifndef PCI_DEVICE_ID_MADGE_HORIZON 29*4882a593Smuzhiyun #define PCI_DEVICE_ID_MADGE_HORIZON 0x1000 30*4882a593Smuzhiyun #endif 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun // diagnostic output 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun #define PRINTK(severity,format,args...) \ 35*4882a593Smuzhiyun printk(severity DEV_LABEL ": " format "\n" , ## args) 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun #ifdef DEBUG_HORIZON 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun #define DBG_ERR 0x0001 40*4882a593Smuzhiyun #define DBG_WARN 0x0002 41*4882a593Smuzhiyun #define DBG_INFO 0x0004 42*4882a593Smuzhiyun #define DBG_VCC 0x0008 43*4882a593Smuzhiyun #define DBG_QOS 0x0010 44*4882a593Smuzhiyun #define DBG_TX 0x0020 45*4882a593Smuzhiyun #define DBG_RX 0x0040 46*4882a593Smuzhiyun #define DBG_SKB 0x0080 47*4882a593Smuzhiyun #define DBG_IRQ 0x0100 48*4882a593Smuzhiyun #define DBG_FLOW 0x0200 49*4882a593Smuzhiyun #define DBG_BUS 0x0400 50*4882a593Smuzhiyun #define DBG_REGS 0x0800 51*4882a593Smuzhiyun #define DBG_DATA 0x1000 52*4882a593Smuzhiyun #define DBG_MASK 0x1fff 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun /* the ## prevents the annoying double expansion of the macro arguments */ 55*4882a593Smuzhiyun /* KERN_INFO is used since KERN_DEBUG often does not make it to the console */ 56*4882a593Smuzhiyun #define PRINTDB(bits,format,args...) \ 57*4882a593Smuzhiyun ( (debug & (bits)) ? printk (KERN_INFO DEV_LABEL ": " format , ## args) : 1 ) 58*4882a593Smuzhiyun #define PRINTDM(bits,format,args...) \ 59*4882a593Smuzhiyun ( (debug & (bits)) ? printk (format , ## args) : 1 ) 60*4882a593Smuzhiyun #define PRINTDE(bits,format,args...) \ 61*4882a593Smuzhiyun ( (debug & (bits)) ? printk (format "\n" , ## args) : 1 ) 62*4882a593Smuzhiyun #define PRINTD(bits,format,args...) \ 63*4882a593Smuzhiyun ( (debug & (bits)) ? printk (KERN_INFO DEV_LABEL ": " format "\n" , ## args) : 1 ) 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun #else 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun #define PRINTD(bits,format,args...) 68*4882a593Smuzhiyun #define PRINTDB(bits,format,args...) 69*4882a593Smuzhiyun #define PRINTDM(bits,format,args...) 70*4882a593Smuzhiyun #define PRINTDE(bits,format,args...) 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun #endif 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun #define PRINTDD(sec,fmt,args...) 75*4882a593Smuzhiyun #define PRINTDDB(sec,fmt,args...) 76*4882a593Smuzhiyun #define PRINTDDM(sec,fmt,args...) 77*4882a593Smuzhiyun #define PRINTDDE(sec,fmt,args...) 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun // fixed constants 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun #define SPARE_BUFFER_POOL_SIZE MAX_VCS 82*4882a593Smuzhiyun #define HRZ_MAX_VPI 4 83*4882a593Smuzhiyun #define MIN_PCI_LATENCY 48 // 24 IS TOO SMALL 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun /* Horizon specific bits */ 86*4882a593Smuzhiyun /* Register offsets */ 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun #define HRZ_IO_EXTENT 0x80 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun #define DATA_PORT_OFF 0x00 91*4882a593Smuzhiyun #define TX_CHANNEL_PORT_OFF 0x04 92*4882a593Smuzhiyun #define TX_DESCRIPTOR_PORT_OFF 0x08 93*4882a593Smuzhiyun #define MEMORY_PORT_OFF 0x0C 94*4882a593Smuzhiyun #define MEM_WR_ADDR_REG_OFF 0x14 95*4882a593Smuzhiyun #define MEM_RD_ADDR_REG_OFF 0x18 96*4882a593Smuzhiyun #define CONTROL_0_REG 0x1C 97*4882a593Smuzhiyun #define INT_SOURCE_REG_OFF 0x20 98*4882a593Smuzhiyun #define INT_ENABLE_REG_OFF 0x24 99*4882a593Smuzhiyun #define MASTER_RX_ADDR_REG_OFF 0x28 100*4882a593Smuzhiyun #define MASTER_RX_COUNT_REG_OFF 0x2C 101*4882a593Smuzhiyun #define MASTER_TX_ADDR_REG_OFF 0x30 102*4882a593Smuzhiyun #define MASTER_TX_COUNT_REG_OFF 0x34 103*4882a593Smuzhiyun #define TX_DESCRIPTOR_REG_OFF 0x38 104*4882a593Smuzhiyun #define TX_CHANNEL_CONFIG_COMMAND_OFF 0x40 105*4882a593Smuzhiyun #define TX_CHANNEL_CONFIG_DATA_OFF 0x44 106*4882a593Smuzhiyun #define TX_FREE_BUFFER_COUNT_OFF 0x48 107*4882a593Smuzhiyun #define RX_FREE_BUFFER_COUNT_OFF 0x4C 108*4882a593Smuzhiyun #define TX_CONFIG_OFF 0x50 109*4882a593Smuzhiyun #define TX_STATUS_OFF 0x54 110*4882a593Smuzhiyun #define RX_CONFIG_OFF 0x58 111*4882a593Smuzhiyun #define RX_LINE_CONFIG_OFF 0x5C 112*4882a593Smuzhiyun #define RX_QUEUE_RD_PTR_OFF 0x60 113*4882a593Smuzhiyun #define RX_QUEUE_WR_PTR_OFF 0x64 114*4882a593Smuzhiyun #define MAX_AAL5_CELL_COUNT_OFF 0x68 115*4882a593Smuzhiyun #define RX_CHANNEL_PORT_OFF 0x6C 116*4882a593Smuzhiyun #define TX_CELL_COUNT_OFF 0x70 117*4882a593Smuzhiyun #define RX_CELL_COUNT_OFF 0x74 118*4882a593Smuzhiyun #define HEC_ERROR_COUNT_OFF 0x78 119*4882a593Smuzhiyun #define UNASSIGNED_CELL_COUNT_OFF 0x7C 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun /* Register bit definitions */ 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun /* Control 0 register */ 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun #define SEEPROM_DO 0x00000001 126*4882a593Smuzhiyun #define SEEPROM_DI 0x00000002 127*4882a593Smuzhiyun #define SEEPROM_SK 0x00000004 128*4882a593Smuzhiyun #define SEEPROM_CS 0x00000008 129*4882a593Smuzhiyun #define DEBUG_BIT_0 0x00000010 130*4882a593Smuzhiyun #define DEBUG_BIT_1 0x00000020 131*4882a593Smuzhiyun #define DEBUG_BIT_2 0x00000040 132*4882a593Smuzhiyun // RESERVED 0x00000080 133*4882a593Smuzhiyun #define DEBUG_BIT_0_OE 0x00000100 134*4882a593Smuzhiyun #define DEBUG_BIT_1_OE 0x00000200 135*4882a593Smuzhiyun #define DEBUG_BIT_2_OE 0x00000400 136*4882a593Smuzhiyun // RESERVED 0x00000800 137*4882a593Smuzhiyun #define DEBUG_BIT_0_STATE 0x00001000 138*4882a593Smuzhiyun #define DEBUG_BIT_1_STATE 0x00002000 139*4882a593Smuzhiyun #define DEBUG_BIT_2_STATE 0x00004000 140*4882a593Smuzhiyun // RESERVED 0x00008000 141*4882a593Smuzhiyun #define GENERAL_BIT_0 0x00010000 142*4882a593Smuzhiyun #define GENERAL_BIT_1 0x00020000 143*4882a593Smuzhiyun #define GENERAL_BIT_2 0x00040000 144*4882a593Smuzhiyun #define GENERAL_BIT_3 0x00080000 145*4882a593Smuzhiyun #define RESET_HORIZON 0x00100000 146*4882a593Smuzhiyun #define RESET_ATM 0x00200000 147*4882a593Smuzhiyun #define RESET_RX 0x00400000 148*4882a593Smuzhiyun #define RESET_TX 0x00800000 149*4882a593Smuzhiyun #define RESET_HOST 0x01000000 150*4882a593Smuzhiyun // RESERVED 0x02000000 151*4882a593Smuzhiyun #define TARGET_RETRY_DISABLE 0x04000000 152*4882a593Smuzhiyun #define ATM_LAYER_SELECT 0x08000000 153*4882a593Smuzhiyun #define ATM_LAYER_STATUS 0x10000000 154*4882a593Smuzhiyun // RESERVED 0xE0000000 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun /* Interrupt source and enable registers */ 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun #define RX_DATA_AV 0x00000001 159*4882a593Smuzhiyun #define RX_DISABLED 0x00000002 160*4882a593Smuzhiyun #define TIMING_MARKER 0x00000004 161*4882a593Smuzhiyun #define FORCED 0x00000008 162*4882a593Smuzhiyun #define RX_BUS_MASTER_COMPLETE 0x00000010 163*4882a593Smuzhiyun #define TX_BUS_MASTER_COMPLETE 0x00000020 164*4882a593Smuzhiyun #define ABR_TX_CELL_COUNT_INT 0x00000040 165*4882a593Smuzhiyun #define DEBUG_INT 0x00000080 166*4882a593Smuzhiyun // RESERVED 0xFFFFFF00 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun /* PIO and Bus Mastering */ 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun #define MAX_PIO_COUNT 0x000000ff // 255 - make tunable? 171*4882a593Smuzhiyun // 8188 is a hard limit for bus mastering 172*4882a593Smuzhiyun #define MAX_TRANSFER_COUNT 0x00001ffc // 8188 173*4882a593Smuzhiyun #define MASTER_TX_AUTO_APPEND_DESC 0x80000000 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun /* TX channel config command port */ 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun #define PCR_TIMER_ACCESS 0x0000 178*4882a593Smuzhiyun #define SCR_TIMER_ACCESS 0x0001 179*4882a593Smuzhiyun #define BUCKET_CAPACITY_ACCESS 0x0002 180*4882a593Smuzhiyun #define BUCKET_FULLNESS_ACCESS 0x0003 181*4882a593Smuzhiyun #define RATE_TYPE_ACCESS 0x0004 182*4882a593Smuzhiyun // UNUSED 0x00F8 183*4882a593Smuzhiyun #define TX_CHANNEL_CONFIG_MULT 0x0100 184*4882a593Smuzhiyun // UNUSED 0xF800 185*4882a593Smuzhiyun #define BUCKET_MAX_SIZE 0x003f 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun /* TX channel config data port */ 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun #define CLOCK_SELECT_SHIFT 4 190*4882a593Smuzhiyun #define CLOCK_DISABLE 0x00ff 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun #define IDLE_RATE_TYPE 0x0 193*4882a593Smuzhiyun #define ABR_RATE_TYPE 0x1 194*4882a593Smuzhiyun #define VBR_RATE_TYPE 0x2 195*4882a593Smuzhiyun #define CBR_RATE_TYPE 0x3 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun /* TX config register */ 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun #define DRVR_DRVRBAR_ENABLE 0x0001 200*4882a593Smuzhiyun #define TXCLK_MUX_SELECT_RCLK 0x0002 201*4882a593Smuzhiyun #define TRANSMIT_TIMING_MARKER 0x0004 202*4882a593Smuzhiyun #define LOOPBACK_TIMING_MARKER 0x0008 203*4882a593Smuzhiyun #define TX_TEST_MODE_16MHz 0x0000 204*4882a593Smuzhiyun #define TX_TEST_MODE_8MHz 0x0010 205*4882a593Smuzhiyun #define TX_TEST_MODE_5_33MHz 0x0020 206*4882a593Smuzhiyun #define TX_TEST_MODE_4MHz 0x0030 207*4882a593Smuzhiyun #define TX_TEST_MODE_3_2MHz 0x0040 208*4882a593Smuzhiyun #define TX_TEST_MODE_2_66MHz 0x0050 209*4882a593Smuzhiyun #define TX_TEST_MODE_2_29MHz 0x0060 210*4882a593Smuzhiyun #define TX_NORMAL_OPERATION 0x0070 211*4882a593Smuzhiyun #define ABR_ROUND_ROBIN 0x0080 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun /* TX status register */ 214*4882a593Smuzhiyun 215*4882a593Smuzhiyun #define IDLE_CHANNELS_MASK 0x00FF 216*4882a593Smuzhiyun #define ABR_CELL_COUNT_REACHED_MULT 0x0100 217*4882a593Smuzhiyun #define ABR_CELL_COUNT_REACHED_MASK 0xFF 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun /* RX config register */ 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun #define NON_USER_CELLS_IN_ONE_CHANNEL 0x0008 222*4882a593Smuzhiyun #define RX_ENABLE 0x0010 223*4882a593Smuzhiyun #define IGNORE_UNUSED_VPI_VCI_BITS_SET 0x0000 224*4882a593Smuzhiyun #define NON_USER_UNUSED_VPI_VCI_BITS_SET 0x0020 225*4882a593Smuzhiyun #define DISCARD_UNUSED_VPI_VCI_BITS_SET 0x0040 226*4882a593Smuzhiyun 227*4882a593Smuzhiyun /* RX line config register */ 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun #define SIGNAL_LOSS 0x0001 230*4882a593Smuzhiyun #define FREQUENCY_DETECT_ERROR 0x0002 231*4882a593Smuzhiyun #define LOCK_DETECT_ERROR 0x0004 232*4882a593Smuzhiyun #define SELECT_INTERNAL_LOOPBACK 0x0008 233*4882a593Smuzhiyun #define LOCK_DETECT_ENABLE 0x0010 234*4882a593Smuzhiyun #define FREQUENCY_DETECT_ENABLE 0x0020 235*4882a593Smuzhiyun #define USER_FRAQ 0x0040 236*4882a593Smuzhiyun #define GXTALOUT_SELECT_DIV4 0x0080 237*4882a593Smuzhiyun #define GXTALOUT_SELECT_NO_GATING 0x0100 238*4882a593Smuzhiyun #define TIMING_MARKER_RECEIVED 0x0200 239*4882a593Smuzhiyun 240*4882a593Smuzhiyun /* RX channel port */ 241*4882a593Smuzhiyun 242*4882a593Smuzhiyun #define RX_CHANNEL_MASK 0x03FF 243*4882a593Smuzhiyun // UNUSED 0x3C00 244*4882a593Smuzhiyun #define FLUSH_CHANNEL 0x4000 245*4882a593Smuzhiyun #define RX_CHANNEL_UPDATE_IN_PROGRESS 0x8000 246*4882a593Smuzhiyun 247*4882a593Smuzhiyun /* Receive queue entry */ 248*4882a593Smuzhiyun 249*4882a593Smuzhiyun #define RX_Q_ENTRY_LENGTH_MASK 0x0000FFFF 250*4882a593Smuzhiyun #define RX_Q_ENTRY_CHANNEL_SHIFT 16 251*4882a593Smuzhiyun #define SIMONS_DODGEY_MARKER 0x08000000 252*4882a593Smuzhiyun #define RX_CONGESTION_EXPERIENCED 0x10000000 253*4882a593Smuzhiyun #define RX_CRC_10_OK 0x20000000 254*4882a593Smuzhiyun #define RX_CRC_32_OK 0x40000000 255*4882a593Smuzhiyun #define RX_COMPLETE_FRAME 0x80000000 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun /* Offsets and constants for use with the buffer memory */ 258*4882a593Smuzhiyun 259*4882a593Smuzhiyun /* Buffer pointers and channel types */ 260*4882a593Smuzhiyun 261*4882a593Smuzhiyun #define BUFFER_PTR_MASK 0x0000FFFF 262*4882a593Smuzhiyun #define RX_INT_THRESHOLD_MULT 0x00010000 263*4882a593Smuzhiyun #define RX_INT_THRESHOLD_MASK 0x07FF 264*4882a593Smuzhiyun #define INT_EVERY_N_CELLS 0x08000000 265*4882a593Smuzhiyun #define CONGESTION_EXPERIENCED 0x10000000 266*4882a593Smuzhiyun #define FIRST_CELL_OF_AAL5_FRAME 0x20000000 267*4882a593Smuzhiyun #define CHANNEL_TYPE_AAL5 0x00000000 268*4882a593Smuzhiyun #define CHANNEL_TYPE_RAW_CELLS 0x40000000 269*4882a593Smuzhiyun #define CHANNEL_TYPE_AAL3_4 0x80000000 270*4882a593Smuzhiyun 271*4882a593Smuzhiyun /* Buffer status stuff */ 272*4882a593Smuzhiyun 273*4882a593Smuzhiyun #define BUFF_STATUS_MASK 0x00030000 274*4882a593Smuzhiyun #define BUFF_STATUS_EMPTY 0x00000000 275*4882a593Smuzhiyun #define BUFF_STATUS_CELL_AV 0x00010000 276*4882a593Smuzhiyun #define BUFF_STATUS_LAST_CELL_AV 0x00020000 277*4882a593Smuzhiyun 278*4882a593Smuzhiyun /* Transmit channel stuff */ 279*4882a593Smuzhiyun 280*4882a593Smuzhiyun /* Receive channel stuff */ 281*4882a593Smuzhiyun 282*4882a593Smuzhiyun #define RX_CHANNEL_DISABLED 0x00000000 283*4882a593Smuzhiyun #define RX_CHANNEL_IDLE 0x00000001 284*4882a593Smuzhiyun 285*4882a593Smuzhiyun /* General things */ 286*4882a593Smuzhiyun 287*4882a593Smuzhiyun #define INITIAL_CRC 0xFFFFFFFF 288*4882a593Smuzhiyun 289*4882a593Smuzhiyun // A Horizon u32, a byte! Really nasty. Horizon pointers are (32 bit) 290*4882a593Smuzhiyun // word addresses and so standard C pointer operations break (as they 291*4882a593Smuzhiyun // assume byte addresses); so we pretend that Horizon words (and word 292*4882a593Smuzhiyun // pointers) are bytes (and byte pointers) for the purposes of having 293*4882a593Smuzhiyun // a memory map that works. 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun typedef u8 HDW; 296*4882a593Smuzhiyun 297*4882a593Smuzhiyun typedef struct cell_buf { 298*4882a593Smuzhiyun HDW payload[12]; 299*4882a593Smuzhiyun HDW next; 300*4882a593Smuzhiyun HDW cell_count; // AAL5 rx bufs 301*4882a593Smuzhiyun HDW res; 302*4882a593Smuzhiyun union { 303*4882a593Smuzhiyun HDW partial_crc; // AAL5 rx bufs 304*4882a593Smuzhiyun HDW cell_header; // RAW bufs 305*4882a593Smuzhiyun } u; 306*4882a593Smuzhiyun } cell_buf; 307*4882a593Smuzhiyun 308*4882a593Smuzhiyun typedef struct tx_ch_desc { 309*4882a593Smuzhiyun HDW rd_buf_type; 310*4882a593Smuzhiyun HDW wr_buf_type; 311*4882a593Smuzhiyun HDW partial_crc; 312*4882a593Smuzhiyun HDW cell_header; 313*4882a593Smuzhiyun } tx_ch_desc; 314*4882a593Smuzhiyun 315*4882a593Smuzhiyun typedef struct rx_ch_desc { 316*4882a593Smuzhiyun HDW wr_buf_type; 317*4882a593Smuzhiyun HDW rd_buf_type; 318*4882a593Smuzhiyun } rx_ch_desc; 319*4882a593Smuzhiyun 320*4882a593Smuzhiyun typedef struct rx_q_entry { 321*4882a593Smuzhiyun HDW entry; 322*4882a593Smuzhiyun } rx_q_entry; 323*4882a593Smuzhiyun 324*4882a593Smuzhiyun #define TX_CHANS 8 325*4882a593Smuzhiyun #define RX_CHANS 1024 326*4882a593Smuzhiyun #define RX_QS 1024 327*4882a593Smuzhiyun #define MAX_VCS RX_CHANS 328*4882a593Smuzhiyun 329*4882a593Smuzhiyun /* Horizon buffer memory map */ 330*4882a593Smuzhiyun 331*4882a593Smuzhiyun // TX Channel Descriptors 2 332*4882a593Smuzhiyun // TX Initial Buffers 8 // TX_CHANS 333*4882a593Smuzhiyun #define BUFN1_SIZE 118 // (126 - TX_CHANS) 334*4882a593Smuzhiyun // RX/TX Start/End Buffers 4 335*4882a593Smuzhiyun #define BUFN2_SIZE 124 336*4882a593Smuzhiyun // RX Queue Entries 64 337*4882a593Smuzhiyun #define BUFN3_SIZE 192 338*4882a593Smuzhiyun // RX Channel Descriptors 128 339*4882a593Smuzhiyun #define BUFN4_SIZE 1408 340*4882a593Smuzhiyun // TOTAL cell_buff chunks 2048 341*4882a593Smuzhiyun 342*4882a593Smuzhiyun // cell_buf bufs[2048]; 343*4882a593Smuzhiyun // HDW dws[32768]; 344*4882a593Smuzhiyun 345*4882a593Smuzhiyun typedef struct MEMMAP { 346*4882a593Smuzhiyun tx_ch_desc tx_descs[TX_CHANS]; // 8 * 4 = 32 , 0x0020 347*4882a593Smuzhiyun cell_buf inittxbufs[TX_CHANS]; // these are really 348*4882a593Smuzhiyun cell_buf bufn1[BUFN1_SIZE]; // part of this pool 349*4882a593Smuzhiyun cell_buf txfreebufstart; 350*4882a593Smuzhiyun cell_buf txfreebufend; 351*4882a593Smuzhiyun cell_buf rxfreebufstart; 352*4882a593Smuzhiyun cell_buf rxfreebufend; // 8+118+1+1+1+1+124 = 254 353*4882a593Smuzhiyun cell_buf bufn2[BUFN2_SIZE]; // 16 * 254 = 4064 , 0x1000 354*4882a593Smuzhiyun rx_q_entry rx_q_entries[RX_QS]; // 1 * 1024 = 1024 , 0x1400 355*4882a593Smuzhiyun cell_buf bufn3[BUFN3_SIZE]; // 16 * 192 = 3072 , 0x2000 356*4882a593Smuzhiyun rx_ch_desc rx_descs[MAX_VCS]; // 2 * 1024 = 2048 , 0x2800 357*4882a593Smuzhiyun cell_buf bufn4[BUFN4_SIZE]; // 16 * 1408 = 22528 , 0x8000 358*4882a593Smuzhiyun } MEMMAP; 359*4882a593Smuzhiyun 360*4882a593Smuzhiyun #define memmap ((MEMMAP *)0) 361*4882a593Smuzhiyun 362*4882a593Smuzhiyun /* end horizon specific bits */ 363*4882a593Smuzhiyun 364*4882a593Smuzhiyun typedef enum { 365*4882a593Smuzhiyun aal0, 366*4882a593Smuzhiyun aal34, 367*4882a593Smuzhiyun aal5 368*4882a593Smuzhiyun } hrz_aal; 369*4882a593Smuzhiyun 370*4882a593Smuzhiyun typedef enum { 371*4882a593Smuzhiyun tx_busy, 372*4882a593Smuzhiyun rx_busy, 373*4882a593Smuzhiyun ultra 374*4882a593Smuzhiyun } hrz_flags; 375*4882a593Smuzhiyun 376*4882a593Smuzhiyun // a single struct pointed to by atm_vcc->dev_data 377*4882a593Smuzhiyun 378*4882a593Smuzhiyun typedef struct { 379*4882a593Smuzhiyun unsigned int tx_rate; 380*4882a593Smuzhiyun unsigned int rx_rate; 381*4882a593Smuzhiyun u16 channel; 382*4882a593Smuzhiyun u16 tx_xbr_bits; 383*4882a593Smuzhiyun u16 tx_pcr_bits; 384*4882a593Smuzhiyun #if 0 385*4882a593Smuzhiyun u16 tx_scr_bits; 386*4882a593Smuzhiyun u16 tx_bucket_bits; 387*4882a593Smuzhiyun #endif 388*4882a593Smuzhiyun hrz_aal aal; 389*4882a593Smuzhiyun } hrz_vcc; 390*4882a593Smuzhiyun 391*4882a593Smuzhiyun struct hrz_dev { 392*4882a593Smuzhiyun 393*4882a593Smuzhiyun u32 iobase; 394*4882a593Smuzhiyun u32 * membase; 395*4882a593Smuzhiyun 396*4882a593Smuzhiyun struct sk_buff * rx_skb; // skb being RXed 397*4882a593Smuzhiyun unsigned int rx_bytes; // bytes remaining to RX within region 398*4882a593Smuzhiyun void * rx_addr; // addr to send bytes to (for PIO) 399*4882a593Smuzhiyun unsigned int rx_channel; // channel that the skb is going out on 400*4882a593Smuzhiyun 401*4882a593Smuzhiyun struct sk_buff * tx_skb; // skb being TXed 402*4882a593Smuzhiyun unsigned int tx_bytes; // bytes remaining to TX within region 403*4882a593Smuzhiyun void * tx_addr; // addr to send bytes from (for PIO) 404*4882a593Smuzhiyun struct iovec * tx_iovec; // remaining regions 405*4882a593Smuzhiyun unsigned int tx_regions; // number of remaining regions 406*4882a593Smuzhiyun 407*4882a593Smuzhiyun spinlock_t mem_lock; 408*4882a593Smuzhiyun wait_queue_head_t tx_queue; 409*4882a593Smuzhiyun 410*4882a593Smuzhiyun u8 irq; 411*4882a593Smuzhiyun unsigned long flags; 412*4882a593Smuzhiyun u8 tx_last; 413*4882a593Smuzhiyun u8 tx_idle; 414*4882a593Smuzhiyun 415*4882a593Smuzhiyun rx_q_entry * rx_q_reset; 416*4882a593Smuzhiyun rx_q_entry * rx_q_entry; 417*4882a593Smuzhiyun rx_q_entry * rx_q_wrap; 418*4882a593Smuzhiyun 419*4882a593Smuzhiyun struct atm_dev * atm_dev; 420*4882a593Smuzhiyun 421*4882a593Smuzhiyun u32 last_vc; 422*4882a593Smuzhiyun 423*4882a593Smuzhiyun int noof_spare_buffers; 424*4882a593Smuzhiyun u16 spare_buffers[SPARE_BUFFER_POOL_SIZE]; 425*4882a593Smuzhiyun 426*4882a593Smuzhiyun u16 tx_channel_record[TX_CHANS]; 427*4882a593Smuzhiyun 428*4882a593Smuzhiyun // this is what we follow when we get incoming data 429*4882a593Smuzhiyun u32 txer[MAX_VCS/32]; 430*4882a593Smuzhiyun struct atm_vcc * rxer[MAX_VCS]; 431*4882a593Smuzhiyun 432*4882a593Smuzhiyun // cell rate allocation 433*4882a593Smuzhiyun spinlock_t rate_lock; 434*4882a593Smuzhiyun unsigned int rx_avail; 435*4882a593Smuzhiyun unsigned int tx_avail; 436*4882a593Smuzhiyun 437*4882a593Smuzhiyun // dev stats 438*4882a593Smuzhiyun unsigned long tx_cell_count; 439*4882a593Smuzhiyun unsigned long rx_cell_count; 440*4882a593Smuzhiyun unsigned long hec_error_count; 441*4882a593Smuzhiyun unsigned long unassigned_cell_count; 442*4882a593Smuzhiyun 443*4882a593Smuzhiyun struct pci_dev * pci_dev; 444*4882a593Smuzhiyun struct timer_list housekeeping; 445*4882a593Smuzhiyun }; 446*4882a593Smuzhiyun 447*4882a593Smuzhiyun typedef struct hrz_dev hrz_dev; 448*4882a593Smuzhiyun 449*4882a593Smuzhiyun /* macros for use later */ 450*4882a593Smuzhiyun 451*4882a593Smuzhiyun #define BUF_PTR(cbptr) ((cbptr) - (cell_buf *) 0) 452*4882a593Smuzhiyun 453*4882a593Smuzhiyun #define INTERESTING_INTERRUPTS \ 454*4882a593Smuzhiyun (RX_DATA_AV | RX_DISABLED | TX_BUS_MASTER_COMPLETE | RX_BUS_MASTER_COMPLETE) 455*4882a593Smuzhiyun 456*4882a593Smuzhiyun // 190 cells by default (192 TX buffers - 2 elbow room, see docs) 457*4882a593Smuzhiyun #define TX_AAL5_LIMIT (190*ATM_CELL_PAYLOAD-ATM_AAL5_TRAILER) // 9112 458*4882a593Smuzhiyun 459*4882a593Smuzhiyun // Have enough RX buffers (unless we allow other buffer splits) 460*4882a593Smuzhiyun #define RX_AAL5_LIMIT ATM_MAX_AAL5_PDU 461*4882a593Smuzhiyun 462*4882a593Smuzhiyun /* multi-statement macro protector */ 463*4882a593Smuzhiyun #define DW(x) do{ x } while(0) 464*4882a593Smuzhiyun 465*4882a593Smuzhiyun #define HRZ_DEV(atm_dev) ((hrz_dev *) (atm_dev)->dev_data) 466*4882a593Smuzhiyun #define HRZ_VCC(atm_vcc) ((hrz_vcc *) (atm_vcc)->dev_data) 467*4882a593Smuzhiyun 468*4882a593Smuzhiyun /* Turn the LEDs on and off */ 469*4882a593Smuzhiyun // The LEDs bits are upside down in that setting the bit in the debug 470*4882a593Smuzhiyun // register will turn the appropriate LED off. 471*4882a593Smuzhiyun 472*4882a593Smuzhiyun #define YELLOW_LED DEBUG_BIT_0 473*4882a593Smuzhiyun #define GREEN_LED DEBUG_BIT_1 474*4882a593Smuzhiyun #define YELLOW_LED_OE DEBUG_BIT_0_OE 475*4882a593Smuzhiyun #define GREEN_LED_OE DEBUG_BIT_1_OE 476*4882a593Smuzhiyun 477*4882a593Smuzhiyun #define GREEN_LED_OFF(dev) \ 478*4882a593Smuzhiyun wr_regl (dev, CONTROL_0_REG, rd_regl (dev, CONTROL_0_REG) | GREEN_LED) 479*4882a593Smuzhiyun #define GREEN_LED_ON(dev) \ 480*4882a593Smuzhiyun wr_regl (dev, CONTROL_0_REG, rd_regl (dev, CONTROL_0_REG) &~ GREEN_LED) 481*4882a593Smuzhiyun #define YELLOW_LED_OFF(dev) \ 482*4882a593Smuzhiyun wr_regl (dev, CONTROL_0_REG, rd_regl (dev, CONTROL_0_REG) | YELLOW_LED) 483*4882a593Smuzhiyun #define YELLOW_LED_ON(dev) \ 484*4882a593Smuzhiyun wr_regl (dev, CONTROL_0_REG, rd_regl (dev, CONTROL_0_REG) &~ YELLOW_LED) 485*4882a593Smuzhiyun 486*4882a593Smuzhiyun typedef enum { 487*4882a593Smuzhiyun round_up, 488*4882a593Smuzhiyun round_down, 489*4882a593Smuzhiyun round_nearest 490*4882a593Smuzhiyun } rounding; 491*4882a593Smuzhiyun 492*4882a593Smuzhiyun #endif /* DRIVER_ATM_HORIZON_H */ 493