/* semfisda.h */ /* Device Driver for IBM SDLC adapter: Global data */ /*****************************************************************************/ /* Trace data */ /*****************************************************************************/ #ifdef IBMSYNC_TRACE UCHAR TrcBuffer [TRC_BUFSIZE]; UCHAR *TrcPtr = TrcBuffer; #endif /*****************************************************************************/ /* Bus Type (Eisa, Isa or MicroChannel. */ /*****************************************************************************/ INTERFACE_TYPE InterfaceType; /*****************************************************************************/ /* 8273 data */ /*****************************************************************************/ /* Commands, statically allocated, for copying into target device extension */ /* */ /* Note that only the first two bytes are required - opcode and length. */ /* Other bytes must be written driver before command is used */ /* */ /* Note also that the command may be overwritten if appropriate: e.g. */ /* receive and DataTransferMode commands. */ /*****************************************************************************/ UCHAR LastWaitUntilStatus; UCHAR ProtoCmdStringReadPortA[] = { 0x22, 0 }; UCHAR ProtoCmdStringResetOpMode[] = { 0x51, 1 }; UCHAR ProtoCmdStringResetSerialIOMode[]= { 0x60, 1 }; UCHAR ProtoCmdStringSetOpMode[] = { 0x91, 1 }; UCHAR ProtoCmdStringSetSerialIOMode[] = { 0xa0, 1 }; UCHAR ProtoCmdStringDataTransferMode[] = { 0x97, 1 }; UCHAR ProtoCmdStringResetPortB[] = { 0x63, 1 }; UCHAR ProtoCmdStringSetPortB[] = { 0xa3, 1 }; UCHAR ProtoCmdStringReceive [] = { 0xc0, 2 }; UCHAR ProtoCmdStringTransmit[] = { 0xc8, 4 }; UCHAR ProtoCmdStringAbortTransmit[] = { 0xcc, 0 }; UCHAR ProtoCmdStringDisableReceiver[] = { 0xc5, 0 }; /*****************************************************************************/ /* FSM data */ /*****************************************************************************/ char *RxFSMStateNames[] = {"RsId", "RsGo", "RsIH", "RsRH"}; char *RxFSMInputNames[] = {"RiGo", "RiSo", "RiHo", "RiRl", "RiGr", "RiEr"}; char *TxFSMStateNames[] = {"TsId", "TsAc", "TsTx", "TsAb", "TsCl"}; char *TxFSMInputNames[] = {"TiGo", "TiEo", "TiSo", "TiAb", "TiEr"}; /*****************************************************************************/ /* This is the declaration of the Receiver FSM */ /*****************************************************************************/ typedef struct _RXFSMENTRY /* one entry in Rx FSM */ { int NewState; void (*pRxActionRoutine) (PDX); } RXFSMENTRY; RXFSMENTRY RxFSM [RXFSMINPUTCOUNT ] [RXFSMSTATECOUNT] = { /* Input = RxFSMInputStart Start the receiver */ { { RxFSMStateReady ,RxFSMActionStart },/* RX State = Idle */ { RxFSMStateReady , FSMNullAction },/* RX State = Ready */ { RxFSMStateRdyHld, FSMNullAction },/* RX State = Idle (held) */ { RxFSMStateRdyHld, FSMNullAction } /* RX State = Ready(held) */ }, /* Input = RxFSMInputStop Stop the receiver */ { { RxFSMStateIdle , FSMNullAction },/* RX State = Idle */ { RxFSMStateIdle ,RxFSMActionStop },/* RX State = Ready */ { RxFSMStateIdlHld, FSMNullAction },/* RX State = Idle (held) */ { RxFSMStateIdlHld, FSMNullAction } /* RX State = Ready(held) */ }, /* Input = RxFSMInputHold Stop the receiver during Tx DMA */ { { RxFSMStateIdlHld, FSMNullAction },/* RX State = Idle */ { RxFSMStateRdyHld,RxFSMActionStop },/* RX State = Ready */ { RxFSMStateIdlHld, FSMNullAction },/* RX State = Idle (held) */ { RxFSMStateRdyHld, FSMNullAction } /* RX State = Ready(held) */ }, /* Input = RxFSMInputRelease Restart the receiver after Tx DMA*/ { { RxFSMStateIdle ,RxFSMActionInvalid},/* RX State = Idle */ { RxFSMStateReady ,RxFSMActionInvalid},/* RX State = Ready */ { RxFSMStateIdle , FSMNullAction },/* RX State = Idle (held) */ { RxFSMStateReady ,RxFSMActionRestart} /* RX State = Ready(held) */ }, /* Input = RxFSMInputGoodReceive Receiver interrupt - good result */ { { RxFSMStateIdle ,RxFSMActionInvalid},/* RX State = Idle */ { RxFSMStateReady ,RxFSMActionRcvOK },/* RX State = Ready */ { RxFSMStateIdlHld,RxFSMActionInvalid},/* RX State = Idle (held) */ { RxFSMStateRdyHld,RxFSMActionInvalid} /* RX State = Ready(held) */ }, /* Input = RxFSMInputReceiverError Receiver interrupt - bad result */ { { RxFSMStateIdle ,RxFSMActionInvalid}, /* RX State = Idle */ { RxFSMStateReady ,RxFSMActionRcvError},/* RX State = Ready */ { RxFSMStateIdlHld, FSMNullAction }, /* RX State = Idle (held) */ { RxFSMStateRdyHld, FSMNullAction } /* RX State = Ready(held) */ } }; /*****************************************************************************/ /* This is the declaration of the Transmitter FSM */ /*****************************************************************************/ typedef struct _TXFSMENTRY /* one entry in Rx FSM */ { int NewState; void (*pTxActionRoutine) (PDX); } TXFSMENTRY; TXFSMENTRY TxFSM [TXFSMINPUTCOUNT ] [TXFSMSTATECOUNT] = { /* Input = TxFSMInputStart Start a transmission. */ { { TxFSMStateTxing ,TxFSMActionStart }, /* TX State = Idle */ { TxFSMStateTxing ,TxFSMActionXmitNext}, /* TX State = Active */ { TxFSMStateTxing , FSMNullAction }, /* TX State = Transmitting */ { TxFSMStateAborting, FSMNullAction }, /* TX_State = Wait for abort compl */ { TxFSMStateAborting, FSMNullAction } /* TX_State = Closing Down */ }, /* Input = TxFSMInputEOTX Good Transmission completion */ { { TxFSMStateIdle ,TxFSMActionInvalid }, /* TX State = Idle */ { TxFSMStateActive ,TxFSMActionInvalid }, /* TX State = Active */ { TxFSMStateActive ,TxFSMActionEndOK }, /* TX State = Transmitting */ { TxFSMStateAborting, FSMNullAction }, /* TX_State = Wait for abort compl */ { TxFSMStateClosing , FSMNullAction } /* TX_State = Closing Down */ }, /* Input = TxFSMInputStop Stop the transmitter. */ { { TxFSMStateIdle , FSMNullAction }, /* TX State = Idle */ { TxFSMStateIdle ,TxFSMActionStop }, /* TX State = Active */ { TxFSMStateClosing ,TxFSMActionAbort }, /* TX State = Transmitting */ { TxFSMStateClosing , FSMNullAction }, /* TX_State = Wait for abort compl */ { TxFSMStateClosing , FSMNullAction } /* TX_State = Closing Down */ }, /* Input = TxFSMInputAbortd Abort Complete interrupt received. */ { { TxFSMStateIdle ,TxFSMActionInvalid }, /* TX State = Idle */ { TxFSMStateActive ,TxFSMActionInvalid }, /* TX State = Active */ { TxFSMStateTxing ,TxFSMActionInvalid }, /* TX State = Transmitting */ { TxFSMStateTxing ,TxFSMActionXmitNext}, /* TX_State = Wait for abort compl */ { TxFSMStateIdle ,TxFSMActionStop } /* TX_State = Closing Down */ }, /* Input = TxFSMInputEOTx_Err Error Completion interrupt received */ { { TxFSMStateIdle ,TxFSMActionInvalid }, /* TX State = Idle */ { TxFSMStateActive ,TxFSMActionInvalid }, /* TX State = Active */ { TxFSMStateActive ,TxFSMActionEndError}, /* TX State = Transmitting */ { TxFSMStateAborting, FSMNullAction }, /* TX_State = Wait for abort compl */ { TxFSMStateClosing , FSMNullAction } /* TX_State = Closing Down */ } }; /*****************************************************************************/ /* Configuration data */ /*****************************************************************************/ CONFIGDATA ConfigData[] = { /* must be in ADAPTER_TYPE order */ /* DL$01 */ { AT_SDLC, "SDLC1",(IO_ADDRESS)0x380, 0, 1, 0, 0, 1 /*AddrSpace*/, 0 /*BusNumber*/, 3,3,FALSE,Latched, 0, 0,FALSE,Latched /* IRQ4 cut ! */ }, /* DL$02 */ { AT_SDLC, "SDLC1",(IO_ADDRESS)0x380, 0, 1, 0, 0, 1 /*AddrSpace*/, 0 /*BusNumber*/, 3,3,FALSE,Latched, 4,4,FALSE,Latched }, /* DL$03 */ { AT_MPCA1,"MPCA1",(IO_ADDRESS)0x380, 0, 1, (IO_ADDRESS) 0x3AF, 0x0A, 1 /*AddrSpace*/, 0 /*BusNumber*/, 4,4,FALSE,Latched, /* 0x0A => IRQ4, DMA chan 1 */ 0, 0,FALSE,Latched }, /* DL$04 */ { AT_MPCA2,"MPCA2",(IO_ADDRESS)0x3a0, 0, 0, (IO_ADDRESS) 0x38F, 0x09, 1 /*AddrSpace*/, 0 /*BusNumber*/, 3,3,FALSE,Latched, /* 0x09 => IRQ3, no DMA */ 0, 0,FALSE,Latched }, /* DL$05 */ { AT_MPAA1,"MPAA1",(IO_ADDRESS)0x380, POS_IDMPAA1, 1, 0, 0, 1 /*AddrSpace*/, 0 /*BusNumber*/, 3,3,TRUE,LevelSensitive, 0, 0,TRUE,LevelSensitive }, /* DL$06 */ { AT_MPAA2,"MPAA2",(IO_ADDRESS)0x3A0, POS_IDMPAA2, 7, 0, 0, 1 /*AddrSpace*/, 0 /*BusNumber*/, 4,4,TRUE,LevelSensitive, 0, 0,TRUE,LevelSensitive }, }; /*****************************************************************************/ /* Dummy Interface Record for use until the real one comes along, or once */ /* the real one goes away - so we can do initialisation and wrap up without */ /* worrying about generating events for anon-existent IR. */ /*****************************************************************************/ IR InitIR = {0};