1 /******************************************************************************
3 * (C)Copyright 1998,1999 SysKonnect,
4 * a business unit of Schneider & Koch & Co. Datensysteme GmbH.
6 * See the file "skfddi.c" for further information.
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * The information in this file is provided "AS IS" without warranty.
15 ******************************************************************************/
26 #define OEM_USER_DATA "SK-NET FDDI V2.0 Userdata"
30 static const char ID_sccs
[] = "@(#)smtdef.c 2.53 99/08/11 (C) SK " ;
36 #define TTMS(x) ((u_long)(x)*1000L)
37 #define TTS(x) ((u_long)(x)*1000000L)
38 #define TTUS(x) ((u_long)(x))
40 #define DEFAULT_TB_MIN TTMS(5)
41 #define DEFAULT_TB_MAX TTMS(50)
42 #define DEFAULT_C_MIN TTUS(1600)
43 #define DEFAULT_T_OUT TTMS(100+5)
44 #define DEFAULT_TL_MIN TTUS(30)
45 #define DEFAULT_LC_SHORT TTMS(50+5)
46 #define DEFAULT_LC_MEDIUM TTMS(500+20)
47 #define DEFAULT_LC_LONG TTS(5)+TTMS(50)
48 #define DEFAULT_LC_EXTENDED TTS(50)+TTMS(50)
49 #define DEFAULT_T_NEXT_9 TTMS(200+10)
50 #define DEFAULT_NS_MAX TTUS(1310)
51 #define DEFAULT_I_MAX TTMS(25)
52 #define DEFAULT_IN_MAX TTMS(40)
53 #define DEFAULT_TD_MIN TTMS(5)
54 #define DEFAULT_T_NON_OP TTS(1)
55 #define DEFAULT_T_STUCK TTS(8)
56 #define DEFAULT_T_DIRECT TTMS(370)
57 #define DEFAULT_T_JAM TTMS(370)
58 #define DEFAULT_T_ANNOUNCE TTMS(2500)
59 #define DEFAULT_D_MAX TTUS(1617)
60 #define DEFAULT_LEM_ALARM (8)
61 #define DEFAULT_LEM_CUTOFF (7)
62 #define DEFAULT_TEST_DONE TTS(1)
63 #define DEFAULT_CHECK_POLL TTS(1)
64 #define DEFAULT_POLL TTMS(50)
67 * LCT errors threshold
69 #define DEFAULT_LCT_SHORT 1
70 #define DEFAULT_LCT_MEDIUM 3
71 #define DEFAULT_LCT_LONG 5
72 #define DEFAULT_LCT_EXTEND 50
74 /* Forward declarations */
75 void smt_reset_defaults(struct s_smc
*smc
, int level
);
76 static void smt_init_mib(struct s_smc
*smc
, int level
);
77 static int set_min_max(int maxflag
, u_long mib
, u_long limit
, u_long
*oper
);
79 #define MS2BCLK(x) ((x)*12500L)
80 #define US2BCLK(x) ((x)*1250L)
82 void smt_reset_defaults(struct s_smc
*smc
, int level
)
84 struct smt_config
*smt
;
89 smt_init_mib(smc
,level
) ;
91 smc
->os
.smc_version
= SMC_VERSION
;
92 smt_boot_time
= smt_get_time();
93 for( i
= 0; i
< NUMMACS
; i
++ )
94 smc
->sm
.last_tok_time
[i
] = smt_boot_time
;
97 smt
->build_ring_map
= 1 ;
99 smt
->numphys
= NUMPHYS
;
100 smt
->pcm_tb_min
= DEFAULT_TB_MIN
;
101 smt
->pcm_tb_max
= DEFAULT_TB_MAX
;
102 smt
->pcm_c_min
= DEFAULT_C_MIN
;
103 smt
->pcm_t_out
= DEFAULT_T_OUT
;
104 smt
->pcm_tl_min
= DEFAULT_TL_MIN
;
105 smt
->pcm_lc_short
= DEFAULT_LC_SHORT
;
106 smt
->pcm_lc_medium
= DEFAULT_LC_MEDIUM
;
107 smt
->pcm_lc_long
= DEFAULT_LC_LONG
;
108 smt
->pcm_lc_extended
= DEFAULT_LC_EXTENDED
;
109 smt
->pcm_t_next_9
= DEFAULT_T_NEXT_9
;
110 smt
->pcm_ns_max
= DEFAULT_NS_MAX
;
111 smt
->ecm_i_max
= DEFAULT_I_MAX
;
112 smt
->ecm_in_max
= DEFAULT_IN_MAX
;
113 smt
->ecm_td_min
= DEFAULT_TD_MIN
;
114 smt
->ecm_test_done
= DEFAULT_TEST_DONE
;
115 smt
->ecm_check_poll
= DEFAULT_CHECK_POLL
;
116 smt
->rmt_t_non_op
= DEFAULT_T_NON_OP
;
117 smt
->rmt_t_stuck
= DEFAULT_T_STUCK
;
118 smt
->rmt_t_direct
= DEFAULT_T_DIRECT
;
119 smt
->rmt_t_jam
= DEFAULT_T_JAM
;
120 smt
->rmt_t_announce
= DEFAULT_T_ANNOUNCE
;
121 smt
->rmt_t_poll
= DEFAULT_POLL
;
122 smt
->rmt_dup_mac_behavior
= FALSE
; /* See Struct smt_config */
123 smt
->mac_d_max
= DEFAULT_D_MAX
;
125 smt
->lct_short
= DEFAULT_LCT_SHORT
;
126 smt
->lct_medium
= DEFAULT_LCT_MEDIUM
;
127 smt
->lct_long
= DEFAULT_LCT_LONG
;
128 smt
->lct_extended
= DEFAULT_LCT_EXTEND
;
133 smc
->ess
.sync_bw_available
= FALSE
;
134 smc
->mib
.fddiESSPayload
= 0 ;
135 smc
->mib
.fddiESSOverhead
= 0 ;
136 smc
->mib
.fddiESSMaxTNeg
= (u_long
)(- MS2BCLK(25)) ;
137 smc
->mib
.fddiESSMinSegmentSize
= 1 ;
138 smc
->mib
.fddiESSCategory
= SB_STATIC
;
139 smc
->mib
.fddiESSSynchTxMode
= FALSE
;
140 smc
->ess
.raf_act_timer_poll
= FALSE
;
141 smc
->ess
.timer_count
= 7 ; /* first RAF alc req after 3s */
143 smc
->ess
.local_sba_active
= FALSE
;
144 smc
->ess
.sba_reply_pend
= NULL
;
147 smt_init_sba(smc
,level
) ;
149 #endif /* no SLIM_SMT */
152 smc
->hw
.pci_fix_value
= 0 ;
160 static const char man_data
[32] =
161 /* 01234567890123456789012345678901 */
162 "xxxSK-NET FDDI SMT 7.3 - V2.8.8" ;
164 static void smt_init_mib(struct s_smc
*smc
, int level
)
166 struct fddi_mib
*mib
;
167 struct fddi_mib_p
*pm
;
174 * set EVERYTHING to ZERO
177 memset(((char *)smc
)+
178 sizeof(struct s_smt_os
)+sizeof(struct s_smt_hw
), 0,
179 sizeof(struct s_smc
) -
180 sizeof(struct s_smt_os
) - sizeof(struct s_smt_hw
)) ;
183 mib
->fddiSMTRemoteDisconnectFlag
= 0 ;
184 mib
->fddiSMTPeerWrapFlag
= 0 ;
187 mib
->fddiSMTOpVersionId
= 2 ;
188 mib
->fddiSMTHiVersionId
= 2 ;
189 mib
->fddiSMTLoVersionId
= 2 ;
190 memcpy((char *) mib
->fddiSMTManufacturerData
,man_data
,32) ;
192 strcpy(mib
->fddiSMTUserData
,OEM_USER_DATA
) ;
194 mib
->fddiSMTMIBVersionId
= 1 ;
195 mib
->fddiSMTMac_Ct
= NUMMACS
;
196 mib
->fddiSMTConnectionPolicy
= POLICY_MM
| POLICY_AA
| POLICY_BB
;
199 * fddiSMTNonMaster_Ct and fddiSMTMaster_Ct are set in smt_fixup_mib
200 * s.sas is not set yet (is set in init driver)
202 mib
->fddiSMTAvailablePaths
= MIB_PATH_P
| MIB_PATH_S
;
204 mib
->fddiSMTConfigCapabilities
= 0 ; /* no hold,no wrap_ab*/
205 mib
->fddiSMTTT_Notify
= 10 ;
206 mib
->fddiSMTStatRptPolicy
= TRUE
;
207 mib
->fddiSMTTrace_MaxExpiration
= SEC2MIB(7) ;
208 mib
->fddiSMTMACIndexes
= INDEX_MAC
;
209 mib
->fddiSMTStationStatus
= MIB_SMT_STASTA_SEPA
; /* separated */
211 mib
->m
[MAC0
].fddiMACIndex
= INDEX_MAC
;
212 mib
->m
[MAC0
].fddiMACFrameStatusFunctions
= FSC_TYPE0
;
213 mib
->m
[MAC0
].fddiMACRequestedPaths
=
215 MIB_P_PATH_SEC_ALTER
|
216 MIB_P_PATH_PRIM_ALTER
;
217 mib
->m
[MAC0
].fddiMACAvailablePaths
= MIB_PATH_P
;
218 mib
->m
[MAC0
].fddiMACCurrentPath
= MIB_PATH_PRIMARY
;
219 mib
->m
[MAC0
].fddiMACT_MaxCapabilitiy
= (u_long
)(- MS2BCLK(165)) ;
220 mib
->m
[MAC0
].fddiMACTVXCapabilitiy
= (u_long
)(- US2BCLK(52)) ;
222 mib
->m
[MAC0
].fddiMACTvxValue
= (u_long
)(- US2BCLK(27)) ;
223 mib
->m
[MAC0
].fddiMACTvxValueMIB
= (u_long
)(- US2BCLK(27)) ;
224 mib
->m
[MAC0
].fddiMACT_Req
= (u_long
)(- MS2BCLK(165)) ;
225 mib
->m
[MAC0
].fddiMACT_ReqMIB
= (u_long
)(- MS2BCLK(165)) ;
226 mib
->m
[MAC0
].fddiMACT_Max
= (u_long
)(- MS2BCLK(165)) ;
227 mib
->m
[MAC0
].fddiMACT_MaxMIB
= (u_long
)(- MS2BCLK(165)) ;
228 mib
->m
[MAC0
].fddiMACT_Min
= (u_long
)(- MS2BCLK(4)) ;
230 mib
->m
[MAC0
].fddiMACHardwarePresent
= TRUE
;
231 mib
->m
[MAC0
].fddiMACMA_UnitdataEnable
= TRUE
;
232 mib
->m
[MAC0
].fddiMACFrameErrorThreshold
= 1 ;
233 mib
->m
[MAC0
].fddiMACNotCopiedThreshold
= 1 ;
237 for (path
= 0 ; path
< NUMPATHS
; path
++) {
238 mib
->a
[path
].fddiPATHIndex
= INDEX_PATH
+ path
;
240 mib
->a
[path
].fddiPATHTVXLowerBound
=
241 (u_long
)(- US2BCLK(27)) ;
242 mib
->a
[path
].fddiPATHT_MaxLowerBound
=
243 (u_long
)(- MS2BCLK(165)) ;
244 mib
->a
[path
].fddiPATHMaxT_Req
=
245 (u_long
)(- MS2BCLK(165)) ;
254 for (port
= 0 ; port
< NUMPHYS
; port
++) {
256 * set MIB pointer in phy
258 /* Attention: don't initialize mib pointer here! */
259 /* It must be initialized during phase 2 */
260 smc
->y
[port
].mib
= NULL
;
261 mib
->fddiSMTPORTIndexes
[port
] = port
+INDEX_PORT
;
263 pm
->fddiPORTIndex
= port
+INDEX_PORT
;
264 pm
->fddiPORTHardwarePresent
= TRUE
;
266 pm
->fddiPORTLer_Alarm
= DEFAULT_LEM_ALARM
;
267 pm
->fddiPORTLer_Cutoff
= DEFAULT_LEM_CUTOFF
;
270 * fddiPORTRequestedPaths are set in pcmplc.c
271 * we don't know the port type yet !
273 pm
->fddiPORTRequestedPaths
[1] = 0 ;
274 pm
->fddiPORTRequestedPaths
[2] = 0 ;
275 pm
->fddiPORTRequestedPaths
[3] = 0 ;
276 pm
->fddiPORTAvailablePaths
= MIB_PATH_P
;
277 pm
->fddiPORTPMDClass
= MIB_PMDCLASS_MULTI
;
281 (void) smt_set_mac_opvalues(smc
) ;
284 int smt_set_mac_opvalues(struct s_smc
*smc
)
289 st
= set_min_max(1,smc
->mib
.m
[MAC0
].fddiMACTvxValueMIB
,
290 smc
->mib
.a
[PATH0
].fddiPATHTVXLowerBound
,
291 &smc
->mib
.m
[MAC0
].fddiMACTvxValue
) ;
292 st
|= set_min_max(0,smc
->mib
.m
[MAC0
].fddiMACT_MaxMIB
,
293 smc
->mib
.a
[PATH0
].fddiPATHT_MaxLowerBound
,
294 &smc
->mib
.m
[MAC0
].fddiMACT_Max
) ;
295 st
|= (st2
= set_min_max(0,smc
->mib
.m
[MAC0
].fddiMACT_ReqMIB
,
296 smc
->mib
.a
[PATH0
].fddiPATHMaxT_Req
,
297 &smc
->mib
.m
[MAC0
].fddiMACT_Req
)) ;
299 /* Treq attribute changed remotely. So send an AIX_EVENT to the
302 AIX_EVENT(smc
, (u_long
) FDDI_RING_STATUS
, (u_long
)
303 FDDI_SMT_EVENT
, (u_long
) FDDI_REMOTE_T_REQ
,
304 smt_get_event_word(smc
));
309 void smt_fixup_mib(struct s_smc
*smc
)
312 switch (smc
->s
.sas
) {
314 smc
->mib
.fddiSMTNonMaster_Ct
= 1 ;
317 smc
->mib
.fddiSMTNonMaster_Ct
= 2 ;
320 smc
->mib
.fddiSMTNonMaster_Ct
= 0 ;
323 smc
->mib
.fddiSMTMaster_Ct
= NUMPHYS
- smc
->mib
.fddiSMTNonMaster_Ct
;
325 switch (smc
->s
.sas
) {
327 smc
->mib
.fddiSMTNonMaster_Ct
= 1 ;
330 smc
->mib
.fddiSMTNonMaster_Ct
= 2 ;
333 smc
->mib
.fddiSMTMaster_Ct
= 0 ;
338 * determine new setting for operational value
339 * if limit is lower than mib
343 * NOTE : numbers are negative, negate comparison !
345 static int set_min_max(int maxflag
, u_long mib
, u_long limit
, u_long
*oper
)
349 if ((limit
> mib
) ^ maxflag
)
353 return(old
!= *oper
) ;