📄 ci_init.c
字号:
} break; case HPT_CIBCA_AA: case HPT_CIBCA_BA: regoffptr = cibca_regoff; pccb->Dg_cache = CIBX_DG_CACHE; pccb->Msg_cache = CIBX_MSG_CACHE; pccb->Start_port = cibx_start; pccb->Disable_port = cibx_disable; if( hpt == HPT_CIBCA_BA ) { if( Cibx_onboard( biic->biic_typ )) { pccb->Lpstatus.onboard = 1; pccb->Max_fn_level = CIBCA_BA_MAXFN; pccb->Max_rom_level = CIBCA_BA_MAXST; pccb->Mrltab = cibca_ba_mrltab; } else { status = FE_INIT_UNKHPT; } } else { if( Cibx_onboard( biic->biic_typ ) == 0 ) { if( ci_ucode ) { if( ci_ucode_type == UCODE_CIBCA ) { pccb->Max_fn_level = CIBCA_AA_MAXFN; pccb->Max_rom_level = CIBCA_AA_MAXST; pccb->Mrltab = cibca_aa_mrltab; pccb->Load_ucode = cibca_aa_load; } else { status = FE_INIT_MISMTCH; } } else { status = FE_INIT_NOUCODE; } } else { status = FE_INIT_UNKHPT; } } break; default: status = FE_INIT_UNKHPT; } break; } case ICT_XMI: { register struct xmi_reg *xmireg = ( struct xmi_reg * )ioaddr; switch( hpt ) { case HPT_CIXCD: pccb->Xdev = ( u_long * )&xmireg->xmi_dtype; pccb->Xbe = ( u_long * )&xmireg->xmi_xbe; pccb->Xfadrl = ( u_long * )&xmireg->xmi_fadr; pccb->Xfadrh = ( u_long * )(( u_long )xmireg + CIXCD_XFAER); pccb->Xcd_pidr = ( u_long * )(( u_long )xmireg + CIXCD_PIDR ); pccb->Xcd_pvr = ( u_long * )(( u_long )xmireg + CIXCD_PVR ); regoffptr = cixcd_regoff; pccb->Lpstatus.onboard = 1; pccb->Dg_cache = CIBX_DG_CACHE; pccb->Msg_cache = CIBX_MSG_CACHE; pccb->Start_port = cibx_start; pccb->Disable_port = cibx_disable; pccb->Max_fn_level = CIXCD_MAXFN; pccb->Max_rom_level = CIXCD_MAXST; pccb->Mrltab = cixcd_mrltable; break; case HPT_CIKMF: if( !ciadap->status.pccb ) { pccb->Xdev = ( u_long * )&xmireg->xmi_dtype; pccb->Xbe = ( u_long * )&xmireg->xmi_xbe; pccb->Xfadrl = ( u_long * )&xmireg->xmi_fadr; pccb->Xfadrh = ( u_long * )(( u_long )xmireg + CIKMF_XFAER); pccb->Kmf_xpcctl = ( u_long * )(( u_long )xmireg + CIKMF_XPCCTRL ); pccb->Kmf_xpccsr = ( u_long * )(( u_long )xmireg + CIKMF_XPCCSR ); pccb->Kmf_pidr1 = ( u_long * )(( u_long )xmireg + CIKMF_IDEST1 ); pccb->Kmf_pidr2 = ( u_long * )(( u_long )xmireg + CIKMF_IDEST2 ); pccb->Kmf_pidr3 = ( u_long * )(( u_long )xmireg + CIKMF_IDEST3 ); pccb->Kmf_pvr1 = ( u_long * )(( u_long )xmireg + CIKMF_IVECT1 ); pccb->Kmf_pvr2 = ( u_long * )(( u_long )xmireg + CIKMF_IVECT2 ); pccb->Kmf_pvr3 = ( u_long * )(( u_long )xmireg + CIKMF_IVECT3 ); pccb->Kmf_piplr1 = ( u_long * )(( u_long )xmireg + CIKMF_IPL1 ); pccb->Kmf_piplr2 = ( u_long * )(( u_long )xmireg + CIKMF_IPL2 ); pccb->Kmf_piplr3 = ( u_long * )(( u_long )xmireg + CIKMF_IPL3 ); ciadap->status.pccb = 1; pccb->Lpstatus.adapt = 1; regoffptr = cikmf1_regoff; } else { regoffptr = cikmf2_regoff; } pccb->Lpstatus.onboard = 1; pccb->Dg_cache = CIBX_DG_CACHE; pccb->Msg_cache = CIBX_MSG_CACHE; pccb->Start_port = cibx_start; pccb->Disable_port = cibx_disable; pccb->Max_fn_level = CIKMF_MAXFN; pccb->Max_rom_level = CIKMF_MAXST; pccb->Mrltab = cikmf_mrltable; break; default: status = FE_INIT_UNKHPT; } break; } case ICT_SHAC: { switch( hpt ) { case HPT_SHAC:/* regoffptr = cishc_regoff; pccb->Lpstatus.onboard = 1; pccb->Dg_cache = CIBX_DG_CACHE; pccb->Msg_cache = CIBX_MSG_CACHE; pccb->Start_port = cishc_start; pccb->Disable_port = cishc_disable; pccb->Max_fn_level = CISHC_MAXFN; pccb->Max_rom_level = CISHC_MAXST; pccb->Mrltab = cishc_mrltable;*/ break; default: status = FE_INIT_UNKHPT; } break; } default: ( void )panic( PANIC_IC ); } if( status ) { KM_FREE(( char * )pccb, KM_SCA ) ( void )ci_log_initerr( cinum, interconnect, hpt, status ); ci_isr[ cinum ].pccb = NULL; ci_isr[ cinum ].isr = ci_unmapped_isr; ( void )splx( save_ipl ); return; } U_long( pccb->size ) = sizeof( PCCB ); pccb->type = DYN_PCCB; pccb->pdt = &ci_pdt; Init_pccb_lock( pccb ) Init_cidevice_lock( pccb ) pccb->lpinfo.type.hwtype = hpt; pccb->lpinfo.type.swtype = SPT_CI; pccb->lpinfo.type.ictype = interconnect; pccb->lpinfo.type.dual_path = 1; pccb->lpinfo.name = Ctrl_from_num( "ci ", cinum ); { register u_long **regptr, **end; for( regptr = ( u_long ** )&pccb->Ciregptrs, end = ( u_long ** )( &pccb->Ciregptrs + 1 ); regptr != end; ++regptr, ++regoffptr ) { *regptr = ( u_long * )(( u_long )ioaddr + U_long( *regoffptr )); } } switch( pccb->lpinfo.type.hwtype ) { case HPT_CIXCD: pccb->lpinfo.flags.expl = 1; pccb->lpinfo.Ovhd_pd = Gvph_size_exp; pccb->Madr = 0; pccb->Mdatr = 0; pccb->Cnfr = 0; break; case HPT_CIKMF: pccb->lpinfo.Ovhd_pd = Gvph_size_imp; pccb->Cnfr = 0; pccb->Pper = 0; break; case HPT_SHAC: case HPT_CIBCA_BA: pccb->Madr = 0; pccb->Mdatr = 0; case HPT_CIBCA_AA: pccb->Cnfr = 0; case HPT_CI750: case HPT_CI780: case HPT_CIBCI: pccb->lpinfo.Ovhd_pd = Gvph_size_imp; pccb->Pper = 0; break; default: ( void )panic( PANIC_HPT ); } pccb->Lpstatus.init = 1; pccb->Lpstatus.power = 1; pccb->Lpstatus.mapped = 1; pccb->Reinit_tries = ci_max_reinits; pccb->Pkt_size = ( pccb->lpinfo.Ovhd_pd + sizeof( SETCKTH )); if(( pccb->Pkt_mult = (( *pccb->Ppr & PPR_IBUF_LEN ) >> 25 )) > 0 ) { pccb->Pkt_mult--; } { register u_char *c; register int n; for( c = &pccb->Lbdata[ 0 ], n = 0; n < LBDSIZE; n++, c++ ) { *c = ( u_char )n; } } pccb->Pmaintq.header = &pccb->Pqb.cmdq0; pccb->Pmaintq.creg = pccb->Pcq0cr; pccb->Pmaintq.cmask = PCQ0CR_CMDQ0C; pccb->Pmaintq.error = SE_ICMDQ0; pccb->Pblockq.header = &pccb->Pqb.cmdq1; pccb->Pblockq.creg = pccb->Pcq1cr; pccb->Pblockq.cmask = PCQ1CR_CMDQ1C; pccb->Pblockq.error = SE_ICMDQ1; pccb->Pcommq.header = &pccb->Pqb.cmdq2; pccb->Pcommq.creg = pccb->Pcq2cr; pccb->Pcommq.cmask = PCQ2CR_CMDQ2C; pccb->Pcommq.error = SE_ICMDQ2; pccb->Pcontrolq.header = &pccb->Pqb.cmdq3; pccb->Pcontrolq.creg = pccb->Pcq3cr; pccb->Pcontrolq.cmask = PCQ3CR_CMDQ3C; pccb->Pcontrolq.error = SE_ICMDQ3; pccb->Pdfreeq.header = &pccb->Dfreeq; pccb->Pdfreeq.creg = pccb->Pdfqcr; pccb->Pdfreeq.cmask = PDFQCR_DFQC; pccb->Pdfreeq.error = SE_IDFREEQ; pccb->Pmfreeq.header = &pccb->Mfreeq; pccb->Pmfreeq.creg = pccb->Pmfqcr; pccb->Pmfreeq.cmask = PMFQCR_MFQC; pccb->Pmfreeq.error = SE_IMFREEQ; pccb->Rspq_remerr = SE_RRSPQ; pccb->Dfreeq_remerr = SE_RDFREEQ; pccb->Mfreeq_remerr = SE_RMFREEQ; pccb->Pqb.Dfreeq_hdr = CI_DFREEQ; pccb->Pqb.Mfreeq_hdr = CI_MFREEQ; pccb->Pqb.Dqe_len = pccb->lpinfo.Ovhd_pd + sizeof( GVPPPDH ) + sizeof( SCSH ) + scs_dg_size; pccb->Pqb.Mqe_len = pccb->lpinfo.Ovhd_pd + sizeof( GVPPPDH ) + sizeof( SCSH ) + scs_msg_size; pccb->Pqb.Keepalive = ( u_long )ci_maint_intrvl; pccb->Pqb.Vpqb_base = VPQB_BASE; pccb->Pqb.Bdt_base = BDT_BASE; pccb->Pqb.Bdt_len = gvp_max_bds; pccb->Pqb.Spt_base = SPT_BASE; pccb->Pqb.Spt_len = SPT_LEN; pccb->Pqb.Gpt_base = GPT_BASE; pccb->Pqb.Gpt_len = pccb->Pqb.Spt_len; pccb->Pqb.Func_mask = 0; { register GVPH **lp, **ep; for( lp = ( GVPH ** )pccb->Pqb.Dqe_logout, ep = ( GVPH ** )pccb->Pqb.Dqe_logout + ( 2 * CI_NLOG ); lp < ep; ++lp ) { *lp = ( GVPH * )GVPH_FREE; } } Dm_pccbifISIS Init_queue( pccb->Form_pb ) pccb->Burst = cippd_max_port; /* poll all nodes first */ pccb->Contact = ci_cippdcontact; pccb->Max_cables = MAX_CABLES; pccb->lpinfo.Dg_size = pccb->Pqb.Dqe_len; pccb->lpinfo.Msg_size = pccb->Pqb.Mqe_len; pccb->lpinfo.Ovhd = pccb->lpinfo.Ovhd_pd + sizeof( GVPPPDH ); pccb->lpinfo.Protocol = CIPPD_VERSION; ( void )( *pccb->Disable_port )( pccb, PS_UNINIT ); Insert_entry( pccb->flink, scs_lport_db ); Pccb_fork( pccb, ci_init_port, PANIC_PCCBFB ) ( void )splx( save_ipl );}/* Name: ci_setup_port - Prepare Local CI Port for Initialization * * Abstract: This function prepares local CI ports for initialization and is * invoked only during local port initialization. * * Inputs: * * IPL_SCS - Interrupt processor level * SID - System Identification processor register * cpu - CPU type code * lscs - Local system permanent information * pccb - Port Command and Control Block pointer * pd.gvp.type.ci - CI specific PCCB fields * lpstatus.mapped - 1 * ppd.cippd - CI PPD specific PCCB fields * fsmstatus.broken - 0 * fsmstatus.online - 0 * * Outputs: * * IPL_SCS - Interrupt processor level * pccb - Port Command and Control Block pinter * pd.gvp.type.ci - CI specific PCCB fields * devattn.cicpurevlev - Out-of-revision CPU microcode information * dfreeq - Port datagram free queue * mfreeq - Port message free queue * ppd.cippd - CI PPD specific PCCB fields * fsmstatus.broken - Port is broken status flag *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -