0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017 #include "h/types.h"
0018 #include "h/fddi.h"
0019 #include "h/smc.h"
0020
0021 #ifndef OEM_USER_DATA
0022 #define OEM_USER_DATA "SK-NET FDDI V2.0 Userdata"
0023 #endif
0024
0025
0026
0027
0028 #define TTMS(x) ((u_long)(x)*1000L)
0029 #define TTS(x) ((u_long)(x)*1000000L)
0030 #define TTUS(x) ((u_long)(x))
0031
0032 #define DEFAULT_TB_MIN TTMS(5)
0033 #define DEFAULT_TB_MAX TTMS(50)
0034 #define DEFAULT_C_MIN TTUS(1600)
0035 #define DEFAULT_T_OUT TTMS(100+5)
0036 #define DEFAULT_TL_MIN TTUS(30)
0037 #define DEFAULT_LC_SHORT TTMS(50+5)
0038 #define DEFAULT_LC_MEDIUM TTMS(500+20)
0039 #define DEFAULT_LC_LONG TTS(5)+TTMS(50)
0040 #define DEFAULT_LC_EXTENDED TTS(50)+TTMS(50)
0041 #define DEFAULT_T_NEXT_9 TTMS(200+10)
0042 #define DEFAULT_NS_MAX TTUS(1310)
0043 #define DEFAULT_I_MAX TTMS(25)
0044 #define DEFAULT_IN_MAX TTMS(40)
0045 #define DEFAULT_TD_MIN TTMS(5)
0046 #define DEFAULT_T_NON_OP TTS(1)
0047 #define DEFAULT_T_STUCK TTS(8)
0048 #define DEFAULT_T_DIRECT TTMS(370)
0049 #define DEFAULT_T_JAM TTMS(370)
0050 #define DEFAULT_T_ANNOUNCE TTMS(2500)
0051 #define DEFAULT_D_MAX TTUS(1617)
0052 #define DEFAULT_LEM_ALARM (8)
0053 #define DEFAULT_LEM_CUTOFF (7)
0054 #define DEFAULT_TEST_DONE TTS(1)
0055 #define DEFAULT_CHECK_POLL TTS(1)
0056 #define DEFAULT_POLL TTMS(50)
0057
0058
0059
0060
0061 #define DEFAULT_LCT_SHORT 1
0062 #define DEFAULT_LCT_MEDIUM 3
0063 #define DEFAULT_LCT_LONG 5
0064 #define DEFAULT_LCT_EXTEND 50
0065
0066
0067 void smt_reset_defaults(struct s_smc *smc, int level);
0068 static void smt_init_mib(struct s_smc *smc, int level);
0069 static int set_min_max(int maxflag, u_long mib, u_long limit, u_long *oper);
0070
0071 #define MS2BCLK(x) ((x)*12500L)
0072 #define US2BCLK(x) ((x)*1250L)
0073
0074 void smt_reset_defaults(struct s_smc *smc, int level)
0075 {
0076 struct smt_config *smt ;
0077 int i ;
0078 u_long smt_boot_time;
0079
0080
0081 smt_init_mib(smc,level) ;
0082
0083 smc->os.smc_version = SMC_VERSION ;
0084 smt_boot_time = smt_get_time();
0085 for( i = 0; i < NUMMACS; i++ )
0086 smc->sm.last_tok_time[i] = smt_boot_time ;
0087 smt = &smc->s ;
0088 smt->attach_s = 0 ;
0089 smt->build_ring_map = 1 ;
0090 smt->sas = SMT_DAS ;
0091 smt->numphys = NUMPHYS ;
0092 smt->pcm_tb_min = DEFAULT_TB_MIN ;
0093 smt->pcm_tb_max = DEFAULT_TB_MAX ;
0094 smt->pcm_c_min = DEFAULT_C_MIN ;
0095 smt->pcm_t_out = DEFAULT_T_OUT ;
0096 smt->pcm_tl_min = DEFAULT_TL_MIN ;
0097 smt->pcm_lc_short = DEFAULT_LC_SHORT ;
0098 smt->pcm_lc_medium = DEFAULT_LC_MEDIUM ;
0099 smt->pcm_lc_long = DEFAULT_LC_LONG ;
0100 smt->pcm_lc_extended = DEFAULT_LC_EXTENDED ;
0101 smt->pcm_t_next_9 = DEFAULT_T_NEXT_9 ;
0102 smt->pcm_ns_max = DEFAULT_NS_MAX ;
0103 smt->ecm_i_max = DEFAULT_I_MAX ;
0104 smt->ecm_in_max = DEFAULT_IN_MAX ;
0105 smt->ecm_td_min = DEFAULT_TD_MIN ;
0106 smt->ecm_test_done = DEFAULT_TEST_DONE ;
0107 smt->ecm_check_poll = DEFAULT_CHECK_POLL ;
0108 smt->rmt_t_non_op = DEFAULT_T_NON_OP ;
0109 smt->rmt_t_stuck = DEFAULT_T_STUCK ;
0110 smt->rmt_t_direct = DEFAULT_T_DIRECT ;
0111 smt->rmt_t_jam = DEFAULT_T_JAM ;
0112 smt->rmt_t_announce = DEFAULT_T_ANNOUNCE ;
0113 smt->rmt_t_poll = DEFAULT_POLL ;
0114 smt->rmt_dup_mac_behavior = FALSE ;
0115 smt->mac_d_max = DEFAULT_D_MAX ;
0116
0117 smt->lct_short = DEFAULT_LCT_SHORT ;
0118 smt->lct_medium = DEFAULT_LCT_MEDIUM ;
0119 smt->lct_long = DEFAULT_LCT_LONG ;
0120 smt->lct_extended = DEFAULT_LCT_EXTEND ;
0121
0122 #ifndef SLIM_SMT
0123 #ifdef ESS
0124 if (level == 0) {
0125 smc->ess.sync_bw_available = FALSE ;
0126 smc->mib.fddiESSPayload = 0 ;
0127 smc->mib.fddiESSOverhead = 0 ;
0128 smc->mib.fddiESSMaxTNeg = (u_long)(- MS2BCLK(25)) ;
0129 smc->mib.fddiESSMinSegmentSize = 1 ;
0130 smc->mib.fddiESSCategory = SB_STATIC ;
0131 smc->mib.fddiESSSynchTxMode = FALSE ;
0132 smc->ess.raf_act_timer_poll = FALSE ;
0133 smc->ess.timer_count = 7 ;
0134 }
0135 smc->ess.local_sba_active = FALSE ;
0136 smc->ess.sba_reply_pend = NULL ;
0137 #endif
0138 #ifdef SBA
0139 smt_init_sba(smc,level) ;
0140 #endif
0141 #endif
0142 #ifdef TAG_MODE
0143 if (level == 0) {
0144 smc->hw.pci_fix_value = 0 ;
0145 }
0146 #endif
0147 }
0148
0149
0150
0151
0152 static const char man_data[32] =
0153
0154 "xxxSK-NET FDDI SMT 7.3 - V2.8.8" ;
0155
0156 static void smt_init_mib(struct s_smc *smc, int level)
0157 {
0158 struct fddi_mib *mib ;
0159 struct fddi_mib_p *pm ;
0160 int port ;
0161 int path ;
0162
0163 mib = &smc->mib ;
0164 if (level == 0) {
0165
0166
0167
0168
0169 memset(((char *)smc)+
0170 sizeof(struct s_smt_os)+sizeof(struct s_smt_hw), 0,
0171 sizeof(struct s_smc) -
0172 sizeof(struct s_smt_os) - sizeof(struct s_smt_hw)) ;
0173 }
0174 else {
0175 mib->fddiSMTRemoteDisconnectFlag = 0 ;
0176 mib->fddiSMTPeerWrapFlag = 0 ;
0177 }
0178
0179 mib->fddiSMTOpVersionId = 2 ;
0180 mib->fddiSMTHiVersionId = 2 ;
0181 mib->fddiSMTLoVersionId = 2 ;
0182 memcpy((char *) mib->fddiSMTManufacturerData,man_data,32) ;
0183 if (level == 0) {
0184 strcpy(mib->fddiSMTUserData,OEM_USER_DATA) ;
0185 }
0186 mib->fddiSMTMIBVersionId = 1 ;
0187 mib->fddiSMTMac_Ct = NUMMACS ;
0188 mib->fddiSMTConnectionPolicy = POLICY_MM | POLICY_AA | POLICY_BB ;
0189
0190
0191
0192
0193
0194 mib->fddiSMTAvailablePaths = MIB_PATH_P | MIB_PATH_S ;
0195
0196 mib->fddiSMTConfigCapabilities = 0 ;
0197 mib->fddiSMTTT_Notify = 10 ;
0198 mib->fddiSMTStatRptPolicy = TRUE ;
0199 mib->fddiSMTTrace_MaxExpiration = SEC2MIB(7) ;
0200 mib->fddiSMTMACIndexes = INDEX_MAC ;
0201 mib->fddiSMTStationStatus = MIB_SMT_STASTA_SEPA ;
0202
0203 mib->m[MAC0].fddiMACIndex = INDEX_MAC ;
0204 mib->m[MAC0].fddiMACFrameStatusFunctions = FSC_TYPE0 ;
0205 mib->m[MAC0].fddiMACRequestedPaths =
0206 MIB_P_PATH_LOCAL |
0207 MIB_P_PATH_SEC_ALTER |
0208 MIB_P_PATH_PRIM_ALTER ;
0209 mib->m[MAC0].fddiMACAvailablePaths = MIB_PATH_P ;
0210 mib->m[MAC0].fddiMACCurrentPath = MIB_PATH_PRIMARY ;
0211 mib->m[MAC0].fddiMACT_MaxCapabilitiy = (u_long)(- MS2BCLK(165)) ;
0212 mib->m[MAC0].fddiMACTVXCapabilitiy = (u_long)(- US2BCLK(52)) ;
0213 if (level == 0) {
0214 mib->m[MAC0].fddiMACTvxValue = (u_long)(- US2BCLK(27)) ;
0215 mib->m[MAC0].fddiMACTvxValueMIB = (u_long)(- US2BCLK(27)) ;
0216 mib->m[MAC0].fddiMACT_Req = (u_long)(- MS2BCLK(165)) ;
0217 mib->m[MAC0].fddiMACT_ReqMIB = (u_long)(- MS2BCLK(165)) ;
0218 mib->m[MAC0].fddiMACT_Max = (u_long)(- MS2BCLK(165)) ;
0219 mib->m[MAC0].fddiMACT_MaxMIB = (u_long)(- MS2BCLK(165)) ;
0220 mib->m[MAC0].fddiMACT_Min = (u_long)(- MS2BCLK(4)) ;
0221 }
0222 mib->m[MAC0].fddiMACHardwarePresent = TRUE ;
0223 mib->m[MAC0].fddiMACMA_UnitdataEnable = TRUE ;
0224 mib->m[MAC0].fddiMACFrameErrorThreshold = 1 ;
0225 mib->m[MAC0].fddiMACNotCopiedThreshold = 1 ;
0226
0227
0228
0229 for (path = 0 ; path < NUMPATHS ; path++) {
0230 mib->a[path].fddiPATHIndex = INDEX_PATH + path ;
0231 if (level == 0) {
0232 mib->a[path].fddiPATHTVXLowerBound =
0233 (u_long)(- US2BCLK(27)) ;
0234 mib->a[path].fddiPATHT_MaxLowerBound =
0235 (u_long)(- MS2BCLK(165)) ;
0236 mib->a[path].fddiPATHMaxT_Req =
0237 (u_long)(- MS2BCLK(165)) ;
0238 }
0239 }
0240
0241
0242
0243
0244
0245 pm = mib->p ;
0246 for (port = 0 ; port < NUMPHYS ; port++) {
0247
0248
0249
0250
0251
0252 smc->y[port].mib = NULL;
0253 mib->fddiSMTPORTIndexes[port] = port+INDEX_PORT ;
0254
0255 pm->fddiPORTIndex = port+INDEX_PORT ;
0256 pm->fddiPORTHardwarePresent = TRUE ;
0257 if (level == 0) {
0258 pm->fddiPORTLer_Alarm = DEFAULT_LEM_ALARM ;
0259 pm->fddiPORTLer_Cutoff = DEFAULT_LEM_CUTOFF ;
0260 }
0261
0262
0263
0264
0265 pm->fddiPORTRequestedPaths[1] = 0 ;
0266 pm->fddiPORTRequestedPaths[2] = 0 ;
0267 pm->fddiPORTRequestedPaths[3] = 0 ;
0268 pm->fddiPORTAvailablePaths = MIB_PATH_P ;
0269 pm->fddiPORTPMDClass = MIB_PMDCLASS_MULTI ;
0270 pm++ ;
0271 }
0272
0273 (void) smt_set_mac_opvalues(smc) ;
0274 }
0275
0276 int smt_set_mac_opvalues(struct s_smc *smc)
0277 {
0278 int st ;
0279 int st2 ;
0280
0281 st = set_min_max(1,smc->mib.m[MAC0].fddiMACTvxValueMIB,
0282 smc->mib.a[PATH0].fddiPATHTVXLowerBound,
0283 &smc->mib.m[MAC0].fddiMACTvxValue) ;
0284 st |= set_min_max(0,smc->mib.m[MAC0].fddiMACT_MaxMIB,
0285 smc->mib.a[PATH0].fddiPATHT_MaxLowerBound,
0286 &smc->mib.m[MAC0].fddiMACT_Max) ;
0287 st |= (st2 = set_min_max(0,smc->mib.m[MAC0].fddiMACT_ReqMIB,
0288 smc->mib.a[PATH0].fddiPATHMaxT_Req,
0289 &smc->mib.m[MAC0].fddiMACT_Req)) ;
0290 if (st2) {
0291
0292
0293
0294 AIX_EVENT(smc, (u_long) FDDI_RING_STATUS, (u_long)
0295 FDDI_SMT_EVENT, (u_long) FDDI_REMOTE_T_REQ,
0296 smt_get_event_word(smc));
0297 }
0298 return st;
0299 }
0300
0301 void smt_fixup_mib(struct s_smc *smc)
0302 {
0303 #ifdef CONCENTRATOR
0304 switch (smc->s.sas) {
0305 case SMT_SAS :
0306 smc->mib.fddiSMTNonMaster_Ct = 1 ;
0307 break ;
0308 case SMT_DAS :
0309 smc->mib.fddiSMTNonMaster_Ct = 2 ;
0310 break ;
0311 case SMT_NAC :
0312 smc->mib.fddiSMTNonMaster_Ct = 0 ;
0313 break ;
0314 }
0315 smc->mib.fddiSMTMaster_Ct = NUMPHYS - smc->mib.fddiSMTNonMaster_Ct ;
0316 #else
0317 switch (smc->s.sas) {
0318 case SMT_SAS :
0319 smc->mib.fddiSMTNonMaster_Ct = 1 ;
0320 break ;
0321 case SMT_DAS :
0322 smc->mib.fddiSMTNonMaster_Ct = 2 ;
0323 break ;
0324 }
0325 smc->mib.fddiSMTMaster_Ct = 0 ;
0326 #endif
0327 }
0328
0329
0330
0331
0332
0333
0334
0335
0336
0337 static int set_min_max(int maxflag, u_long mib, u_long limit, u_long *oper)
0338 {
0339 u_long old ;
0340 old = *oper ;
0341 if ((limit > mib) ^ maxflag)
0342 *oper = limit ;
0343 else
0344 *oper = mib ;
0345 return old != *oper;
0346 }
0347