1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /****************************************************************************** 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * (C)Copyright 1998,1999 SysKonnect, 5*4882a593Smuzhiyun * a business unit of Schneider & Koch & Co. Datensysteme GmbH. 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * The information in this file is provided "AS IS" without warranty. 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun ******************************************************************************/ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #ifndef _SCMECM_ 12*4882a593Smuzhiyun #define _SCMECM_ 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #if defined(PCI) && !defined(OSDEF) 15*4882a593Smuzhiyun /* 16*4882a593Smuzhiyun * In the case of the PCI bus the file osdef1st.h must be present 17*4882a593Smuzhiyun */ 18*4882a593Smuzhiyun #define OSDEF 19*4882a593Smuzhiyun #endif 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun #ifdef PCI 22*4882a593Smuzhiyun #ifndef SUPERNET_3 23*4882a593Smuzhiyun #define SUPERNET_3 24*4882a593Smuzhiyun #endif 25*4882a593Smuzhiyun #ifndef TAG_MODE 26*4882a593Smuzhiyun #define TAG_MODE 27*4882a593Smuzhiyun #endif 28*4882a593Smuzhiyun #endif 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /* 31*4882a593Smuzhiyun * include all other files in required order 32*4882a593Smuzhiyun * the following files must have been included before: 33*4882a593Smuzhiyun * types.h 34*4882a593Smuzhiyun * fddi.h 35*4882a593Smuzhiyun */ 36*4882a593Smuzhiyun #ifdef OSDEF 37*4882a593Smuzhiyun #include "osdef1st.h" 38*4882a593Smuzhiyun #endif /* OSDEF */ 39*4882a593Smuzhiyun #ifdef OEM_CONCEPT 40*4882a593Smuzhiyun #include "oemdef.h" 41*4882a593Smuzhiyun #endif /* OEM_CONCEPT */ 42*4882a593Smuzhiyun #include "smt.h" 43*4882a593Smuzhiyun #include "cmtdef.h" 44*4882a593Smuzhiyun #include "fddimib.h" 45*4882a593Smuzhiyun #include "targethw.h" /* all target hw dependencies */ 46*4882a593Smuzhiyun #include "targetos.h" /* all target os dependencies */ 47*4882a593Smuzhiyun #ifdef ESS 48*4882a593Smuzhiyun #include "sba.h" 49*4882a593Smuzhiyun #endif 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun /* 52*4882a593Smuzhiyun * Event Queue 53*4882a593Smuzhiyun * queue.c 54*4882a593Smuzhiyun * events are class/value pairs 55*4882a593Smuzhiyun * class is addressee, e.g. RMT, PCM etc. 56*4882a593Smuzhiyun * value is command, e.g. line state change, ring op change etc. 57*4882a593Smuzhiyun */ 58*4882a593Smuzhiyun struct event_queue { 59*4882a593Smuzhiyun u_short class ; /* event class */ 60*4882a593Smuzhiyun u_short event ; /* event value */ 61*4882a593Smuzhiyun } ; 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun /* 64*4882a593Smuzhiyun * define event queue as circular buffer 65*4882a593Smuzhiyun */ 66*4882a593Smuzhiyun #ifdef CONCENTRATOR 67*4882a593Smuzhiyun #define MAX_EVENT 128 68*4882a593Smuzhiyun #else /* nCONCENTRATOR */ 69*4882a593Smuzhiyun #define MAX_EVENT 64 70*4882a593Smuzhiyun #endif /* nCONCENTRATOR */ 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun struct s_queue { 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun struct event_queue ev_queue[MAX_EVENT]; 75*4882a593Smuzhiyun struct event_queue *ev_put ; 76*4882a593Smuzhiyun struct event_queue *ev_get ; 77*4882a593Smuzhiyun } ; 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun /* 80*4882a593Smuzhiyun * ECM - Entity Coordination Management 81*4882a593Smuzhiyun * ecm.c 82*4882a593Smuzhiyun */ 83*4882a593Smuzhiyun struct s_ecm { 84*4882a593Smuzhiyun u_char path_test ; /* ECM path test variable */ 85*4882a593Smuzhiyun u_char sb_flag ; /* ECM stuck bypass */ 86*4882a593Smuzhiyun u_char DisconnectFlag ; /* jd 05-Aug-1999 Bug #10419 87*4882a593Smuzhiyun * ECM disconnected */ 88*4882a593Smuzhiyun u_char ecm_line_state ; /* flag to dispatcher : line states */ 89*4882a593Smuzhiyun u_long trace_prop ; /* ECM Trace_Prop flag >= 16 bits !! */ 90*4882a593Smuzhiyun /* NUMPHYS note: 91*4882a593Smuzhiyun * this variable must have enough bits to hold all entiies in 92*4882a593Smuzhiyun * the station. So NUMPHYS may not be greater than 31. 93*4882a593Smuzhiyun */ 94*4882a593Smuzhiyun char ec_pad[2] ; 95*4882a593Smuzhiyun struct smt_timer ecm_timer ; /* timer */ 96*4882a593Smuzhiyun } ; 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun /* 100*4882a593Smuzhiyun * RMT - Ring Management 101*4882a593Smuzhiyun * rmt.c 102*4882a593Smuzhiyun */ 103*4882a593Smuzhiyun struct s_rmt { 104*4882a593Smuzhiyun u_char dup_addr_test ; /* state of dupl. addr. test */ 105*4882a593Smuzhiyun u_char da_flag ; /* flag : duplicate address det. */ 106*4882a593Smuzhiyun u_char loop_avail ; /* flag : MAC available for loopback */ 107*4882a593Smuzhiyun u_char sm_ma_avail ; /* flag : MAC available for SMT */ 108*4882a593Smuzhiyun u_char no_flag ; /* flag : ring not operational */ 109*4882a593Smuzhiyun u_char bn_flag ; /* flag : MAC reached beacon state */ 110*4882a593Smuzhiyun u_char jm_flag ; /* flag : jamming in NON_OP_DUP */ 111*4882a593Smuzhiyun u_char rm_join ; /* CFM flag RM_Join */ 112*4882a593Smuzhiyun u_char rm_loop ; /* CFM flag RM_Loop */ 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun long fast_rm_join ; /* bit mask of active ports */ 115*4882a593Smuzhiyun /* 116*4882a593Smuzhiyun * timer and flags 117*4882a593Smuzhiyun */ 118*4882a593Smuzhiyun struct smt_timer rmt_timer0 ; /* timer 0 */ 119*4882a593Smuzhiyun struct smt_timer rmt_timer1 ; /* timer 1 */ 120*4882a593Smuzhiyun struct smt_timer rmt_timer2 ; /* timer 2 */ 121*4882a593Smuzhiyun u_char timer0_exp ; /* flag : timer 0 expired */ 122*4882a593Smuzhiyun u_char timer1_exp ; /* flag : timer 1 expired */ 123*4882a593Smuzhiyun u_char timer2_exp ; /* flag : timer 2 expired */ 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun u_char rm_pad1; 126*4882a593Smuzhiyun } ; 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun /* 129*4882a593Smuzhiyun * CFM - Configuration Management 130*4882a593Smuzhiyun * cfm.c 131*4882a593Smuzhiyun * used for SAS and DAS 132*4882a593Smuzhiyun */ 133*4882a593Smuzhiyun struct s_cfm { 134*4882a593Smuzhiyun u_char cf_state; /* CFM state machine current state */ 135*4882a593Smuzhiyun u_char cf_pad[3] ; 136*4882a593Smuzhiyun } ; 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun /* 139*4882a593Smuzhiyun * CEM - Configuration Element Management 140*4882a593Smuzhiyun * cem.c 141*4882a593Smuzhiyun * used for Concentrator 142*4882a593Smuzhiyun */ 143*4882a593Smuzhiyun #ifdef CONCENTRATOR 144*4882a593Smuzhiyun struct s_cem { 145*4882a593Smuzhiyun int ce_state ; /* CEM state */ 146*4882a593Smuzhiyun int ce_port ; /* PA PB PM PM+1 .. */ 147*4882a593Smuzhiyun int ce_type ; /* TA TB TS TM */ 148*4882a593Smuzhiyun } ; 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun /* 151*4882a593Smuzhiyun * linked list of CCEs in current token path 152*4882a593Smuzhiyun */ 153*4882a593Smuzhiyun struct s_c_ring { 154*4882a593Smuzhiyun struct s_c_ring *c_next ; 155*4882a593Smuzhiyun char c_entity ; 156*4882a593Smuzhiyun } ; 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun struct mib_path_config { 159*4882a593Smuzhiyun u_long fddimibPATHConfigSMTIndex; 160*4882a593Smuzhiyun u_long fddimibPATHConfigPATHIndex; 161*4882a593Smuzhiyun u_long fddimibPATHConfigTokenOrder; 162*4882a593Smuzhiyun u_long fddimibPATHConfigResourceType; 163*4882a593Smuzhiyun #define SNMP_RES_TYPE_MAC 2 /* Resource is a MAC */ 164*4882a593Smuzhiyun #define SNMP_RES_TYPE_PORT 4 /* Resource is a PORT */ 165*4882a593Smuzhiyun u_long fddimibPATHConfigResourceIndex; 166*4882a593Smuzhiyun u_long fddimibPATHConfigCurrentPath; 167*4882a593Smuzhiyun #define SNMP_PATH_ISOLATED 1 /* Current path is isolated */ 168*4882a593Smuzhiyun #define SNMP_PATH_LOCAL 2 /* Current path is local */ 169*4882a593Smuzhiyun #define SNMP_PATH_SECONDARY 3 /* Current path is secondary */ 170*4882a593Smuzhiyun #define SNMP_PATH_PRIMARY 4 /* Current path is primary */ 171*4882a593Smuzhiyun #define SNMP_PATH_CONCATENATED 5 /* Current path is concatenated */ 172*4882a593Smuzhiyun #define SNMP_PATH_THRU 6 /* Current path is thru */ 173*4882a593Smuzhiyun }; 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun #endif 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun /* 179*4882a593Smuzhiyun * PCM connect states 180*4882a593Smuzhiyun */ 181*4882a593Smuzhiyun #define PCM_DISABLED 0 182*4882a593Smuzhiyun #define PCM_CONNECTING 1 183*4882a593Smuzhiyun #define PCM_STANDBY 2 184*4882a593Smuzhiyun #define PCM_ACTIVE 3 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun struct s_pcm { 187*4882a593Smuzhiyun u_char pcm_pad[3] ; 188*4882a593Smuzhiyun } ; 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun /* 191*4882a593Smuzhiyun * PHY struct 192*4882a593Smuzhiyun * one per physical port 193*4882a593Smuzhiyun */ 194*4882a593Smuzhiyun struct s_phy { 195*4882a593Smuzhiyun /* Inter Module Globals */ 196*4882a593Smuzhiyun struct fddi_mib_p *mib ; 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun u_char np ; /* index 0 .. NUMPHYS */ 199*4882a593Smuzhiyun u_char cf_join ; 200*4882a593Smuzhiyun u_char cf_loop ; 201*4882a593Smuzhiyun u_char wc_flag ; /* withhold connection flag */ 202*4882a593Smuzhiyun u_char pc_mode ; /* Holds the negotiated mode of the PCM */ 203*4882a593Smuzhiyun u_char pc_lem_fail ; /* flag : LCT failed */ 204*4882a593Smuzhiyun u_char lc_test ; 205*4882a593Smuzhiyun u_char scrub ; /* CFM flag Scrub -> PCM */ 206*4882a593Smuzhiyun char phy_name ; 207*4882a593Smuzhiyun u_char pmd_type[2] ; /* SK connector/transceiver type codes */ 208*4882a593Smuzhiyun #define PMD_SK_CONN 0 /* pmd_type[PMD_SK_CONN] = Connector */ 209*4882a593Smuzhiyun #define PMD_SK_PMD 1 /* pmd_type[PMD_SK_PMD] = Xver */ 210*4882a593Smuzhiyun u_char pmd_scramble ; /* scrambler on/off */ 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun /* inner Module Globals */ 213*4882a593Smuzhiyun u_char curr_ls ; /* current line state */ 214*4882a593Smuzhiyun u_char ls_flag ; 215*4882a593Smuzhiyun u_char rc_flag ; 216*4882a593Smuzhiyun u_char tc_flag ; 217*4882a593Smuzhiyun u_char td_flag ; 218*4882a593Smuzhiyun u_char bitn ; 219*4882a593Smuzhiyun u_char tr_flag ; /* trace recvd while in active */ 220*4882a593Smuzhiyun u_char twisted ; /* flag to indicate an A-A or B-B connection */ 221*4882a593Smuzhiyun u_char t_val[NUMBITS] ; /* transmit bits for signaling */ 222*4882a593Smuzhiyun u_char r_val[NUMBITS] ; /* receive bits for signaling */ 223*4882a593Smuzhiyun u_long t_next[NUMBITS] ; 224*4882a593Smuzhiyun struct smt_timer pcm_timer0 ; 225*4882a593Smuzhiyun struct smt_timer pcm_timer1 ; 226*4882a593Smuzhiyun struct smt_timer pcm_timer2 ; 227*4882a593Smuzhiyun u_char timer0_exp ; 228*4882a593Smuzhiyun u_char timer1_exp ; 229*4882a593Smuzhiyun u_char timer2_exp ; 230*4882a593Smuzhiyun u_char pcm_pad1[1] ; 231*4882a593Smuzhiyun int cem_pst ; /* CEM privae state; used for dual homing */ 232*4882a593Smuzhiyun struct lem_counter lem ; 233*4882a593Smuzhiyun #ifdef AMDPLC 234*4882a593Smuzhiyun struct s_plc plc ; 235*4882a593Smuzhiyun #endif 236*4882a593Smuzhiyun } ; 237*4882a593Smuzhiyun 238*4882a593Smuzhiyun /* 239*4882a593Smuzhiyun * timer package 240*4882a593Smuzhiyun * smttimer.c 241*4882a593Smuzhiyun */ 242*4882a593Smuzhiyun struct s_timer { 243*4882a593Smuzhiyun struct smt_timer *st_queue ; 244*4882a593Smuzhiyun struct smt_timer st_fast ; 245*4882a593Smuzhiyun } ; 246*4882a593Smuzhiyun 247*4882a593Smuzhiyun /* 248*4882a593Smuzhiyun * SRF types and data 249*4882a593Smuzhiyun */ 250*4882a593Smuzhiyun #define SMT_EVENT_BASE 1 251*4882a593Smuzhiyun #define SMT_EVENT_MAC_PATH_CHANGE (SMT_EVENT_BASE+0) 252*4882a593Smuzhiyun #define SMT_EVENT_MAC_NEIGHBOR_CHANGE (SMT_EVENT_BASE+1) 253*4882a593Smuzhiyun #define SMT_EVENT_PORT_PATH_CHANGE (SMT_EVENT_BASE+2) 254*4882a593Smuzhiyun #define SMT_EVENT_PORT_CONNECTION (SMT_EVENT_BASE+3) 255*4882a593Smuzhiyun 256*4882a593Smuzhiyun #define SMT_IS_CONDITION(x) ((x)>=SMT_COND_BASE) 257*4882a593Smuzhiyun 258*4882a593Smuzhiyun #define SMT_COND_BASE (SMT_EVENT_PORT_CONNECTION+1) 259*4882a593Smuzhiyun #define SMT_COND_SMT_PEER_WRAP (SMT_COND_BASE+0) 260*4882a593Smuzhiyun #define SMT_COND_SMT_HOLD (SMT_COND_BASE+1) 261*4882a593Smuzhiyun #define SMT_COND_MAC_FRAME_ERROR (SMT_COND_BASE+2) 262*4882a593Smuzhiyun #define SMT_COND_MAC_DUP_ADDR (SMT_COND_BASE+3) 263*4882a593Smuzhiyun #define SMT_COND_MAC_NOT_COPIED (SMT_COND_BASE+4) 264*4882a593Smuzhiyun #define SMT_COND_PORT_EB_ERROR (SMT_COND_BASE+5) 265*4882a593Smuzhiyun #define SMT_COND_PORT_LER (SMT_COND_BASE+6) 266*4882a593Smuzhiyun 267*4882a593Smuzhiyun #define SR0_WAIT 0 268*4882a593Smuzhiyun #define SR1_HOLDOFF 1 269*4882a593Smuzhiyun #define SR2_DISABLED 2 270*4882a593Smuzhiyun 271*4882a593Smuzhiyun struct s_srf { 272*4882a593Smuzhiyun u_long SRThreshold ; /* threshold value */ 273*4882a593Smuzhiyun u_char RT_Flag ; /* report transmitted flag */ 274*4882a593Smuzhiyun u_char sr_state ; /* state-machine */ 275*4882a593Smuzhiyun u_char any_report ; /* any report required */ 276*4882a593Smuzhiyun u_long TSR ; /* timer */ 277*4882a593Smuzhiyun u_short ring_status ; /* IBM ring status */ 278*4882a593Smuzhiyun } ; 279*4882a593Smuzhiyun 280*4882a593Smuzhiyun /* 281*4882a593Smuzhiyun * IBM token ring status 282*4882a593Smuzhiyun */ 283*4882a593Smuzhiyun #define RS_RES15 (1<<15) /* reserved */ 284*4882a593Smuzhiyun #define RS_HARDERROR (1<<14) /* ring down */ 285*4882a593Smuzhiyun #define RS_SOFTERROR (1<<13) /* sent SRF */ 286*4882a593Smuzhiyun #define RS_BEACON (1<<12) /* transmitted beacon */ 287*4882a593Smuzhiyun #define RS_PATHTEST (1<<11) /* path test failed */ 288*4882a593Smuzhiyun #define RS_SELFTEST (1<<10) /* selftest required */ 289*4882a593Smuzhiyun #define RS_RES9 (1<< 9) /* reserved */ 290*4882a593Smuzhiyun #define RS_DISCONNECT (1<< 8) /* remote disconnect */ 291*4882a593Smuzhiyun #define RS_RES7 (1<< 7) /* reserved */ 292*4882a593Smuzhiyun #define RS_DUPADDR (1<< 6) /* duplicate address */ 293*4882a593Smuzhiyun #define RS_NORINGOP (1<< 5) /* no ring op */ 294*4882a593Smuzhiyun #define RS_VERSION (1<< 4) /* SMT version mismatch */ 295*4882a593Smuzhiyun #define RS_STUCKBYPASSS (1<< 3) /* stuck bypass */ 296*4882a593Smuzhiyun #define RS_EVENT (1<< 2) /* FDDI event occurred */ 297*4882a593Smuzhiyun #define RS_RINGOPCHANGE (1<< 1) /* ring op changed */ 298*4882a593Smuzhiyun #define RS_RES0 (1<< 0) /* reserved */ 299*4882a593Smuzhiyun 300*4882a593Smuzhiyun #define RS_SET(smc,bit) \ 301*4882a593Smuzhiyun ring_status_indication(smc,smc->srf.ring_status |= bit) 302*4882a593Smuzhiyun #define RS_CLEAR(smc,bit) \ 303*4882a593Smuzhiyun ring_status_indication(smc,smc->srf.ring_status &= ~bit) 304*4882a593Smuzhiyun 305*4882a593Smuzhiyun #define RS_CLEAR_EVENT (0xffff & ~(RS_NORINGOP)) 306*4882a593Smuzhiyun 307*4882a593Smuzhiyun /* Define the AIX-event-Notification as null function if it isn't defined */ 308*4882a593Smuzhiyun /* in the targetos.h file */ 309*4882a593Smuzhiyun #ifndef AIX_EVENT 310*4882a593Smuzhiyun #define AIX_EVENT(smc,opt0,opt1,opt2,opt3) /* nothing */ 311*4882a593Smuzhiyun #endif 312*4882a593Smuzhiyun 313*4882a593Smuzhiyun struct s_srf_evc { 314*4882a593Smuzhiyun u_char evc_code ; /* event code type */ 315*4882a593Smuzhiyun u_char evc_index ; /* index for mult. instances */ 316*4882a593Smuzhiyun u_char evc_rep_required ; /* report required */ 317*4882a593Smuzhiyun u_short evc_para ; /* SMT Para Number */ 318*4882a593Smuzhiyun u_char *evc_cond_state ; /* condition state */ 319*4882a593Smuzhiyun u_char *evc_multiple ; /* multiple occurrence */ 320*4882a593Smuzhiyun } ; 321*4882a593Smuzhiyun 322*4882a593Smuzhiyun /* 323*4882a593Smuzhiyun * Values used by frame based services 324*4882a593Smuzhiyun * smt.c 325*4882a593Smuzhiyun */ 326*4882a593Smuzhiyun #define SMT_MAX_TEST 5 327*4882a593Smuzhiyun #define SMT_TID_NIF 0 /* pending NIF request */ 328*4882a593Smuzhiyun #define SMT_TID_NIF_TEST 1 /* pending NIF test */ 329*4882a593Smuzhiyun #define SMT_TID_ECF_UNA 2 /* pending ECF UNA test */ 330*4882a593Smuzhiyun #define SMT_TID_ECF_DNA 3 /* pending ECF DNA test */ 331*4882a593Smuzhiyun #define SMT_TID_ECF 4 /* pending ECF test */ 332*4882a593Smuzhiyun 333*4882a593Smuzhiyun struct smt_values { 334*4882a593Smuzhiyun u_long smt_tvu ; /* timer valid una */ 335*4882a593Smuzhiyun u_long smt_tvd ; /* timer valid dna */ 336*4882a593Smuzhiyun u_long smt_tid ; /* transaction id */ 337*4882a593Smuzhiyun u_long pend[SMT_MAX_TEST] ; /* TID of requests */ 338*4882a593Smuzhiyun u_long uniq_time ; /* unique time stamp */ 339*4882a593Smuzhiyun u_short uniq_ticks ; /* unique time stamp */ 340*4882a593Smuzhiyun u_short please_reconnect ; /* flag : reconnect */ 341*4882a593Smuzhiyun u_long smt_last_lem ; 342*4882a593Smuzhiyun u_long smt_last_notify ; 343*4882a593Smuzhiyun struct smt_timer smt_timer ; /* SMT NIF timer */ 344*4882a593Smuzhiyun u_long last_tok_time[NUMMACS]; /* token cnt emulation */ 345*4882a593Smuzhiyun } ; 346*4882a593Smuzhiyun 347*4882a593Smuzhiyun /* 348*4882a593Smuzhiyun * SMT/CMT configurable parameters 349*4882a593Smuzhiyun */ 350*4882a593Smuzhiyun #define SMT_DAS 0 /* dual attach */ 351*4882a593Smuzhiyun #define SMT_SAS 1 /* single attach */ 352*4882a593Smuzhiyun #define SMT_NAC 2 /* null attach concentrator */ 353*4882a593Smuzhiyun 354*4882a593Smuzhiyun struct smt_config { 355*4882a593Smuzhiyun u_char attach_s ; /* CFM attach to secondary path */ 356*4882a593Smuzhiyun u_char sas ; /* SMT_DAS/SAS/NAC */ 357*4882a593Smuzhiyun u_char build_ring_map ; /* build ringmap if TRUE */ 358*4882a593Smuzhiyun u_char numphys ; /* number of active phys */ 359*4882a593Smuzhiyun u_char sc_pad[1] ; 360*4882a593Smuzhiyun 361*4882a593Smuzhiyun u_long pcm_tb_min ; /* PCM : TB_Min timer value */ 362*4882a593Smuzhiyun u_long pcm_tb_max ; /* PCM : TB_Max timer value */ 363*4882a593Smuzhiyun u_long pcm_c_min ; /* PCM : C_Min timer value */ 364*4882a593Smuzhiyun u_long pcm_t_out ; /* PCM : T_Out timer value */ 365*4882a593Smuzhiyun u_long pcm_tl_min ; /* PCM : TL_min timer value */ 366*4882a593Smuzhiyun u_long pcm_lc_short ; /* PCM : LC_Short timer value */ 367*4882a593Smuzhiyun u_long pcm_lc_medium ; /* PCM : LC_Medium timer value */ 368*4882a593Smuzhiyun u_long pcm_lc_long ; /* PCM : LC_Long timer value */ 369*4882a593Smuzhiyun u_long pcm_lc_extended ; /* PCM : LC_Extended timer value */ 370*4882a593Smuzhiyun u_long pcm_t_next_9 ; /* PCM : T_Next[9] timer value */ 371*4882a593Smuzhiyun u_long pcm_ns_max ; /* PCM : NS_Max timer value */ 372*4882a593Smuzhiyun 373*4882a593Smuzhiyun u_long ecm_i_max ; /* ECM : I_Max timer value */ 374*4882a593Smuzhiyun u_long ecm_in_max ; /* ECM : IN_Max timer value */ 375*4882a593Smuzhiyun u_long ecm_td_min ; /* ECM : TD_Min timer */ 376*4882a593Smuzhiyun u_long ecm_test_done ; /* ECM : path test done timer */ 377*4882a593Smuzhiyun u_long ecm_check_poll ; /* ECM : check bypass poller */ 378*4882a593Smuzhiyun 379*4882a593Smuzhiyun u_long rmt_t_non_op ; /* RMT : T_Non_OP timer value */ 380*4882a593Smuzhiyun u_long rmt_t_stuck ; /* RMT : T_Stuck timer value */ 381*4882a593Smuzhiyun u_long rmt_t_direct ; /* RMT : T_Direct timer value */ 382*4882a593Smuzhiyun u_long rmt_t_jam ; /* RMT : T_Jam timer value */ 383*4882a593Smuzhiyun u_long rmt_t_announce ; /* RMT : T_Announce timer value */ 384*4882a593Smuzhiyun u_long rmt_t_poll ; /* RMT : claim/beacon poller */ 385*4882a593Smuzhiyun u_long rmt_dup_mac_behavior ; /* Flag for the beavior of SMT if 386*4882a593Smuzhiyun * a Duplicate MAC Address was detected. 387*4882a593Smuzhiyun * FALSE: SMT will leave finally the ring 388*4882a593Smuzhiyun * TRUE: SMT will reinstert into the ring 389*4882a593Smuzhiyun */ 390*4882a593Smuzhiyun u_long mac_d_max ; /* MAC : D_Max timer value */ 391*4882a593Smuzhiyun 392*4882a593Smuzhiyun u_long lct_short ; /* LCT : error threshold */ 393*4882a593Smuzhiyun u_long lct_medium ; /* LCT : error threshold */ 394*4882a593Smuzhiyun u_long lct_long ; /* LCT : error threshold */ 395*4882a593Smuzhiyun u_long lct_extended ; /* LCT : error threshold */ 396*4882a593Smuzhiyun } ; 397*4882a593Smuzhiyun 398*4882a593Smuzhiyun #ifdef DEBUG 399*4882a593Smuzhiyun /* 400*4882a593Smuzhiyun * Debugging struct sometimes used in smc 401*4882a593Smuzhiyun */ 402*4882a593Smuzhiyun struct smt_debug { 403*4882a593Smuzhiyun int d_smtf ; 404*4882a593Smuzhiyun int d_smt ; 405*4882a593Smuzhiyun int d_ecm ; 406*4882a593Smuzhiyun int d_rmt ; 407*4882a593Smuzhiyun int d_cfm ; 408*4882a593Smuzhiyun int d_pcm ; 409*4882a593Smuzhiyun int d_plc ; 410*4882a593Smuzhiyun #ifdef ESS 411*4882a593Smuzhiyun int d_ess ; 412*4882a593Smuzhiyun #endif 413*4882a593Smuzhiyun #ifdef SBA 414*4882a593Smuzhiyun int d_sba ; 415*4882a593Smuzhiyun #endif 416*4882a593Smuzhiyun struct os_debug d_os; /* Include specific OS DEBUG struct */ 417*4882a593Smuzhiyun } ; 418*4882a593Smuzhiyun 419*4882a593Smuzhiyun #ifndef DEBUG_BRD 420*4882a593Smuzhiyun /* all boards shall be debugged with one debug struct */ 421*4882a593Smuzhiyun extern struct smt_debug debug; /* Declaration of debug struct */ 422*4882a593Smuzhiyun #endif /* DEBUG_BRD */ 423*4882a593Smuzhiyun 424*4882a593Smuzhiyun #endif /* DEBUG */ 425*4882a593Smuzhiyun 426*4882a593Smuzhiyun /* 427*4882a593Smuzhiyun * the SMT Context Struct SMC 428*4882a593Smuzhiyun * this struct contains ALL global variables of SMT 429*4882a593Smuzhiyun */ 430*4882a593Smuzhiyun struct s_smc { 431*4882a593Smuzhiyun struct s_smt_os os ; /* os specific */ 432*4882a593Smuzhiyun struct s_smt_hw hw ; /* hardware */ 433*4882a593Smuzhiyun 434*4882a593Smuzhiyun /* 435*4882a593Smuzhiyun * NOTE: os and hw MUST BE the first two structs 436*4882a593Smuzhiyun * anything beyond hw WILL BE SET TO ZERO in smt_set_defaults() 437*4882a593Smuzhiyun */ 438*4882a593Smuzhiyun struct smt_config s ; /* smt constants */ 439*4882a593Smuzhiyun struct smt_values sm ; /* smt variables */ 440*4882a593Smuzhiyun struct s_ecm e ; /* ecm */ 441*4882a593Smuzhiyun struct s_rmt r ; /* rmt */ 442*4882a593Smuzhiyun struct s_cfm cf ; /* cfm/cem */ 443*4882a593Smuzhiyun #ifdef CONCENTRATOR 444*4882a593Smuzhiyun struct s_cem ce[NUMPHYS] ; /* cem */ 445*4882a593Smuzhiyun struct s_c_ring cr[NUMPHYS+NUMMACS] ; 446*4882a593Smuzhiyun #endif 447*4882a593Smuzhiyun struct s_pcm p ; /* pcm */ 448*4882a593Smuzhiyun struct s_phy y[NUMPHYS] ; /* phy */ 449*4882a593Smuzhiyun struct s_queue q ; /* queue */ 450*4882a593Smuzhiyun struct s_timer t ; /* timer */ 451*4882a593Smuzhiyun struct s_srf srf ; /* SRF */ 452*4882a593Smuzhiyun struct s_srf_evc evcs[6+NUMPHYS*4] ; 453*4882a593Smuzhiyun struct fddi_mib mib ; /* __THE_MIB__ */ 454*4882a593Smuzhiyun #ifdef SBA 455*4882a593Smuzhiyun struct s_sba sba ; /* SBA variables */ 456*4882a593Smuzhiyun #endif 457*4882a593Smuzhiyun #ifdef ESS 458*4882a593Smuzhiyun struct s_ess ess ; /* Ess variables */ 459*4882a593Smuzhiyun #endif 460*4882a593Smuzhiyun #if defined(DEBUG) && defined(DEBUG_BRD) 461*4882a593Smuzhiyun /* If you want all single board to be debugged separately */ 462*4882a593Smuzhiyun struct smt_debug debug; /* Declaration of debug struct */ 463*4882a593Smuzhiyun #endif /* DEBUG_BRD && DEBUG */ 464*4882a593Smuzhiyun } ; 465*4882a593Smuzhiyun 466*4882a593Smuzhiyun extern const struct fddi_addr fddi_broadcast; 467*4882a593Smuzhiyun 468*4882a593Smuzhiyun void all_selection_criteria(struct s_smc *smc); 469*4882a593Smuzhiyun void card_stop(struct s_smc *smc); 470*4882a593Smuzhiyun void init_board(struct s_smc *smc, u_char *mac_addr); 471*4882a593Smuzhiyun int init_fplus(struct s_smc *smc); 472*4882a593Smuzhiyun void init_plc(struct s_smc *smc); 473*4882a593Smuzhiyun int init_smt(struct s_smc *smc, u_char *mac_addr); 474*4882a593Smuzhiyun void mac1_irq(struct s_smc *smc, u_short stu, u_short stl); 475*4882a593Smuzhiyun void mac2_irq(struct s_smc *smc, u_short code_s2u, u_short code_s2l); 476*4882a593Smuzhiyun void mac3_irq(struct s_smc *smc, u_short code_s3u, u_short code_s3l); 477*4882a593Smuzhiyun int pcm_status_twisted(struct s_smc *smc); 478*4882a593Smuzhiyun void plc1_irq(struct s_smc *smc); 479*4882a593Smuzhiyun void plc2_irq(struct s_smc *smc); 480*4882a593Smuzhiyun void read_address(struct s_smc *smc, u_char *mac_addr); 481*4882a593Smuzhiyun void timer_irq(struct s_smc *smc); 482*4882a593Smuzhiyun 483*4882a593Smuzhiyun #endif /* _SCMECM_ */ 484*4882a593Smuzhiyun 485