Lines Matching +full:smc +full:- +full:id

1 // SPDX-License-Identifier: GPL-2.0-or-later
27 * FDDI sub-system supporting the SBA application.
34 #include "h/smc.h"
51 -------------------------------------------------------------
53 -------------------------------------------------------------
67 -------------------------------------------------------------
69 -------------------------------------------------------------
74 -------------------------------------------------------------
76 -------------------------------------------------------------
79 static void ess_send_response(struct s_smc *smc, struct smt_header *sm,
81 static void ess_config_fifo(struct s_smc *smc);
82 static void ess_send_alc_req(struct s_smc *smc);
83 static void ess_send_frame(struct s_smc *smc, SMbuf *mb);
86 -------------------------------------------------------------
88 -------------------------------------------------------------
92 -------------------------------------------------------------
94 -------------------------------------------------------------
97 void ess_timer_poll(struct s_smc *smc);
98 void ess_para_change(struct s_smc *smc);
99 int ess_raf_received_pack(struct s_smc *smc, SMbuf *mb, struct smt_header *sm,
101 static int process_bw_alloc(struct s_smc *smc, long int payload, long int overhead);
105 * --------------------------------------------------------------------------
107 * --------------------------------------------------------------------------
113 int ess_raf_received_pack(struct s_smc *smc, SMbuf *mb, struct smt_header *sm, in ess_raf_received_pack() argument
132 if (!(p = (void *) sm_to_para(smc,sm,SMT_P0015))) { in ess_raf_received_pack()
136 msg_res_type = ((struct smt_p_0015 *)p)->res_type ; in ess_raf_received_pack()
141 if (!(cmd = (struct smt_p_0016 *) sm_to_para(smc,sm,SMT_P0016))) { in ess_raf_received_pack()
149 DB_ESSN(2, "fc %x ft %x", sm->smt_class, sm->smt_type); in ess_raf_received_pack()
150 DB_ESSN(2, "ver %x tran %x", sm->smt_version, sm->smt_tid); in ess_raf_received_pack()
151 DB_ESSN(2, "stn_id %pM", &sm->smt_source); in ess_raf_received_pack()
153 DB_ESSN(2, "infolen %x res %lx", sm->smt_len, msg_res_type); in ess_raf_received_pack()
154 DB_ESSN(2, "sbacmd %x", cmd->sba_cmd); in ess_raf_received_pack()
159 switch (cmd->sba_cmd) { in ess_raf_received_pack()
168 if (sm->smt_type == SMT_REQUEST) { in ess_raf_received_pack()
173 if (!local || smc->mib.fddiESSPayload) in ess_raf_received_pack()
176 p = (void *) sm_to_para(smc,sm,SMT_P0019) ; in ess_raf_received_pack()
178 if (((struct smt_p_0019 *)p)->alloc_addr.a[i]) { in ess_raf_received_pack()
187 smc->ess.alloc_trans_id = sm->smt_tid ; in ess_raf_received_pack()
188 DB_ESS("ESS: save Alloc Req Trans ID %x", sm->smt_tid); in ess_raf_received_pack()
189 p = (void *) sm_to_para(smc,sm,SMT_P320F) ; in ess_raf_received_pack()
190 ((struct smt_p_320f *)p)->mib_payload = in ess_raf_received_pack()
191 smc->mib.a[PATH0].fddiPATHSbaPayload ; in ess_raf_received_pack()
192 p = (void *) sm_to_para(smc,sm,SMT_P3210) ; in ess_raf_received_pack()
193 ((struct smt_p_3210 *)p)->mib_overhead = in ess_raf_received_pack()
194 smc->mib.a[PATH0].fddiPATHSbaOverhead ; in ess_raf_received_pack()
195 sm->smt_dest = smt_sba_da ; in ess_raf_received_pack()
197 if (smc->ess.local_sba_active) in ess_raf_received_pack()
200 if (!(db = smt_get_mbuf(smc))) in ess_raf_received_pack()
203 db->sm_len = mb->sm_len ; in ess_raf_received_pack()
204 db->sm_off = mb->sm_off ; in ess_raf_received_pack()
205 memcpy(((char *)(db->sm_data+db->sm_off)),(char *)sm, in ess_raf_received_pack()
206 (int)db->sm_len) ; in ess_raf_received_pack()
207 dump_smt(smc, in ess_raf_received_pack()
208 (struct smt_header *)(db->sm_data+db->sm_off), in ess_raf_received_pack()
210 smt_send_frame(smc,db,FC_SMT_INFO,0) ; in ess_raf_received_pack()
218 if (smt_check_para(smc,sm,plist_raf_alc_res)) { in ess_raf_received_pack()
228 * 3. trans action id = alloc_trans_id in ess_raf_received_pack()
233 if ((((struct smt_p_320b *)sm_to_para(smc,sm,SMT_P320B))->path_index in ess_raf_received_pack()
236 (((struct smt_p_reason *)sm_to_para(smc,sm,SMT_P0012))->rdf_reason in ess_raf_received_pack()
238 (sm->smt_tid != smc->ess.alloc_trans_id)) { in ess_raf_received_pack()
247 p = (void *) sm_to_para(smc,sm,SMT_P320F) ; in ess_raf_received_pack()
252 payload = ((struct smt_p_320f *)p)->mib_payload ; in ess_raf_received_pack()
253 p = (void *) sm_to_para(smc,sm,SMT_P3210) ; in ess_raf_received_pack()
258 overhead = ((struct smt_p_3210 *)p)->mib_overhead ; in ess_raf_received_pack()
266 (void)process_bw_alloc(smc,(long)payload,(long)overhead) ; in ess_raf_received_pack()
278 if (sm->smt_type != SMT_REQUEST) { in ess_raf_received_pack()
286 if (smt_check_para(smc,sm,plist_raf_chg_req)) { in ess_raf_received_pack()
297 if ((((struct smt_p_320b *)sm_to_para(smc,sm,SMT_P320B))->path_index in ess_raf_received_pack()
306 p = (void *) sm_to_para(smc,sm,SMT_P320F) ; in ess_raf_received_pack()
307 payload = ((struct smt_p_320f *)p)->mib_payload ; in ess_raf_received_pack()
308 p = (void *) sm_to_para(smc,sm,SMT_P3210) ; in ess_raf_received_pack()
309 overhead = ((struct smt_p_3210 *)p)->mib_overhead ; in ess_raf_received_pack()
312 &sm->smt_source); in ess_raf_received_pack()
319 if(!process_bw_alloc(smc,(long)payload,(long)overhead)) in ess_raf_received_pack()
325 ess_send_response(smc,sm,CHANGE_ALLOCATION) ; in ess_raf_received_pack()
337 if (sm->smt_type != SMT_REQUEST) { in ess_raf_received_pack()
343 &sm->smt_source); in ess_raf_received_pack()
356 ess_send_response(smc,sm,REPORT_ALLOCATION) ; in ess_raf_received_pack()
374 * mib variables SBAPayload, SBAOverhead and fddiMACT-NEG.
376 static int process_bw_alloc(struct s_smc *smc, long int payload, long int overhead) in process_bw_alloc() argument
379 * determine the synchronous bandwidth (sync_bw) in bytes per T-NEG, in process_bw_alloc()
385 * SBAPayload = | 8000 ------ | in process_bw_alloc()
387 * - - in process_bw_alloc()
390 * SBAOverhead = | ------ | in process_bw_alloc()
391 * | T-NEG | in process_bw_alloc()
392 * - - in process_bw_alloc()
394 * T-NEG is described by the equation: in process_bw_alloc()
396 * (-) fddiMACT-NEG in process_bw_alloc()
397 * T-NEG = ------------------- in process_bw_alloc()
403 * bytes T-NEG SBAPayload 8000 bytes/s in process_bw_alloc()
404 * sync_bw = SBAOverhead ------ + ----------------------------- in process_bw_alloc()
405 * T-NEG T-NEG in process_bw_alloc()
409 * sync_bw = SBAOverhead + ---- (-)fddiMACT-NEG * SBAPayload in process_bw_alloc()
417 /* if (smt_set_obj(smc,SMT_P320F,payload,S_SET)) { in process_bw_alloc()
421 if (smt_set_obj(smc,SMT_P3210,overhead,S_SET)) { in process_bw_alloc()
436 if (smc->mib.fddiESSPayload && in process_bw_alloc()
437 ((u_long)payload != smc->mib.fddiESSPayload || in process_bw_alloc()
438 (u_long)overhead != smc->mib.fddiESSOverhead)) { in process_bw_alloc()
439 smc->ess.raf_act_timer_poll = TRUE ; in process_bw_alloc()
440 smc->ess.timer_count = 0 ; in process_bw_alloc()
448 smc->ess.sync_bw_available = TRUE ; in process_bw_alloc()
450 smc->ess.sync_bw = overhead - in process_bw_alloc()
451 (long)smc->mib.m[MAC0].fddiMACT_Neg * in process_bw_alloc()
456 smc->ess.sync_bw_available = FALSE ; in process_bw_alloc()
457 smc->ess.sync_bw = 0 ; in process_bw_alloc()
461 smc->mib.a[PATH0].fddiPATHSbaPayload = payload ; in process_bw_alloc()
462 smc->mib.a[PATH0].fddiPATHSbaOverhead = overhead ; in process_bw_alloc()
465 DB_ESSN(2, "tsync = %lx", smc->ess.sync_bw); in process_bw_alloc()
467 ess_config_fifo(smc) ; in process_bw_alloc()
468 set_formac_tsync(smc,smc->ess.sync_bw) ; in process_bw_alloc()
472 static void ess_send_response(struct s_smc *smc, struct smt_header *sm, in ess_send_response() argument
483 if (!(mb=smt_build_frame(smc,SMT_RAF,SMT_REPLY, in ess_send_response()
488 if (!(mb=smt_build_frame(smc,SMT_RAF,SMT_REPLY, in ess_send_response()
494 chg->smt.smt_tid = sm->smt_tid ; in ess_send_response()
495 chg->smt.smt_dest = sm->smt_source ; in ess_send_response()
498 chg->s_type.para.p_type = SMT_P0015 ; in ess_send_response()
499 chg->s_type.para.p_len = sizeof(struct smt_p_0015) - PARA_LEN ; in ess_send_response()
500 chg->s_type.res_type = SYNC_BW ; in ess_send_response()
503 chg->cmd.para.p_type = SMT_P0016 ; in ess_send_response()
504 chg->cmd.para.p_len = sizeof(struct smt_p_0016) - PARA_LEN ; in ess_send_response()
505 chg->cmd.sba_cmd = sba_cmd ; in ess_send_response()
508 chg->path.para.p_type = SMT_P320B ; in ess_send_response()
509 chg->path.para.p_len = sizeof(struct smt_p_320b) - PARA_LEN ; in ess_send_response()
510 chg->path.mib_index = SBAPATHINDEX ; in ess_send_response()
511 chg->path.path_pad = 0; in ess_send_response()
512 chg->path.path_index = PRIMARY_RING ; in ess_send_response()
515 chg->payload.para.p_type = SMT_P320F ; in ess_send_response()
516 chg->payload.para.p_len = sizeof(struct smt_p_320f) - PARA_LEN ; in ess_send_response()
517 chg->payload.mib_index = SBAPATHINDEX ; in ess_send_response()
518 chg->payload.mib_payload = smc->mib.a[PATH0].fddiPATHSbaPayload ; in ess_send_response()
521 chg->overhead.para.p_type = SMT_P3210 ; in ess_send_response()
522 chg->overhead.para.p_len = sizeof(struct smt_p_3210) - PARA_LEN ; in ess_send_response()
523 chg->overhead.mib_index = SBAPATHINDEX ; in ess_send_response()
524 chg->overhead.mib_overhead = smc->mib.a[PATH0].fddiPATHSbaOverhead ; in ess_send_response()
528 chg->cat.para.p_type = SMT_P001A ; in ess_send_response()
529 chg->cat.para.p_len = sizeof(struct smt_p_001a) - PARA_LEN ; in ess_send_response()
530 p = (void *) sm_to_para(smc,sm,SMT_P001A) ; in ess_send_response()
531 chg->cat.category = ((struct smt_p_001a *)p)->category ; in ess_send_response()
533 dump_smt(smc,(struct smt_header *)chg,"RAF") ; in ess_send_response()
534 ess_send_frame(smc,mb) ; in ess_send_response()
537 void ess_timer_poll(struct s_smc *smc) in ess_timer_poll() argument
539 if (!smc->ess.raf_act_timer_poll) in ess_timer_poll()
544 smc->ess.timer_count++ ; in ess_timer_poll()
545 if (smc->ess.timer_count == 10) { in ess_timer_poll()
546 smc->ess.timer_count = 0 ; in ess_timer_poll()
547 ess_send_alc_req(smc) ; in ess_timer_poll()
551 static void ess_send_alc_req(struct s_smc *smc) in ess_send_alc_req() argument
561 if (!smc->mib.fddiESSPayload) { in ess_send_alc_req()
562 smc->mib.fddiESSOverhead = 0 ; in ess_send_alc_req()
565 if (!smc->mib.fddiESSOverhead) in ess_send_alc_req()
566 smc->mib.fddiESSOverhead = DEFAULT_OV ; in ess_send_alc_req()
569 if (smc->mib.fddiESSOverhead == in ess_send_alc_req()
570 smc->mib.a[PATH0].fddiPATHSbaOverhead && in ess_send_alc_req()
571 smc->mib.fddiESSPayload == in ess_send_alc_req()
572 smc->mib.a[PATH0].fddiPATHSbaPayload){ in ess_send_alc_req()
573 smc->ess.raf_act_timer_poll = FALSE ; in ess_send_alc_req()
574 smc->ess.timer_count = 7 ; /* next RAF alc req after 3 s */ in ess_send_alc_req()
581 if (!(mb=smt_build_frame(smc,SMT_RAF,SMT_REQUEST, in ess_send_alc_req()
585 req->smt.smt_tid = smc->ess.alloc_trans_id = smt_get_tid(smc) ; in ess_send_alc_req()
586 req->smt.smt_dest = smt_sba_da ; in ess_send_alc_req()
589 req->s_type.para.p_type = SMT_P0015 ; in ess_send_alc_req()
590 req->s_type.para.p_len = sizeof(struct smt_p_0015) - PARA_LEN ; in ess_send_alc_req()
591 req->s_type.res_type = SYNC_BW ; in ess_send_alc_req()
594 req->cmd.para.p_type = SMT_P0016 ; in ess_send_alc_req()
595 req->cmd.para.p_len = sizeof(struct smt_p_0016) - PARA_LEN ; in ess_send_alc_req()
596 req->cmd.sba_cmd = REQUEST_ALLOCATION ; in ess_send_alc_req()
604 req->path.para.p_type = SMT_P320B ; in ess_send_alc_req()
605 req->path.para.p_len = sizeof(struct smt_p_320b) - PARA_LEN ; in ess_send_alc_req()
606 req->path.mib_index = SBAPATHINDEX ; in ess_send_alc_req()
607 req->path.path_pad = 0; in ess_send_alc_req()
608 req->path.path_index = PRIMARY_RING ; in ess_send_alc_req()
611 req->pl_req.para.p_type = SMT_P0017 ; in ess_send_alc_req()
612 req->pl_req.para.p_len = sizeof(struct smt_p_0017) - PARA_LEN ; in ess_send_alc_req()
613 req->pl_req.sba_pl_req = smc->mib.fddiESSPayload - in ess_send_alc_req()
614 smc->mib.a[PATH0].fddiPATHSbaPayload ; in ess_send_alc_req()
617 req->ov_req.para.p_type = SMT_P0018 ; in ess_send_alc_req()
618 req->ov_req.para.p_len = sizeof(struct smt_p_0018) - PARA_LEN ; in ess_send_alc_req()
619 req->ov_req.sba_ov_req = smc->mib.fddiESSOverhead - in ess_send_alc_req()
620 smc->mib.a[PATH0].fddiPATHSbaOverhead ; in ess_send_alc_req()
623 req->payload.para.p_type = SMT_P320F ; in ess_send_alc_req()
624 req->payload.para.p_len = sizeof(struct smt_p_320f) - PARA_LEN ; in ess_send_alc_req()
625 req->payload.mib_index = SBAPATHINDEX ; in ess_send_alc_req()
626 req->payload.mib_payload = smc->mib.a[PATH0].fddiPATHSbaPayload ; in ess_send_alc_req()
629 req->overhead.para.p_type = SMT_P3210 ; in ess_send_alc_req()
630 req->overhead.para.p_len = sizeof(struct smt_p_3210) - PARA_LEN ; in ess_send_alc_req()
631 req->overhead.mib_index = SBAPATHINDEX ; in ess_send_alc_req()
632 req->overhead.mib_overhead = smc->mib.a[PATH0].fddiPATHSbaOverhead ; in ess_send_alc_req()
635 req->a_addr.para.p_type = SMT_P0019 ; in ess_send_alc_req()
636 req->a_addr.para.p_len = sizeof(struct smt_p_0019) - PARA_LEN ; in ess_send_alc_req()
637 req->a_addr.sba_pad = 0; in ess_send_alc_req()
638 req->a_addr.alloc_addr = null_addr ; in ess_send_alc_req()
641 req->cat.para.p_type = SMT_P001A ; in ess_send_alc_req()
642 req->cat.para.p_len = sizeof(struct smt_p_001a) - PARA_LEN ; in ess_send_alc_req()
643 req->cat.category = smc->mib.fddiESSCategory ; in ess_send_alc_req()
646 req->tneg.para.p_type = SMT_P001B ; in ess_send_alc_req()
647 req->tneg.para.p_len = sizeof(struct smt_p_001b) - PARA_LEN ; in ess_send_alc_req()
648 req->tneg.max_t_neg = smc->mib.fddiESSMaxTNeg ; in ess_send_alc_req()
651 req->segm.para.p_type = SMT_P001C ; in ess_send_alc_req()
652 req->segm.para.p_len = sizeof(struct smt_p_001c) - PARA_LEN ; in ess_send_alc_req()
653 req->segm.min_seg_siz = smc->mib.fddiESSMinSegmentSize ; in ess_send_alc_req()
655 dump_smt(smc,(struct smt_header *)req,"RAF") ; in ess_send_alc_req()
656 ess_send_frame(smc,mb) ; in ess_send_alc_req()
659 static void ess_send_frame(struct s_smc *smc, SMbuf *mb) in ess_send_frame() argument
664 if (smc->ess.local_sba_active) { in ess_send_frame()
669 if (!smc->ess.sba_reply_pend) in ess_send_frame()
670 smc->ess.sba_reply_pend = mb ; in ess_send_frame()
672 DB_ESS("Frame is lost - another frame was pending"); in ess_send_frame()
673 smt_free_mbuf(smc,mb) ; in ess_send_frame()
681 smt_send_frame(smc,mb,FC_SMT_INFO,0) ; in ess_send_frame()
685 void ess_para_change(struct s_smc *smc) in ess_para_change() argument
687 (void)process_bw_alloc(smc,(long)smc->mib.a[PATH0].fddiPATHSbaPayload, in ess_para_change()
688 (long)smc->mib.a[PATH0].fddiPATHSbaOverhead) ; in ess_para_change()
691 static void ess_config_fifo(struct s_smc *smc) in ess_config_fifo() argument
696 if (smc->mib.a[PATH0].fddiPATHSbaPayload) { in ess_config_fifo()
697 if (smc->hw.fp.fifo.fifo_config_mode & SYNC_TRAFFIC_ON && in ess_config_fifo()
698 (smc->hw.fp.fifo.fifo_config_mode&SEND_ASYNC_AS_SYNC) == in ess_config_fifo()
699 smc->mib.fddiESSSynchTxMode) { in ess_config_fifo()
704 if (!(smc->hw.fp.fifo.fifo_config_mode & SYNC_TRAFFIC_ON)) { in ess_config_fifo()
712 formac_reinit_tx(smc) ; in ess_config_fifo()