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