⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ci_init.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
📖 第 1 页 / 共 5 页
字号:
		    }		    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 + -