📄 msiport.h
字号:
if( Msibp == NULL ) { \ u_long tport = siibp->cmdblk.src; \ Rget_free_msg( pccb, tport, msibp ) \ if( Msibp == NULL ) { \ lpc = 1; \ event = SE_MFQE; \ } \ } \ } else { \ event = SE_INVRPKTSIZE; \ } \ } else { \ Rcheck_oseqmsg( pccb, siibp, tpi, event ) \ } \}#define Rcheck_oseqmsg( pccb, siibp, tpi, event ) { \ if( Rpstatus_vc( tpi )) { \ register u_long pseqno = Ns_msih( siibp->Rpkt.ph ); \ Incr_seqno( pseqno ) \ if( tpi->rseqno != pseqno ) { \ event = SE_OSEQMSG; \ } \ } \}#define Rcheck_penable( port_state ) \ ( port_state == PS_ENAB || port_state == PS_ENAB_MAINT )#define Rcheck_pktlen( siibp, min, max ) \ ( siibp->cmdblk.length >= pccb->min && siibp->cmdblk.length <= pccb->max )#define Rcheck_sntdat( pccb, siibp, tpi, msibp, event, lpc ) { \ register MSIBD *bdp; \ if( Rcheck_vc( pccb, siibp, tpi )) { \ Rincr_rseqno( pccb, tpi ) \ if( Rcheck_pktlen( siibp, Min_sntdat_size, Max_sntdat_size )) { \ if( Check_bname( siibp->Rpkt.sntdat.rbname, bdp )) { \ pccb->Rdmap.ssize = siibp->cmdblk.length - SNTDAT_MINSIZE; \ Copy_long( &siibp->Rpkt.sntdat.rboff[ 0 ], &pccb->Rdmap.Sboff)\ if( Check_bsize( bdp, pccb->Rdmap )) { \ Setup_dmap( bdp, pccb->Rdmap ) \ Remove_mfreeq( pccb, msibp ) \ if( Msibp == NULL ) { \ u_long tport = siibp->cmdblk.src; \ Rget_free_msg( pccb, tport, msibp ) \ if( Msibp == NULL ) { \ lpc = 1; \ event = SE_MFQE; \ } \ } \ } else { \ lpc = 1; \ event = SE_INVBSIZE; \ } \ } else { \ lpc = 1; \ event = SE_INVBNAME; \ } \ } else { \ event = SE_INVRPKTSIZE; \ } \ } else { \ Rcheck_oseqmsg( pccb, siibp, tpi, event ) \ } \}#define Rcheck_vc( pccb, siibp, tpi ) \ ( Rpstatus_vc( tpi ) && tpi->rseqno == Ns_msih( siibp->Rpkt.ph ))#define Rget_free_msg( pccb, port, msibp ) { \ register siibq *siibp; \ register SCSH *scsbp; \ Lock_xfp( pccb ) \ Remove_mfreeq( pccb, msibp ) \ if( Msibp == NULL && ( siibp = pccb->Xbusy ) && Siibp->save_msib ) {\ do { \ if( Siibp->cmdblk.dst == port ) { \ Msibp = Siibp->save_msib; \ if( Vc_msib( Msibp ) && Free_msib( Msibp )) { \ if(( scsbp = msi_alloc_msg( pccb ))) { \ Set_discard( Msibp ) \ Msibp = Scs_to_pd( pccb, scsbp ); \ } else { \ Msibp = NULL; \ } \ break; \ } else { \ Msibp = NULL; \ } \ } \ } while(( siibp = siibp->flink ) != pccb->Xfree ); \ } \ Unlock_xfp( pccb ) \}#define Rinvalid_srcaddr( pccb, siibp ) \ ( siibp->cmdblk.src >= MSI_MAXNUM_PORT )#define Rreceive_abort( pccb, siibp ) \ ( ( siibp->cmdblk.opcode & CMDOPC_GROUPC ) != CMDOPC_GROUPC || \ ( siibp->cmdblk.opcode & CMDOPC_REQACK ) != CMDOPC_REQACK || \ siibp->cmdblk.dst != Scaaddr_lob( pccb->lpinfo.addr ) || \ siibp->cmdblk.length < 2 || \ Rinvalid_srcaddr( pccb, siibp ))#define Rreceive_good( pccb, siibp ) \ ( siibp->cmdblk.status == ST_SUCCESS && \ !Rreceive_abort( pccb, siibp ))/* Transmit Fork Process Macros. */ /* Fork Process Control Macros */#define Xstart_xfp( pccb ) { \ register u_long unlock; \ if( !Test_pccb_lock( pccb )) { \ Lock_pccb( pccb ) \ unlock = 1; \ } else { \ unlock = 0; \ } \ if( Lpstatus_xfork( pccb ) == 0 ) { \ Set_xfork( pccb ) \ Kfork( &pccb->Xforkb, msi_xfp, pccb ) \ } \ if( unlock ) { \ Unlock_pccb( pccb ) \ } \}#define Xstart_xfp_timer( pccb ) { \ if( !pccb->Lpstatus.timer ) { \ pccb->Lpstatus.timer = 1; \ ( void )timeout( msi_xfp_timer, ( u_char * )pccb, 1 ); \ } \}#define Xfp_started( pccb, save_ipl ) { \ save_ipl = Splscs(); \ Lock_pccb( pccb ) \ Lock_xfp( pccb ) \ if( Lpstatus_xfork( pccb )) { \ Clear_xfork( pccb ) \ Unlock_pccb( pccb ) \ if( Lpstatus_active( pccb ) == 0 || pccb->Xbusy == NULL ) { \ Unlock_xfp( pccb ) \ ( void )splx( save_ipl ); \ return; \ } \ } else { \ ( void )panic( PANIC_XFPFB ); \ } \}#define Xfp_timer_started( pccb, save_ipl ) { \ save_ipl = Splscs(); \ Lock_xfp( pccb ) \ if( pccb->Lpstatus.timer ) { \ pccb->Lpstatus.timer = 0; \ if( Lpstatus_active( pccb ) == 0 ) { \ Unlock_xfp( pccb ) \ ( void )splx( save_ipl ); \ return; \ } \ } else { \ ( void )panic( PANIC_XFP_TIMER ); \ } \} /* MSIB/SIIBUF Transmit Status Macros */#define Xsii_busy( pccb ) \ ( *pccb->Msidscr & MSIDSCR_OUT || \ ( *pccb->Msiisr3 & MSIISR3_WR0 ) == MSIISR3_WR0 ) #define Xabort_xmt( tpi, msibp ) \ (( Vc_msib( msibp ) && !Rpstatus_vc( tpi )) || \ ( Rpstatus_path( tpi ) == 0 && \ msibp->Ph.opcode != IDREQ && \ msibp->Ph.opcode != ID ))#define Xfalse_nack( pccb, siibp ) \ ( siibp->cmdblk.status == ST_NACK_IS_ACK && \ *pccb->Msiilp != siibp->cmdblkaddr )#define Xignore_xmtfail( pccb, siibp, tpi ) \ ( siibp->cmdblk.status == 0 && \ !Rpstatus_vc( tpi ) && \ siibp->Xpkt.ph.opcode == IDREQ )#define Xcheck_lretdat( pccb, msibp, event ) { \ register MSIBD *bdp; \ if( Check_bname( msibp->Lretdat.sbname, bdp )) { \ if( U_long( msibp->Lretdat.length[ 0 ]) > msibp->Retdat_size ) {\ pccb->Xdmap.ssize = msibp->Retdat_size; \ } else { \ pccb->Xdmap.ssize = U_long( msibp->Lretdat.length[ 0 ]); \ Set_lp( msibp->Ph ) \ } \ pccb->Xdmap.Sboff = U_long( msibp->Lretdat.sboff[ 0 ]); \ if( Check_bsize( bdp, pccb->Xdmap )) { \ Setup_dmap( bdp, pccb->Xdmap ) \ } else { \ event = SE_INVBSIZE; \ } \ } else { \ event = SE_INVBNAME; \ } \} /* SIIBUF Header Formating Macros */#define Xformat_cmdblk( pccb, siibp, msibp ) { \ siibp->cmdblk.status = 0; \ siibp->cmdblk.command = ( u_short )msibp->Rport_addr; \ siibp->cmdblk.opcode = CMDOPC_OPCODE; \ siibp->cmdblk.dst = msibp->Rport_addr; \ siibp->cmdblk.src = Scaaddr_lob( pccb->lpinfo.addr ); \ siibp->cmdblk.length = msibp->Framelength; \}#define Xformat_siib( siibp, msibp ) { \ ( void )bcopy(( u_char * )&msibp->Ph, \ ( u_char * )&siibp->Xpkt.ph, \ msibp->Framelength ); \}#define Xformat_xlink( siibp, msibp ) { \ siibp->Xlink.addr = siibp->xpktaddr; \ siibp->Xlink.len = msibp->Framelength; \}#define Xreset_cmdblk( siibp ) { \ siibp->cmdblk.status = 0; \ Interrupt_disable( siibp ) \}#define Xset_xseqno( dpi, siibp ) { \ U_long( siibp->Xpkt.ph ) |= dpi->xseqno; \ Incr_seqno( dpi->xseqno ) \} /* SIIBUF Queue/List Manipulation * Macros */#define Xflush_xbusy( pccb ) { \ register siibq *siibp; \ register MSIB *msibp; \ for( siibp = pccb->Xbusy; \ ( msibp = Siibp->save_msib ); \ siibp = siibp->flink ) { \ ( void )msi_dealloc_pkt( msibp ); \ Siibp->save_msib = NULL; \ } \ pccb->Xbusy = siibp; \}#define Xfree_siib( pccb, siibp ) { \ siibp->save_msib = NULL; \ pccb->Xbusy = siibp->flink; \}#define Xinsert_xbusy( pccb, siibp ) { \ Insert_siib( siibp, *pccb->Xbusy ) \}#define Xinsert_xfree( pccb, siibp ) { \ Insert_siib( siibp, *pccb->Xfree ) \}#define Xinsert_xretryq( tpi, msibp ) { \ Insert_msib( msibp, tpi->xretryq ) \}#define Xreset_xbusy( pccb, siibp ) { \ do { \ Xreset_cmdblk( Siibp ) \ } while(( siibp = siibp->flink ) != pccb->Xfree ); \} /* Transmit Completion Macros */#define Xdiscard_msib( pccb, msibp ) { \ if( Free_msib( msibp )) { \ Xfree_msib( pccb, msibp ) \ } else { \ ( void )msi_dealloc_pkt( msibp ); \ } \}#define Xfree_msib( pccb, msibp ) { \ if( Vc_msib( msibp )) { \ Reset_msib( msibp ) \ Insert_mfreeq( pccb, msibp ) \ } else { \ Reset_msib( msibp ) \ Insert_dfreeq( pccb, msibp ) \ } \}#define Xnext_lretdat( pccb, msibp ) { \ register u_long ssize; \ ssize = msibp->Framelength - pccb->Retdat_ovhd; \ if(( long )( U_long( msibp->Lretdat.length[ 0 ]) -= ssize ) > 0 ) { \ msibp->Framelength = pccb->Retdat_ovhd; \ U_long( msibp->Lretdat.sboff[ 0 ]) += ssize; \ U_long( msibp->Lretdat.rcvboff[ 0 ]) += ssize; \ Copy_long( &msibp->Lretdat.rcvboff[ 0 ], &msibp->Lretdat.rboff[ 0 ])\ Insert_comql( pccb, msibp ) \ } else { \ ( void )panic( PANIC_RETDAT ); \ } \}#define Xproc_pathfail( pccb, siibp, msibp, tpi, port, xq ) { \ register PB *pb; \ u_long cport = port; \ Clear_rpdip( tpi ) \ tpi->xretrys = 0; \ pccb->Xbusy = NULL; \ Unlock_xfp( pccb ) \ Lock_pccb( pccb ) \ if(( pb = cippd_get_pb( pccb, ( SCSH * )&cport, NO_BUF ))) { \ Lock_pb( pb ) \ ( void )msi_log_packet( pccb, \ pb, \ &Siibp->cmdblk, \ &Siibp->Xpkt.ph, \ Siibp->cmdblk.length, \ E_NOPATH, \ PATH_EVENT ); \ if( pb->pinfo.state != PS_PATH_FAILURE ) { \ ( void )cippd_crash_pb( pccb, pb, E_PD, 0, NULL ); \ } \ Unlock_pb( pb ) \ } \ Lock_xfp( pccb ) \ Unlock_pccb( pccb ) \ do { \ if( Siibp->cmdblk.dst == port ) { \ Msibp = Siibp->save_msib; \ Xdiscard_msib( pccb, Msibp ) \ Siibp->save_msib = NULL; \ if( pccb->Xbusy ) { \ register siibq *prev_siibp = siibp->blink; \ Unthread_cmdblk( Siibp ) \ Remove_siib( Siibp ) \ Xinsert_xbusy( pccb, siibp ) \ Thread_cmdblk( Siibp, Siibp ) \ Thread_cmdblk( pccb->Xbusy, pccb->Xbusy ) \ siibp = prev_siibp; \ } \ } else if( pccb->Xbusy == NULL ) { \ pccb->Xbusy = siibp; \ } \ } while(( siibp = siibp->flink ) != pccb->Xfree ); \ if( pccb->Xbusy == NULL ) { \ pccb->Xbusy = pccb->Xfree; \ } \ for( msibp = xq.flink; msibp != &xq; msibp = msibp->flink ) { \ if( Msibp->Rport_addr == port ) { \ register msibq *prev_msibp = msibp->blink; \ Remove_msib( Msibp ) \ ( void )msi_dealloc_pkt( Msibp ); \ msibp = prev_msibp; \ } \ } \}#define Xretdat_error( pccb, msibp, event, xq ) { \ siibq *cache_xbusy = pccb->Xbusy; \ pccb->Xbusy = NULL; \ Unlock_xfp( p
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -