1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /******************************************************************************
4 * (C)Copyright 1998,1999 SysKonnect,
5 * a business unit of Schneider & Koch & Co. Datensysteme GmbH.
7 * The information in this file is provided "AS IS" without warranty.
9 ******************************************************************************/
14 #if defined(PCI) && !defined(OSDEF)
16 * In the case of the PCI bus the file osdef1st.h must be present
31 * include all other files in required order
32 * the following files must have been included before:
41 #endif /* OEM_CONCEPT */
45 #include "targethw.h" /* all target hw dependencies */
46 #include "targetos.h" /* all target os dependencies */
54 * events are class/value pairs
55 * class is addressee, e.g. RMT, PCM etc.
56 * value is command, e.g. line state change, ring op change etc.
59 u_short
class ; /* event class */
60 u_short event
; /* event value */
64 * define event queue as circular buffer
68 #else /* nCONCENTRATOR */
70 #endif /* nCONCENTRATOR */
74 struct event_queue ev_queue
[MAX_EVENT
];
75 struct event_queue
*ev_put
;
76 struct event_queue
*ev_get
;
80 * ECM - Entity Coordination Management
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
88 u_char ecm_line_state
; /* flag to dispatcher : line states */
89 u_long trace_prop
; /* ECM Trace_Prop flag >= 16 bits !! */
91 * this variable must have enough bits to hold all entiies in
92 * the station. So NUMPHYS may not be greater than 31.
95 struct smt_timer ecm_timer
; /* timer */
100 * RMT - Ring Management
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 */
114 long fast_rm_join
; /* bit mask of active ports */
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 */
129 * CFM - Configuration Management
131 * used for SAS and DAS
134 u_char cf_state
; /* CFM state machine current state */
139 * CEM - Configuration Element Management
141 * used for Concentrator
145 int ce_state
; /* CEM state */
146 int ce_port
; /* PA PB PM PM+1 .. */
147 int ce_type
; /* TA TB TS TM */
151 * linked list of CCEs in current token path
154 struct s_c_ring
*c_next
;
158 struct 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 */
181 #define PCM_DISABLED 0
182 #define PCM_CONNECTING 1
183 #define PCM_STANDBY 2
192 * one per physical port
195 /* Inter Module Globals */
196 struct fddi_mib_p
*mib
;
198 u_char np
; /* index 0 .. NUMPHYS */
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 */
205 u_char scrub
; /* CFM flag Scrub -> PCM */
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 */
212 /* inner Module Globals */
213 u_char curr_ls
; /* current line state */
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
;
231 int cem_pst
; /* CEM private state; used for dual homing */
232 struct lem_counter lem
;
243 struct smt_timer
*st_queue
;
244 struct smt_timer st_fast
;
250 #define SMT_EVENT_BASE 1
251 #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)
256 #define SMT_IS_CONDITION(x) ((x)>=SMT_COND_BASE)
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)
268 #define SR1_HOLDOFF 1
269 #define SR2_DISABLED 2
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 */
281 * IBM token ring status
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 */
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)
305 #define RS_CLEAR_EVENT (0xffff & ~(RS_NORINGOP))
307 /* Define the AIX-event-Notification as null function if it isn't defined */
308 /* in the targetos.h file */
310 #define AIX_EVENT(smc,opt0,opt1,opt2,opt3) /* nothing */
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 */
323 * Values used by frame based services
326 #define SMT_MAX_TEST 5
327 #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 */
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 */
348 * SMT/CMT configurable parameters
350 #define SMT_DAS 0 /* dual attach */
351 #define SMT_SAS 1 /* single attach */
352 #define SMT_NAC 2 /* null attach concentrator */
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 */
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 */
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 */
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 if
386 * a Duplicate MAC Address was detected.
387 * FALSE: SMT will leave finally the ring
388 * TRUE: SMT will reinstert into the ring
390 u_long mac_d_max
; /* MAC : D_Max timer value */
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 */
400 * Debugging struct sometimes used in smc
416 struct os_debug d_os
; /* Include specific OS DEBUG struct */
420 /* all boards shall be debugged with one debug struct */
421 extern struct smt_debug debug
; /* Declaration of debug struct */
422 #endif /* DEBUG_BRD */
427 * the SMT Context Struct SMC
428 * this struct contains ALL global variables of SMT
431 struct s_smt_os os
; /* os specific */
432 struct s_smt_hw hw
; /* hardware */
435 * NOTE: os and hw MUST BE the first two structs
436 * anything beyond hw WILL BE SET TO ZERO in smt_set_defaults()
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 */
444 struct s_cem ce
[NUMPHYS
] ; /* cem */
445 struct s_c_ring cr
[NUMPHYS
+NUMMACS
] ;
447 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__ */
455 struct s_sba sba
; /* SBA variables */
458 struct s_ess ess
; /* Ess variables */
460 #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 */
466 extern const struct fddi_addr fddi_broadcast
;
468 void all_selection_criteria(struct s_smc
*smc
);
469 void card_stop(struct s_smc
*smc
);
470 void init_board(struct s_smc
*smc
, u_char
*mac_addr
);
471 int init_fplus(struct s_smc
*smc
);
472 void init_plc(struct s_smc
*smc
);
473 int init_smt(struct s_smc
*smc
, const u_char
*mac_addr
);
474 void mac1_irq(struct s_smc
*smc
, u_short stu
, u_short stl
);
475 void mac2_irq(struct s_smc
*smc
, u_short code_s2u
, u_short code_s2l
);
476 void mac3_irq(struct s_smc
*smc
, u_short code_s3u
, u_short code_s3l
);
477 int pcm_status_twisted(struct s_smc
*smc
);
478 void plc1_irq(struct s_smc
*smc
);
479 void plc2_irq(struct s_smc
*smc
);
480 void read_address(struct s_smc
*smc
, u_char
*mac_addr
);
481 void timer_irq(struct s_smc
*smc
);
483 #endif /* _SCMECM_ */