Trailing-Edge
-
PDP-10 Archives
-
BB-M081Z-SM
-
monitor-sources/phymsc.mac
There are 20 other files named phymsc.mac in the archive. Click here to see a list.
; Edit= 9014 to PHYMSC.MAC on 8-Nov-88 by LOMARTIRE
;Merge Production changes to BUG text
; Edit= 8913 to PHYMSC.MAC on 17-Aug-88 by GSCOTT
;Update BUG. documentation.
; Edit= 8832 to PHYMSC.MAC on 20-Apr-88 by RASPUZZI (TCO 7.1276)
;Install TCO 7.1276 into the autopatch sources.
;TCO 7.1276 - TCO 7.1268 causes bad side effects. It was an attempt at making
; life easier in the login structures lane. Instead of using US.UNA
; for a dual purpose, us a new bit U1.NOL.
; UPD ID= 8694, RIP:<7.MONITOR>PHYMSC.MAC.6, 7-Apr-88 15:13:44 by RASPUZZI
;TCO 7.1268 - Set US.UNA during UDB creation. ONLINE will clear it.
; UPD ID= 8589, RIP:<7.MONITOR>PHYMSC.MAC.5, 11-Feb-88 16:55:56 by GSCOTT
;TCO 7.1218 - Update copyright date.
; UPD ID= 8436, RIP:<7.MONITOR>PHYMSC.MAC.4, 4-Feb-88 15:42:34 by GSCOTT
;TCO 7.1210 - Set MSCAOL, MSCAVA, MSCBPK, MSCCDF, MSCCWM, MSCDSR, MSCDWM,
; MSCN2S, MSCNUF, MSCOLE, MSCOLF, MSCORO, MSCPTG, MSCREJ, MSCRLD, MSCTMU, and
; MSCUKD normally not dumpable. Generate table of contents.
; UPD ID= 8362, RIP:<7.MONITOR>PHYMSC.MAC.3, 21-Jan-88 14:47:28 by MCCOLLUM
;TCO 7.1193 - Hide MSCCDF under CIBUGX.
; *** Edit 7465 to PHYMSC.MAC by LILJA on 29-Apr-87, for SPR #21422
; Check the status of write locked drive in MSCCHK. If a write locked drive
; becomes write enabled clear US.WLK in the UDB and if necessary bring the
; drive online.
; *** Edit 7233 to PHYMSC.MAC by GRANT on 24-Jan-86
; Prevent a cause of FSICFS BUGHLTs by better processing of the online end
; message at MSCI1A. Make sure the command succeeded before setting the DSN.
; *** Edit 7211 to PHYMSC.MAC by GRANT on 18-Dec-85
; Add CI counters for WATCH
; *** Edit 7191 to PHYMSC.MAC by GRANT on 12-Nov-85
; Eliminate MSCREJ BUGINF unless in debugging mode
; UPD ID= 2286, SNARK:<6.1.MONITOR>PHYMSC.MAC.197, 28-Jun-85 11:17:41 by MCCOLLUM
;Change MSCREJ to a BUGINF.
; UPD ID= 2257, SNARK:<6.1.MONITOR>PHYMSC.MAC.196, 21-Jun-85 11:12:56 by MCCOLLUM
;TCO 6.1.1238 - Fix more BUG. documentation
; UPD ID= 2225, SNARK:<6.1.MONITOR>PHYMSC.MAC.195, 17-Jun-85 11:43:27 by TBOYLE
;document BUGHLT at DONE3
; UPD ID= 2160, SNARK:<6.1.MONITOR>PHYMSC.MAC.194, 5-Jun-85 10:41:28 by MCCOLLUM
;TCO 6.1.1406 - Update copyright notice.
; UPD ID= 2022, SNARK:<6.1.MONITOR>PHYMSC.MAC.193, 28-May-85 12:11:59 by MCCOLLUM
;TCO 6.1.1238 - Fix more BUG. documentation
; UPD ID= 2003, SNARK:<6.1.MONITOR>PHYMSC.MAC.192, 24-May-85 12:01:25 by MCCOLLUM
;Fix up MSCDSR BUG.
; UPD ID= 1923, SNARK:<6.1.MONITOR>PHYMSC.MAC.191, 7-May-85 21:25:38 by MCCOLLUM
;TCO 6.1.1238 - Fix more BUG. documentation
; UPD ID= 1854, SNARK:<6.1.MONITOR>PHYMSC.MAC.190, 30-Apr-85 15:06:01 by MCCOLLUM
;TCO 6.1.1238 - Fix more BUG. documentation
; UPD ID= 1795, SNARK:<6.1.MONITOR>PHYMSC.MAC.189, 23-Apr-85 13:19:31 by MCCOLLUM
;TCO 6.1.1238 - Fix more BUG. documentation
; UPD ID= 1764, SNARK:<6.1.MONITOR>PHYMSC.MAC.188, 17-Apr-85 17:26:57 by GRANT
;TCO 6.1.1330 - Connect to software types, not hardware
; UPD ID= 1746, SNARK:<6.1.MONITOR>PHYMSC.MAC.187, 9-Apr-85 15:59:29 by MCCOLLUM
;TCO 6.1.1238 - Fix BUG. documentation
; UPD ID= 1553, SNARK:<6.1.MONITOR>PHYMSC.MAC.186, 20-Feb-85 17:24:23 by GRANT
;TCO 6.1.1200 - In GETSER, call PHYSIO (routine SETDSN) to set the drive serial number
; UPD ID= 1516, SNARK:<6.1.MONITOR>PHYMSC.MAC.185, 13-Feb-85 12:58:51 by TBOYLE
;More TCO 6.1.1125 - Get drive serial number when disk comes online.
; UPD ID= 1489, SNARK:<6.1.MONITOR>PHYMSC.MAC.184, 8-Feb-85 08:28:51 by LOMARTIRE
;More TCO 6.1.1060 - Move CFHSC code here from PHYKLP
; Also, key off of open connection, not open VC for HSC existance.
; UPD ID= 1448, SNARK:<6.1.MONITOR>PHYMSC.MAC.183, 1-Feb-85 14:17:54 by LOMARTIRE
;Add new symbols to describe the priority used by SC.SMG
; UPD ID= 1296, SNARK:<6.1.MONITOR>PHYMSC.MAC.182, 9-Jan-85 14:19:27 by TBOYLE
;TCO 6.1.1120 - Turn off physical addressing bit for UDBPS1,UDBPS2.
; UPD ID= 1231, SNARK:<6.1.MONITOR>PHYMSC.MAC.181, 19-Dec-84 18:36:17 by GRANT
;TCO 6.1.1091 - Put MSCPTG and MSCAVA under CIBUGX switch
; UPD ID= 1056, SNARK:<6.1.MONITOR>PHYMSC.MAC.180, 13-Nov-84 09:05:23 by LOMARTIRE
;Use new sending priority symbols in SC.SMG calls.
; UPD ID= 4898, SNARK:<6.MONITOR>PHYMSC.MAC.178, 6-Oct-84 17:30:39 by MCLEAN
;TURN OFF TAPES AGAIN
; UPD ID= 4880, SNARK:<6.MONITOR>PHYMSC.MAC.177, 25-Sep-84 15:13:18 by MCLEAN
;TURN ON TAPES FOR NOW
; UPD ID= 4866, SNARK:<6.MONITOR>PHYMSC.MAC.176, 24-Sep-84 15:34:24 by MCLEAN
;FIX TAPE PROBLEM WITH OFFLINE
; UPD ID= 4825, SNARK:<6.MONITOR>PHYMSC.MAC.175, 17-Sep-84 10:43:32 by PURRETTA
;Update copyright notice
; UPD ID= 4775, SNARK:<6.MONITOR>PHYMSC.MAC.174, 29-Aug-84 22:09:53 by MCLEAN
;IMPROVE INFORMATION ON MSCAVA
; UPD ID= 4766, SNARK:<6.MONITOR>PHYMSC.MAC.173, 28-Aug-84 21:12:11 by MCLEAN
;PREVENT MSCI1A FROM GETTING MSCUDB ON ONLINE ERRORS
; UPD ID= 4726, SNARK:<6.MONITOR>PHYMSC.MAC.172, 21-Aug-84 20:33:32 by MCLEAN
;TW2PWP USED THE WRONG POINTER TO THE .SBQOR LIST
; UPD ID= 4725, SNARK:<6.MONITOR>PHYMSC.MAC.171, 21-Aug-84 20:08:08 by MCLEAN
;REMOVE SOME DEBUGGING CODE
; UPD ID= 4720, SNARK:<6.MONITOR>PHYMSC.MAC.170, 20-Aug-84 20:40:51 by MCLEAN
;MAKE A PI CHECK AT MSCRIO
; UPD ID= 4719, SNARK:<6.MONITOR>PHYMSC.MAC.169, 20-Aug-84 20:33:10 by MCLEAN
;MAKE CHECK FOR QOR TABLE CLOBBERED
; UPD ID= 4716, SNARK:<6.MONITOR>PHYMSC.MAC.168, 20-Aug-84 14:36:14 by MCLEAN
;ADD DEBUG CODE AT DONE3: AND GET IT RIGHT...
; UPD ID= 4713, SNARK:<6.MONITOR>PHYMSC.MAC.165, 20-Aug-84 14:25:57 by MCLEAN
;BUILD BHD FOR NON-DATA OP'S CAUSE OF CONFLICT WITH QOR'S
; UPD ID= 4683, SNARK:<6.MONITOR>PHYMSC.MAC.164, 13-Aug-84 22:56:24 by MCLEAN
;ADD MSCGON
; UPD ID= 4648, SNARK:<6.MONITOR>PHYMSC.MAC.163, 7-Aug-84 10:22:40 by LOMARTIRE
;FIX HANDLING OF .SSPBC CALLBACK SINCE NOW WE CAN GET AN EXTRA ONE.
; UPD ID= 4585, SNARK:<6.MONITOR>PHYMSC.MAC.162, 24-Jul-84 22:30:03 by MCLEAN
;MAKE BLDUDB BE OFFLINE
; UPD ID= 4497, SNARK:<6.MONITOR>PHYMSC.MAC.161, 12-Jul-84 19:54:03 by LOMARTIRE
;REWORK CALLBACK HANDLING. REPLACE .SSCBD WITH .SSDDG (DROPPED DATAGRAM)
;CODE FOR AC CHANGE IN .SSDGR/.SSMGR CALLBACK. REMOVE .SSMNT AND .SSNWO.
; UPD ID= 4437, SNARK:<6.MONITOR>PHYMSC.MAC.160, 5-Jul-84 11:27:25 by PURRETTA
;Missing open braket at MSCINA
; UPD ID= 4431, SNARK:<6.MONITOR>PHYMSC.MAC.159, 4-Jul-84 22:16:21 by MCLEAN
;MAKE CHANGES FOR NEW HOME BLOCK READING
; UPD ID= 4424, SNARK:<6.MONITOR>PHYMSC.MAC.158, 3-Jul-84 14:26:41 by LOMARTIRE
;FIX REFERENCES TO REMOVED DEFSTR CBPTSB.
;MAKE CALL TO SC.RCD PASS IN THE ADDRESS OF THE ARGUMENT BLOCK.
;OBTAIN BLOCK FROM FREE SPACE SINCE SC.RCD NO LONGER DOES SO.
; UPD ID= 4378, SNARK:<6.MONITOR>PHYMSC.MAC.157, 22-Jun-84 17:09:03 by MCLEAN
;MAKE MORE HIGH DENSITY FIXES
; UPD ID= 4354, SNARK:<6.MONITOR>PHYMSC.MAC.156, 18-Jun-84 09:59:36 by MCLEAN
;FIX STATUS RESTORE
; UPD ID= 4352, SNARK:<6.MONITOR>PHYMSC.MAC.155, 15-Jun-84 16:43:46 by MCLEAN
;ADD CODE FOR DUMMY BSD IF THERE IS AN ODD WORD TRANSFER IN HD MODE
; UPD ID= 4349, SNARK:<6.MONITOR>PHYMSC.MAC.154, 15-Jun-84 16:29:40 by MCLEAN
;FIX BOT PROBLEMS AND REMOVE (COMMENT OUT TEMP HSC FIX CODE FOR ONLINE)
; UPD ID= 4332, SNARK:<6.MONITOR>PHYMSC.MAC.153, 13-Jun-84 21:24:01 by MCLEAN
;ADD CODE FOR PHYSICAL ADDRESSING
; UPD ID= 4327, SNARK:<6.MONITOR>PHYMSC.MAC.152, 12-Jun-84 21:13:37 by MCLEAN
;FIX HIGH DENSITY MODTBL ENTRY TO BE 9 NOT 1
; UPD ID= 4323, SNARK:<6.MONITOR>PHYMSC.MAC.151, 12-Jun-84 12:01:36 by MCLEAN
;FIX POLLER NOT TO TRY TO ONLINE THREE PORTED DISKS
; UPD ID= 4311, SNARK:<6.MONITOR>PHYMSC.MAC.150, 8-Jun-84 14:38:02 by MCLEAN
;FIX SOME = THAT SHOULD BE ==
; UPD ID= 4303, SNARK:<6.MONITOR>PHYMSC.MAC.149, 6-Jun-84 12:23:16 by MCLEAN
;FIX LOOP PROBLEM AT POLLER
; UPD ID= 4281, SNARK:<6.MONITOR>PHYMSC.MAC.148, 1-Jun-84 12:20:22 by LOMARTIRE
;VARIOUS CHANGES FOR SBI TO NODE NUMBER CONVERSION
; UPD ID= 4277, SNARK:<6.MONITOR>PHYMSC.MAC.147, 31-May-84 22:15:31 by MCLEAN
;FIX TAPE FORMAT CHECK
; UPD ID= 4261, SNARK:<6.MONITOR>PHYMSC.MAC.146, 30-May-84 16:53:08 by MCLEAN
;MESSED UP COUNT FOR NON-HIGH DENSITY STUFF
; UPD ID= 4240, SNARK:<6.MONITOR>PHYMSC.MAC.145, 24-May-84 22:06:58 by MCLEAN
;TEMP FIX TO TRY AND ELIMINATE MSCIBG
; UPD ID= 4212, SNARK:<6.MONITOR>PHYMSC.MAC.144, 11-May-84 17:48:00 by MCLEAN
;ADD A CHECK TO REFUSE TO START I/O BEFORE HOMEBLOCK CHECK
; UPD ID= 4196, SNARK:<6.MONITOR>PHYMSC.MAC.143, 9-May-84 13:17:30 by LOMARTIRE
;REPLACE .RJNOM WITH .CMCNM
; UPD ID= 4188, SNARK:<6.MONITOR>PHYMSC.MAC.142, 8-May-84 16:41:51 by MCLEAN
;SOME TAPE FIXES FOR EOT
; UPD ID= 4166, SNARK:<6.MONITOR>PHYMSC.MAC.141, 1-May-84 14:49:42 by MCLEAN
;TPD FIX AT MSSONL
; UPD ID= 4162, SNARK:<6.MONITOR>PHYMSC.MAC.140, 1-May-84 13:37:25 by MCLEAN
;LEFT IORBS ON PWQ WHEN SWITCHING UNITS
; UPD ID= 4158, SNARK:<6.MONITOR>PHYMSC.MAC.139, 30-Apr-84 21:21:56 by MCLEAN
;FIX DONET FOR EOT AND MAKE IT GO TO DONE NOT DONE1
; UPD ID= 4144, SNARK:<6.MONITOR>PHYMSC.MAC.138, 25-Apr-84 21:29:59 by MCLEAN
;CHANGE THE WAY RE-QUEUE WORKS
; UPD ID= 4101, SNARK:<6.MONITOR>PHYMSC.MAC.136, 18-Apr-84 19:36:54 by MCLEAN
;MAJOR CHANGES TO ADD TAPES AND FIX A FEW REGISTER SAVES
; UPD ID= 4010, SNARK:<6.MONITOR>PHYMSC.MAC.133, 30-Mar-84 16:45:27 by MCLEAN
;OFFLINE 16 BIT DISKS WITH US.UNA
; UPD ID= 4005, SNARK:<6.MONITOR>PHYMSC.MAC.132, 28-Mar-84 20:59:37 by MCLEAN
;HOME BLOCK CHECK WRONG AT MSCI17
; UPD ID= 3989, SNARK:<6.MONITOR>PHYMSC.MAC.131, 27-Mar-84 21:36:14 by MCLEAN
;ADD BH.PRE (PRESERVE VALID BIT).
; UPD ID= 3975, SNARK:<6.MONITOR>PHYMSC.MAC.130, 26-Mar-84 10:27:01 by HALL
;Fix previous edit so that tables are parallel
; UPD ID= 3968, SNARK:<6.MONITOR>PHYMSC.MAC.129, 23-Mar-84 22:09:26 by MCLEAN
;TAPE FIXES AND OFLINE FIX FOR MISSING BUFFER
; UPD ID= 3958, SNARK:<6.MONITOR>PHYMSC.MAC.128, 21-Mar-84 21:50:47 by MCLEAN
;ADD UPDATES FOR TAPE AND CHANGES FOUND IN CX
; UPD ID= 3927, SNARK:<6.MONITOR>PHYMSC.MAC.127, 14-Mar-84 13:24:53 by LOMARTIRE
;USE MSCOLD INSTEAD OF MSCCID FOR CALLS TO SC.NOD WHEN MSCCID IS INVALID
; UPD ID= 3884, SNARK:<6.MONITOR>PHYMSC.MAC.126, 9-Mar-84 15:18:00 by MCLEAN
;MAKE HSC50 DISCONNECTS RETRY
; UPD ID= 3881, SNARK:<6.MONITOR>PHYMSC.MAC.125, 7-Mar-84 22:26:15 by MCLEAN
;BUG AT MSCC44-5. CAN'T SET STATUS AFTER GCS
; UPD ID= 3853, SNARK:<6.MONITOR>PHYMSC.MAC.124, 5-Mar-84 13:34:40 by LOMARTIRE
;Add node number and connect ID to certain BUGxxx occurrences
;Change all BUGxxx names to MSCnnn
; UPD ID= 3844, SNARK:<6.MONITOR>PHYMSC.MAC.123, 4-Mar-84 17:06:57 by MCLEAN
;ADD CODE TO SUPPORT UNIT 0
; UPD ID= 3841, SNARK:<6.MONITOR>PHYMSC.MAC.122, 2-Mar-84 22:59:11 by MCLEAN
;ALSO OTHER CLEANUPS
;HANDLE WRITE LOCK THAT OCCURS DURING WRITE
; UPD ID= 3838, SNARK:<6.MONITOR>PHYMSC.MAC.121, 2-Mar-84 15:50:03 by MCLEAN
;REMOVE KDB DISP 14 MSCCHK IS CALLED BY SCHEDULER
; UPD ID= 3743, SNARK:<6.MONITOR>PHYMSC.MAC.120, 23-Feb-84 16:38:04 by MCLEAN
;FIX FLGHOM TO USE SAVEAC TO SAVE P2 INSTEAD OF Q3
; UPD ID= 3712, SNARK:<6.MONITOR>PHYMSC.MAC.119, 21-Feb-84 12:59:14 by CDUNN
;Change process names to use a 16 byte 8 bit ASCII string. Also change calls
;to SC.CON to pass the address of the string, not a byte pointer.
; UPD ID= 3670, SNARK:<6.MONITOR>PHYMSC.MAC.118, 8-Feb-84 10:09:26 by MILLER
;Set US.2PT for all CI disks
; UPD ID= 3643, SNARK:<6.MONITOR>PHYMSC.MAC.117, 2-Feb-84 11:58:57 by MCLEAN
;REMOVE CODE AT TW2PMS SINCE IT GOT THE STRUCTURE NUMBER CONFUSED.
; UPD ID= 3629, SNARK:<6.MONITOR>PHYMSC.MAC.116, 1-Feb-84 21:24:35 by MCLEAN
;GENERAL CLEANUP
; UPD ID= 3571, SNARK:<6.MONITOR>PHYMSC.MAC.115, 28-Jan-84 01:03:28 by MCLEAN
;STRUCTURE MACROS FROM SCAPAR ADDED
; UPD ID= 3548, SNARK:<6.MONITOR>PHYMSC.MAC.114, 25-Jan-84 23:15:15 by MCLEAN
;ADD A DISCONNECT SCAMPI RETURN JUST IN CASE....
; UPD ID= 3513, SNARK:<6.MONITOR>PHYMSC.MAC.113, 23-Jan-84 11:47:06 by MCLEAN
;CHECK FOR ILLEGAL NODE NUMBER IN MSCOUN
; UPD ID= 3507, SNARK:<6.MONITOR>PHYMSC.MAC.112, 22-Jan-84 19:00:35 by MCLEAN
;TYPO IN NODBYE
; UPD ID= 3506, SNARK:<6.MONITOR>PHYMSC.MAC.111, 22-Jan-84 16:26:29 by MCLEAN
;MANY UPDATES PER REVIEW
; UPD ID= 3461, SNARK:<6.MONITOR>PHYMSC.MAC.110, 16-Jan-84 11:37:52 by MCLEAN
;ADD MAXUNN
; UPD ID= 3454, SNARK:<6.MONITOR>PHYMSC.MAC.109, 13-Jan-84 16:06:54 by MCLEAN
;GAVE BUFFER BACK AND THEN USED IT.....
; UPD ID= 3438, SNARK:<6.MONITOR>PHYMSC.MAC.108, 11-Jan-84 22:22:19 by MCLEAN
;TAPE AND OTHER CLEANUPS
; UPD ID= 3437, SNARK:<6.MONITOR>PHYMSC.MAC.107, 11-Jan-84 16:58:13 by MCLEAN
;MSCTMO WAS BROKEN ALSO TAPE CLEANUPS
; UPD ID= 3425, SNARK:<6.MONITOR>PHYMSC.MAC.106, 8-Jan-84 20:20:31 by MCLEAN
;A FEW RANDOM CLEANUPS
; UPD ID= 3424, SNARK:<6.MONITOR>PHYMSC.MAC.105, 8-Jan-84 17:13:38 by MCLEAN
;ADD CHECK FOR MISSING CONNECT RESPONSE AND WAIT CHECKS FOR IT.
; UPD ID= 3414, SNARK:<6.MONITOR>PHYMSC.MAC.104, 6-Jan-84 05:58:37 by GRANT
;Remove MSONOD BUGINF
; UPD ID= 3410, SNARK:<6.MONITOR>PHYMSC.MAC.103, 6-Jan-84 00:45:20 by MCLEAN
;TAPE ONLY CHANGES
; UPD ID= 3406, SNARK:<6.MONITOR>PHYMSC.MAC.102, 3-Jan-84 20:58:45 by MCLEAN
;FIXES TO FNDSLT AND MSGAA FOR MULTPLE AVAILABLES/ONLINES
; UPD ID= 3390, SNARK:<6.MONITOR>PHYMSC.MAC.101, 29-Dec-83 23:43:35 by MCLEAN
;CHANGE JUMP TO MSCI23 BE MSCI18 WHICH MAY FIX SLTBSY BUGCHK
; UPD ID= 3389, SNARK:<6.MONITOR>PHYMSC.MAC.100, 29-Dec-83 23:18:01 by MCLEAN
;MAKE BUGXXX'S CORRECT TYPE
; UPD ID= 3388, SNARK:<6.MONITOR>PHYMSC.MAC.99, 29-Dec-83 16:34:52 by MCLEAN
;ALSO NEED TO CHECK BHD'S FOR COMPLETION CORRECTLY
;A FEW MORE POLLER CHECKS AND MAKE SENDPK RETURN
; UPD ID= 3368, SNARK:<6.MONITOR>PHYMSC.MAC.98, 26-Dec-83 14:12:26 by MCLEAN
;MORE EDITS TO MAKE POLLER WORK BETTER
; UPD ID= 3338, SNARK:<6.MONITOR>PHYMSC.MAC.97, 16-Dec-83 21:54:44 by MCLEAN
;FIX FNDSLT FOR SBI INDEX NOT NODE NUMBER
; UPD ID= 3336, SNARK:<6.MONITOR>PHYMSC.MAC.96, 16-Dec-83 20:56:06 by MCLEAN
;FIX SBI/NODE PROBLEMS AND OTHER RANDOM PROBLEMS.
; UPD ID= 3329, SNARK:<6.MONITOR>PHYMSC.MAC.95, 14-Dec-83 23:39:12 by MCLEAN
;CHANGE TW2PWQ TO MOVE ALL ENTRIES TO ONE PWQ
; UPD ID= 3292, SNARK:<6.MONITOR>PHYMSC.MAC.94, 11-Dec-83 20:36:52 by MCLEAN
;FIX DGREC FOR CORRECT DATA SIZE
; UPD ID= 3288, SNARK:<6.MONITOR>PHYMSC.MAC.93, 11-Dec-83 20:20:20 by GRANT
;In MSCRIO, use new symbol VC.OPN
; UPD ID= 3286, SNARK:<6.MONITOR>PHYMSC.MAC.92, 11-Dec-83 17:26:59 by MCLEAN
;FIX TW2PW5 TO SEARCH QOR'S CORRECTLY ALSO REMOVE US.2PT
;POLLER FIXES TO MAKE TIMEOUT FOR INDIVIDUAL HSC50'S.
; UPD ID= 3284, SNARK:<6.MONITOR>PHYMSC.MAC.91, 9-Dec-83 23:09:57 by MCLEAN
;MAKE INACTIVE WHEN OFFLINE
; UPD ID= 3277, SNARK:<6.MONITOR>PHYMSC.MAC.90, 7-Dec-83 18:10:50 by MCLEAN
;CAUSE TW2PWQ TO SAVE P'S
; UPD ID= 3275, SNARK:<6.MONITOR>PHYMSC.MAC.89, 7-Dec-83 15:21:29 by MCLEAN
;WORK ON GETTING SWITCHING UNITS RIGHT
; UPD ID= 3237, SNARK:<6.MONITOR>PHYMSC.MAC.88, 30-Nov-83 19:46:35 by MCLEAN
;MORE FIXES AND CHANGES FOR BATBLOCKS
; UPD ID= 3216, SNARK:<6.MONITOR>PHYMSC.MAC.87, 27-Nov-83 21:47:56 by MCLEAN
;FOUND EXTRANEOUS ENDSV.
; UPD ID= 3215, SNARK:<6.MONITOR>PHYMSC.MAC.86, 27-Nov-83 21:44:15 by MCLEAN
;USE SCAMPI FOR RESET AND START FUNCTIONS
; UPD ID= 3213, SNARK:<6.MONITOR>PHYMSC.MAC.85, 26-Nov-83 21:33:57 by MCLEAN
;GENERAL CLEANUP/RE-ARRANGEMENT ALSO FIX IT SO BHD IS NOT EXPECTED IN END
;PACKET
; UPD ID= 3212, SNARK:<6.MONITOR>PHYMSC.MAC.84, 23-Nov-83 18:33:51 by MCLEAN
;MANY STARTUP CHANGES
; UPD ID= 3205, SNARK:<6.MONITOR>PHYMSC.MAC.83, 20-Nov-83 19:21:40 by MCLEAN
;REMOVE TIMEOUT BY HSC CAUSE JUDY DOESN'T LIKE IT
; UPD ID= 3203, SNARK:<6.MONITOR>PHYMSC.MAC.82, 20-Nov-83 16:22:17 by MCLEAN
;MORE CHANGES TO ONLINE STUFF
; UPD ID= 3201, SNARK:<6.MONITOR>PHYMSC.MAC.81, 19-Nov-83 20:40:28 by MCLEAN
;TYPO IN .RJNOM AC
; UPD ID= 3200, SNARK:<6.MONITOR>PHYMSC.MAC.80, 19-Nov-83 17:28:07 by MCLEAN
;MANY RANDOM FIXES FOR RELIABILITY
;REMOVE BROKEN DEBUG STUFF.
; UPD ID= 3190, SNARK:<6.MONITOR>PHYMSC.MAC.79, 17-Nov-83 17:25:42 by MCLEAN
;CHANGE CMDJMP TABLE SO ENTRY 0 IS UNUSED
; UPD ID= 3189, SNARK:<6.MONITOR>PHYMSC.MAC.78, 17-Nov-83 16:23:21 by CDUNN
;More TCO 6.1127 - Make SC.SMG calls conform to new calling sequence
; UPD ID= 3139, SNARK:<6.MONITOR>PHYMSC.MAC.77, 11-Nov-83 16:19:54 by MCLEAN
;TEMP MAKE TABLES BIGGER
; UPD ID= 3113, SNARK:<6.MONITOR>PHYMSC.MAC.76, 7-Nov-83 21:40:25 by MCLEAN
;ADD PORT RELEASE DISPATCH
; UPD ID= 3106, SNARK:<6.MONITOR>PHYMSC.MAC.75, 7-Nov-83 21:18:15 by MCLEAN
;MAKE SERIAL NUMBER RIGHT JUSTIFIED
; UPD ID= 3092, SNARK:<6.MONITOR>PHYMSC.MAC.72, 2-Nov-83 04:34:44 by GRANT
;In MSCCHK, remove DGPOLL check; MSCP no longer knows about KLIPA polling
; UPD ID= 3075, SNARK:<6.MONITOR>PHYMSC.MAC.71, 25-Oct-83 13:05:37 by GRANT
;Change MSCDSP. Remove CHNDSP. Move MSCCCW and MSCCCA to PHYKLP.
;MSCCHK now called from scheduler clock. MSCCHK no longer calls KLPCHK.
; UPD ID= 3036, SNARK:<6.MONITOR>PHYMSC.MAC.70, 17-Oct-83 11:01:44 by TGRADY
; TCO 6.1829 - In MSCI1A use UNTYPE to check for valid unit type
; TCO 6.1830 - In CNRAVL check for valid Connect Id for BADCID BUGHLT
; UPD ID= 3025, SNARK:<6.MONITOR>PHYMSC.MAC.69, 10-Oct-83 22:34:43 by MCLEAN
;MISSING >
; UPD ID= 3024, SNARK:<6.MONITOR>PHYMSC.MAC.68, 10-Oct-83 22:29:24 by MCLEAN
;GENERAL CLEANUP OF JUNK
; UPD ID= 3015, SNARK:<6.MONITOR>PHYMSC.MAC.67, 8-Oct-83 23:05:43 by MCLEAN
;TYPO IN PREVIOUS EDIT
; UPD ID= 3014, SNARK:<6.MONITOR>PHYMSC.MAC.66, 8-Oct-83 22:27:30 by MCLEAN
;TCO 6.1822 DON'T LOOSE Q2 IN BLDUDB
; UPD ID= 2974, SNARK:<6.MONITOR>PHYMSC.MAC.65, 3-Oct-83 11:15:33 by MCLEAN
;SET US.2PT FOR MSCP DISKS
; UPD ID= 2963, SNARK:<6.MONITOR>PHYMSC.MAC.64, 30-Sep-83 16:07:18 by MCLEAN
;FIX CRNREJ TYPO IN MESSAGE
; UPD ID= 2937, SNARK:<6.MONITOR>PHYMSC.MAC.63, 27-Sep-83 09:44:51 by GRANT
;Change PPDINT, PPDZAP, and PPDCHK to KLPINT, KLPZAP, and KLPCHK, respectively.
; UPD ID= 2856, SNARK:<6.MONITOR>PHYMSC.MAC.62, 22-Aug-83 15:43:45 by MCLEAN
;NEED REFERENCES TO CI%PAK TO GET ERROR REPORT CORRECT.
; UPD ID= 2853, SNARK:<6.MONITOR>PHYMSC.MAC.61, 19-Aug-83 14:32:16 by MURPHY
;Reformat to TOPS20 conventions.
; UPD ID= 2821, SNARK:<6.MONITOR>PHYMSC.MAC.59, 9-Aug-83 15:31:58 by PURRETTA
;Remove crlf in middle of MSCILF bugchk description.
; UPD ID= 2714, SNARK:<6.MONITOR>PHYMSC.MAC.58, 21-Jul-83 15:54:01 by MCLEAN
;MISSING < IN SENDPK
; UPD ID= 2709, SNARK:<6.MONITOR>PHYMSC.MAC.57, 19-Jul-83 21:20:43 by MCLEAN
;SOME RELIABILITY EDITS AND A TXNN TO TDNN AT FNDSLT+5
; UPD ID= 2695, SNARK:<6.MONITOR>PHYMSC.MAC.56, 12-Jul-83 23:41:32 by MCLEAN
;A FEW MORE COMMENTS...
; UPD ID= 2692, SNARK:<6.MONITOR>PHYMSC.MAC.55, 11-Jul-83 15:30:11 by MCLEAN
;MAKE AOJA AT MSCCH3+ A FEW GO TO MSCCH3 NOT TO MSCCH3A
; UPD ID= 2691, SNARK:<6.MONITOR>PHYMSC.MAC.54, 11-Jul-83 15:05:47 by MCLEAN
;ONLCK1 DID NOT SETUP Q1 FOR MSGAV3
; UPD ID= 2687, SNARK:<6.MONITOR>PHYMSC.MAC.53, 10-Jul-83 22:19:35 by MCLEAN
;FIX CALLS TO PBRCOA SO THEY HAVE THE CORRECT INFORMATION AND
;FIX PBRCOA SO IT CALL FNDNDX
; UPD ID= 2660, SNARK:<6.MONITOR>PHYMSC.MAC.52, 3-Jul-83 20:54:37 by MCLEAN
;NEED EITHER IS.DTE OR IS.DVE TO GET I/O REQUEST TO FAIL...
;THERE MSCIS9 WOULD NOT SEE DATA ERRORS.
; UPD ID= 2658, SNARK:<6.MONITOR>PHYMSC.MAC.51, 3-Jul-83 20:32:37 by MCLEAN
;ERROR LOGGING NEEDS IS.DTE TO DO BAT BLOCK LOGIC.
; UPD ID= 2657, SNARK:<6.MONITOR>PHYMSC.MAC.50, 3-Jul-83 00:44:45 by MCLEAN
;EDIT DIDN'T MAKE IT.... TRY AGAIN
; UPD ID= 2655, SNARK:<6.MONITOR>PHYMSC.MAC.48, 2-Jul-83 10:35:23 by MCLEAN
;A LITTLE MORE INFORMATION AT PKSNFL BUGCHK
; UPD ID= 2653, SNARK:<6.MONITOR>PHYMSC.MAC.47, 1-Jul-83 17:15:04 by MCLEAN
;PKSNFL BUGCHK OCCURS MORE OFTEN THAN NECESSARY
; UPD ID= 2649, SNARK:<6.MONITOR>PHYMSC.MAC.46, 30-Jun-83 23:30:11 by MCLEAN
;MORE PARANOIA AND COMMENTS
; UPD ID= 2647, SNARK:<6.MONITOR>PHYMSC.MAC.45, 29-Jun-83 21:17:24 by MCLEAN
;ADD MORE COMMENTS. DON'T WORRY MORE TO COME ALSO
; UPD ID= 2646, SNARK:<6.MONITOR>PHYMSC.MAC.44, 29-Jun-83 16:02:06 by MCLEAN
;A LOT OF COMMENTS AND SOME STATE INFORMATION.
; UPD ID= 2645, SNARK:<6.MONITOR>PHYMSC.MAC.43, 28-Jun-83 20:34:37 by MCLEAN
;ALU GOT IT WRONG THE FIRST TRY...... SO WE WILL TRY AGAIN.
;MASSIVE EDITS TO ADD TIMEOUT CODE AND TIMESHARING BUGCHECKS TO
;HELP FIND OUT WHAT THE STATUS OF THE DISK SUBSYSTEM WHEN SOMETHING
;UNUSUAL HAPPENS
;TCO 6.1703 CHANGE SAVEAC (Q1) TO SAVEAC <Q1>.
; UPD ID= 2575, SNARK:<6.MONITOR>PHYMSC.MAC.42, 8-Jun-83 18:01:32 by MOSER
; UPD ID= 2573, SNARK:<6.MONITOR>PHYMSC.MAC.40, 8-Jun-83 16:07:24 by MOSER
;TCO 6.1674 - REMOVE INIT DEPENDENT CODE
; UPD ID= 2567, SNARK:<6.MONITOR>PHYMSC.MAC.39, 7-Jun-83 22:10:34 by MCLEAN
;MORE BUGINFS AND A FIX FOR MISSING POP
; UPD ID= 2566, SNARK:<6.MONITOR>PHYMSC.MAC.38, 7-Jun-83 20:58:48 by MCLEAN
;ADD A LOT MORE BUGINF'S TO SEE WHAT IS GOING ON.
; UPD ID= 2537, SNARK:<6.MONITOR>PHYMSC.MAC.37, 27-May-83 15:08:57 by MCLEAN
;MORE TCO 6.1669 GET SETZM RIGHT
; UPD ID= 2536, SNARK:<6.MONITOR>PHYMSC.MAC.36, 26-May-83 21:48:26 by MCLEAN
;MORE TCO 6.1665 MISSED ONE CLEAR OF THE SERIAL NUMBER
; UPD ID= 2535, SNARK:<6.MONITOR>PHYMSC.MAC.35, 26-May-83 21:44:12 by MCLEAN
;ZERO OUT KDBIAC WHEN NOBODY IS WAITING
; UPD ID= 2534, SNARK:<6.MONITOR>PHYMSC.MAC.34, 26-May-83 19:37:54 by MCLEAN
;TCO 6.1669 ADD A (P2) AT RESTAC:
; UPD ID= 2513, SNARK:<6.MONITOR>PHYMSC.MAC.33, 24-May-83 20:43:02 by MCLEAN
;TCO 6.1665 ADD SECOND WORD TO SERIAL NUMBER CODE.
; UPD ID= 2504, SNARK:<6.MONITOR>PHYMSC.MAC.32, 23-May-83 15:18:10 by MOSER
; UPD ID= 2503, SNARK:<6.MONITOR>PHYMSC.MAC.31, 23-May-83 14:53:21 by MOSER
;TCO 6.1562 USE MSCPAR FOR SYMBOLS
; UPD ID= 2495, SNARK:<6.MONITOR>PHYMSC.MAC.30, 20-May-83 16:21:39 by MCLEAN
;TCO 6.1127 MAKE MSCOUN RETURN +2 IF SUCCESS.....
; UPD ID= 2492, SNARK:<6.MONITOR>PHYMSC.MAC.29, 18-May-83 23:37:00 by MCLEAN
;TCO 1657 AND YET MORE BUGCHK'S
; UPD ID= 2485, SNARK:<6.MONITOR>PHYMSC.MAC.28, 17-May-83 23:53:20 by MCLEAN
;TCO 1657 ADD A FEW MORE BUGXXX'S
; UPD ID= 2484, SNARK:<6.MONITOR>PHYMSC.MAC.27, 17-May-83 22:30:13 by MCLEAN
;TCO 6.1127 (TONY LIKED THIS ONE)
; UPD ID= 2472, SNARK:<6.MONITOR>PHYMSC.MAC.26, 16-May-83 17:28:22 by MOSER
;MORE TCO 6.1562 - ALLOW UNIT NUMBER UP TO 3000 OCTAL IN MSCEXT
; UPD ID= 2465, SNARK:<6.MONITOR>PHYMSC.MAC.25, 15-May-83 21:53:09 by MCLEAN
;TCO 1657 REMOVE ##'S AND ADD A FEW BUGINF'S
; UPD ID= 2464, SNARK:<6.MONITOR>PHYMSC.MAC.24, 13-May-83 11:16:26 by WACHS
; UPD ID= 2463, SNARK:<6.MONITOR>PHYMSC.MAC.23, 13-May-83 06:10:10 by WACHS
;More TCO 6.1127 - Add MSCOUN to ONLINE a disk via DIAG JSYS
; UPD ID= 2432, SNARK:<6.MONITOR>PHYMSC.MAC.22, 6-May-83 06:30:52 by WACHS
;More TCO 6.1127 - Fix confusion with INIT
; UPD ID= 2430, SNARK:<6.MONITOR>PHYMSC.MAC.21, 5-May-83 21:05:56 by WACHS
;More TCO 6.1127 - problems with HSCs crashing
;More TCO 6.1127 - error recovery additions
; UPD ID= 2365, SNARK:<6.MONITOR>PHYMSC.MAC.19, 27-Apr-83 21:15:43 by CDUNN
;More TCO 6.1127 - Remove false CFSINI
; UPD ID= 2337, SNARK:<6.MONITOR>PHYMSC.MAC.18, 25-Apr-83 13:35:29 by MOSER
;TCO 6.1562 - ALLOW BIGGER UNIT NUMBER FOR MSCP DISKS
; UPD ID= 2329, SNARK:<6.MONITOR>PHYMSC.MAC.17, 22-Apr-83 04:32:22 by WACHS
;More TCO 6.1127 - error recovery additions
; UPD ID= 2305, SNARK:<6.MONITOR>PHYMSC.MAC.16, 19-Apr-83 08:50:47 by MCINTEE
;Still more TCO 6.1127 - put closing angle bracket in previous edit
; UPD ID= 2303, SNARK:<6.MONITOR>PHYMSC.MAC.15, 19-Apr-83 07:34:53 by WACHS
;More TCO 6.1127 - error recovery additions
; UPD ID= 2208, SNARK:<6.MONITOR>PHYMSC.MAC.14, 8-Apr-83 06:11:27 by WACHS
;More TCO 6.1127
; UPD ID= 2142, SNARK:<6.MONITOR>PHYMSC.MAC.13, 4-Apr-83 07:29:53 by WACHS
;TCO 6.1587 - change addressing of HSC disks to per-page
; UPD ID= 2019, SNARK:<6.MONITOR>PHYMSC.MAC.11, 18-Mar-83 07:03:17 by WACHS
;TCO 6.1541 - Move DMA stuff from PHYMSC to PHYKLP
; UPD ID= 1986, SNARK:<6.MONITOR>PHYMSC.MAC.7, 14-Mar-83 15:31:30 by CDUNN
;More TCO 6.1127 - Change DEBUG to MSCDBG and put MSCDBG in SYSFLG.MAC
; UPD ID= 1966, SNARK:<6.MONITOR>PHYMSC.MAC.6, 10-Mar-83 16:07:54 by CDUNN
;More TCO 6.1127 - Recover from errors rather than call MSCBUG and other
;random stability edits.
; COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1984, 1988.
; ALL RIGHTS RESERVED.
;
; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE
; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER
; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY
; TRANSFERRED.
;
; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE
; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
; CORPORATION.
;
; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
; SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.
SEARCH PROLOG,SERCOD ;SYSTEM PARAMETERS
TTITLE (PHYMSC,,< - MSCP DRIVER>)
SUBTTL T. WACHS 28-JAN-82 R.H. MCLEAN 7/83
SEARCH MSCPAR,PHYPAR,SCAPAR ;PHYSIO PARAMETERS
Subttl Table of Contents
; Table of Contents for PHYMSC
;
; Section Page
;
;
; 1. Start I/O . . . . . . . . . . . . . . . . . . . . . . 4
; 2. General Purpose Packet Routines . . . . . . . . . . . 13
; 3. Interrupt Service . . . . . . . . . . . . . . . . . . 15
; 4. Diag Online . . . . . . . . . . . . . . . . . . . . . 38
; 5. General Purpose Routines . . . . . . . . . . . . . . . 40
; 6. PHYSIO Interface . . . . . . . . . . . . . . . . . . . 46
; 7. Initialization . . . . . . . . . . . . . . . . . . . . 48
; 8. Init Assist Routines . . . . . . . . . . . . . . . . . 65
; 9. General Routines . . . . . . . . . . . . . . . . . . . 69
; 10. Periodic Check . . . . . . . . . . . . . . . . . . . . 75
; 11. CNFIG% JSYS Support
; 11.1 CFHSC (Return list of HSC node names) . . . . 83
; 12. Storage . . . . . . . . . . . . . . . . . . . . . . . 86
; 13. End of PHYMSC . . . . . . . . . . . . . . . . . . . . 90
;LOCAL BYTE POINTERS
DEFSTR PKYEST,P.STS,PKPEST,PKSEST ;END-PACKET STATUS
DEFSTR PKYQSB,P.STS,PKPESB,PKSESB ;END-PACKET STATUS SUB-CODE
DEFSTR PKYFCD,P.STS,PKPFCD,PKSFCD ;END-PACKET FLAGS
DEFSTR PKYECD,P.STS,PKPECD,PKSECD ;ENDCODE
;Note: These process names are required by SCA to be 16 byte 8 bit ASCII
;strings.
OURDNM: ASCI8 (<T-20$DISK >)
YURDNM: ASCI8 (<MSCP$DISK >)
OURTNM: ASCI8 (<T-20$TAPE >)
YURTNM: ASCI8 (<MSCP$TAPE >)
DEFSTR LOBYTE,,31,7
;CONTROLLER DISPATCH VECTOR FOR HSC-CONTROLLED DISKS
MSCDSP::JRST MSCRNG ;0 - INITIALIZATION
JRST MSCSIO ;1 - START I/O
JRST MSCRNG ;2 - HANDLE INTERRUPT
RETSKP ;3 - ERROR RECOVERY
RET ;4 - HUNG DEVICE (THE HSC MAY RETURN)
JRST MSCRNG ;5 - CONVERT BLK # TO CYLINDER/SURF-SEC
JRST MSCRNG ;6 - LATENCY COMPUTATION
JRST MSCRNG ;7 - START POSITIONING
JRST MSCRNG ;10 - ATTENTION INTERRUPT
JRST MSCRNG ;11 - SKIP IF POSITIONING REQUIREDD
JRST MSCRNG ;12 - STACK SECOND TRANSFER COMMAND
JRST MSCEXT ;13- CHECK EXISTANCE OF UNIT
JRST R ;14- CHECK FOR HALTED CONTROLLER
RET ;15 - PORT RELEASE
MSCRNG: BUG.(HLT,MSCBAD,PHYMSC,SOFT,<PHYMSC - Bad dispatch from PHYSIO>,,<
Cause: PHYSIO called PHYMSC at the MSCDSP controller dispatch vector to
perform a function that is illegal for MSCP devices. This is a
software problem.
>)
SUBTTL Start I/O
;MSCSIO:,MSCRIO:
;PHYSIO ENTERS AT MSCSIO TO START A DATA TRANSFER OR IN THE CASE OF
; A TAPE A POSITION FUNCTION.
;
;P1=CDB P2=KDB P3=UDB P4=IORB
;RETURN: +1 REQUEST FAILED.
; +2 SUCCESS THE REQUEST IS QUEUE'D OR STARTED.
MSCSIO: SAVEQ
STKVAR <MRW1,FMT,CNT,SIZ>
MSCRIO: MOVX T2,BS.HDM ;SET HIGH DENSITY AS DEFAULT
MOVEM T2,FMT
MOVEI T2,^D9 ;SET SIZE AT 9
MOVEM T2,CNT
LOAD T2,SBVCST,(P2) ;GET VC STATE
CAIN T2,VC.OPN ;IS IT OPEN?
SKIPGE Q1,UDBSTS(P3) ;DISK ONLINE?
RET ;NO. NO SENSE IN GOING FURTHER
TXNE Q1,US.CHB ;HOMEBLOCK CHECK?
CAMN P4,UDBCHB(P3) ;YES CHECK FOR SPECIAL IORB
SKIPA ;NEITHER ALL OK
RET ;CAN'T START THIS ONE
LDB T1,IRYFCN ;YES. GET FUNCTION FROM IORB
SKIPN Q3,MSCFCN(T1) ;YES, IS IT A DEFINED FUNCTION FOR AN MSCP SERVER?
JRST [BUG.(CHK,MSCILF,PHYMSC,SOFT,<PHYMSC - Illegal function at start IO>,<<T1,FCN>>,<
Cause: Illegal function at call to start IO on a MSCP device. The caller of
MSCRIO or MSCSIO has specified an function code that is not legal for
MSCP devices.
Action: If this BUGCHK is reproducable, set it dumpable, and send in an SPR
with the dump and how to reproduce the problem.
Data: FCN - The illegal function
>)
RET]
SKIPL UDBSTR(P3) ;IS THE UNIT IN A STR?
JRST MSCSI1 ;YES
HLRZ T1,UDBTWQ(P3) ;NO. GET END OF TWQ
HRRZ T2,UDBTWQ(P3) ;AND FRONT OF QUEUE
CAIE T1,(T2) ;THIS THE ONLY ENTRY IN THE QUEUE?
JRST QUEIRB ;NO. ONLY ALLOW 1 REQUEST TO BE OUTSTANDING
TXNN Q1,US.TAP ;CHECK FOR TAPES
JRST MSCSI1 ;NOT A TAPE NO DIFFERENT FORMAT
LOAD T1,IRBDM,(P4) ;GET DENSITY
CAIG T1,5 ;LEGAL RANGE?
SKIPGE T2,MODTBL(T1) ;YES CHECK FOR LEGAL HERE TOO
JRST COMBAD ;BAD COMMAND
HRLZM T2,FMT ;SAVE FORMAT
HLRZM T2,SIZ ;SAVE SIZE
HRRZ T2,MTSZMT(T1) ;GET THE SIZE PER WORD
MOVEM T2,CNT ;SAVE THIS ALSO
MSCSI1: CALL GETBUF ;GET A PACKET BUFFER FROM SCA
JRST QUEPAK ;NONE AVAILABLE, TRY LATER
TXZE Q1,US.BOT ;CHECK FOR BOT
TXNN Q3,OP.DEN ;SET DENSITY?
TDZA P6,P6 ;READ OR NOT BOT THEREFORE NO SET OF DENSITY
JRST SETDEN ;SET DENSITY OF TAPE
MOVEM Q1,UDBSTS(P3) ;RESTORE UDB STATE WITHOUT BOT
HRRZ T1,Q3 ;OPCODE
TXNE Q3,OP.CHK ;VALIDITY CHECK AFTER OPERATION?
TXO T1,MD.CMP ;YES, LET THE HSC DO THE COMPARE
CAIN T1,OP.AVL ;CHECK FOR AVAILABLE
TXO T1,MD.UNL ;SET UNLOAD MODIFIER
TXNE Q3,OP.REV ;REVERSE DIRECTION (TAPE)?
TXO T1,MD.REV ;YES
TXNE Q3,OP.REW ;REWIND?
TXO T1,MD.RWD!MD.IMM ;YES AND SET IMMEDIATE MODE
TXNE Q1,US.TAP ;CHECK FOR TAPE
TXO T1,MD.CSE ;CLEAR SERIOUS EXCEPTION
CALL REVFUL ;REVERSE THE BYTES SO THE HSC WILL UNDERSTAND
MOVEM T1,P.OPCD(Q2) ;SAVE OPERATION
CALL GETBHD ;GET A BUFFER HEADER DESCRIPTOR
JRST RBFQUE ;NONE, QUEUE THE REQUEST
MOVE Q1,T2 ;Q1=BHD ADDRESS
SETZM .BHBSA(Q1) ;IN CASE WE HAVE TO RETURN THE BHD
MSCSI3: MOVEI T2,1B31
ADDB T2,CRFNUM ;UPDATE COMMAND REFERENCE NUMBER
TLZE T2,-1 ;MAKE SURE LH STAYS 0 (NON-0 IS A FLAG)
MOVEI T2,1B31 ;INSURE WE DON'T GET COMMAND REF OF 0
MOVEM T2,CRFNUM
HRRZS T3,T1 ;GET BDTTAB INDEX
LSH T3,-BHDSHF ;CONVERT TO "REAL" INDEX
IMULI T3,QORLEN ;COMPUTE INDEX INTO QOR TABLE
ADDI T3,QORTAB ;COMPUTE TABLE ADDRESS
MSCSI4: MOVEM T2,P.CRF(Q2) ;SAVE COMMAND REF NUMBER IN PACKET
MOVEM T2,QORCRF(T3) ;SAVE COMMAND REFERENCE NUMBER
MOVEM P4,QORIRB(T3) ;SAVE IORB ADDR
HRLM P3,QORUNI(T3) ;SAVE UDB ADDRESS IN QOR
LSH T1,^D35-BHPIDX ;POSITION INDEX
LSH T2,^D35-BHPKEY-4 ;POSITION IT IN KEY FIELD
TDO T1,T2 ;T1 = BUFFER NAME
MOVEM T1,QORBHD(T3) ;SAVE NAME IN THE BHD FOR ERROR RECOVERY
CALL SRVFUL ;REVERSE IT SO THE KLIPA WILL HANDLE IT RIGHT
MOVEM T1,P.BUFF+1(Q2) ;STORE IN MSCP PACKET
TXO T2,BH.VAL ;KEY + VALID
HLRZ T4,UDBKDB(P3) ;FIND THE INDEX
MOVE T4,CIDATA(T4)
TXNN T4,DT.KL ;IF KL WE DON'T NEED PRESERVE
TXO T2,BH.PRE ;SET PRESERVE
TXNE Q3,OP.RDB ;READ
TXO T2,BH.WRT ;WRITABLE
SKIPG Q3
MOVEM T2,.BHKEY(Q1) ;WHERE THE PORT WANTS TO SEE IT
HLRZ T1,.SBQOR(P2) ;END OF LIST
HRLM T1,QORLNK(T3) ;SAVE BACK-POINTER OF NEW END
HRRM T3,QORLNK(T1) ;SAVE FORWARD-POINTER OF PREVIOUS END
HRLM T3,.SBQOR(P2) ;SAVE END OF QUEUE POINTER IN HEAD
MOVEI T1,.SBQOR(P2) ;POINT FORWARD LINK OF THIS PACKET
HRRM T1,QORLNK(T3) ; BACK AT THE SYSTEM BLOCK
JUMPG Q3,MSCSI7 ;GO IF NON-DATA OPERATION
CALL PHYXFL ;T1=START OF IO LIST, T2=END
SETZM MRW1 ;INITIALIZE COUNT OF NIBBLES TO TRANSFER
MOVE T3,T1 ;START OF LIST
SUB T1,T2
HRL T3,T1 ;AOBJN WORD FOR CCWS
MOVEI T4,.BHBSA-.BSNXT(Q1)
MSCSI6: CALL GETBSD ;GET A BSD
JRST RBDQUE
MOVEM T1,.BSNXT(T4) ;POINT PREVIOUS BSD AT THIS ONE
MOVE T4,T1
LOAD T2,CHCNT,(T3) ;WORD COUNT
IMUL T2,CNT ;CONVERT TO NIBBLES (4 BITS)
ADDM T2,MRW1 ;ACCUMULATE
MOVEM T2,.BSLEN(T1) ;AND STORE IN BSD
SETZM .BSNXT(T1) ;ASSUME WE'RE AT THE END OF CCWS
LOAD T2,CHADR,(T3) ;GET PHYSICAL ADDRESS OF CCW
TDO T2,FMT ;DENSITY MODE
MOVEM T2,.BSADR(T1) ;SAVE WHERE PORT WANTS TO SEE IT
AOBJN T3,MSCSI6 ;LOOP FOR ALL CCWS
MOVE T1,MRW1 ;RESTORE TOTAL NIBBLE COUNT
MOVEM T1,.BHLEN(Q1) ;CONVERT IT FOR HSC - DIVIDE BY 2 TO GET BYTES,
TRZE T1,1 ;CHECK FOR AN EXTRA NIBBLE
JRST [ ADDI T1,2 ;ADD AN EXTRA NIBBLE IF THERE IS ONE
LSH T1,3 ;AND MAKE UP THE 32 BIT COUNT
CALL REVFUL ;REVERSE IT FOR THE HSC
MOVEM T1,P.BCNT(Q2) ;AND STORE IN THE PACKET
CALL GETBSD ;GET AN EXTRA BSD
JRST RBDQUE ;OOPS SORRY CAN'T DO THE XFER
MOVEM T1,.BSNXT(T4) ;STORE THE FORWARD POINTER
MOVEI T2,1 ;MAKE IT 1 NIBBLE LONG
MOVEM T2,.BSLEN(T1)
SETZM .BSNXT(T1) ;ZERO FORWARD POINTER
MAP T2,.BSLEN(T1) ;WHERE TO PUT THE EXTRA BYTE
TLZ T2,777760 ;MASK OFF THE JUNK BITS
TDO T2,FMT ;SET THE FORMAT
MOVEM T2,.BSADR(T1) ;STORE THE ADDRESS
JRST MSCS6A] ;AND JOIN COMMON CODE
LSH T1,3 ; POSITION IT IN 32 BITS
CALL REVFUL ;REVERSE IT SO THE HSC CAN GET THE RIGHT NUMBER
MOVEM T1,P.BCNT(Q2) ;WHERE HSC-50 WANTS TO SEE IT
MSCS6A: MOVX T1,US.DSK
TDNN T1,UDBSTS(P3) ;IS THIS A TAPE?
JRST MSCSIT ;YES. THERE IS NO ASSOCIATED LBN
CALL PHYBLK ;DISK. GET LBN TO WRITE
MOVE T1,T2
TXZ T2,IRBPAD ;TURN OFF PHYSICAL ADDRESSING BIT FOR PS1,PS2
MOVE T3,UDBSIZ(P3) ;POINTER TO SIZE TABLES
IDIV T2,SECCYL(T3) ;COMPUTE CYLINDER, SECTOR IN CYLINDER
MOVEM T2,UDBPS1(P3) ;SAVE FOR THE OUTSIDE WORLD TO SEE
MOVEM T3,UDBPS2(P3)
LDB T3,USYTYP ;GET UNIT TYPE
CAIL T3,.UTNOD ;IS THIS A NODE OR GREATER?
TXNN T1,IRBPAD ;CHECK FOR PHYSICAL ADDRESSING
LSH T1,2 ;NO MUST FORCE PAGE ADDRESS
LSH T1,4 ;POSITION LBN IN 32 BITS, CONVERT FROM PAGE NUMBER TO SECTOR NUMBER
CALL REVFUL ;REVERSE IT FOR THE HSC
MOVEM T1,P.LBN(Q2) ;TELL THE MSCP SERVER
JRST MSCSI8 ;KEEP ON GOING
;HERE IF A NON-DATA OPERATION IS REQUESTED
;THIS IS TAPE POSITIONING COMMANDS ETC
;
MSCSI7: TXNE Q3,OP.REW ;REWIND?
JRST [SETZM UDBPS1(P3) ;YES, CLEAR POSITION WORDS
SETZM UDBPS2(P3)
JRST MSCSI8] ;AND CARRY ON
MOVEI T1,20 ;NO, SPACE 1 RECORD
CALL REVFUL ;SWITCH THE BITS FOR THE HSC
MOVEM T1,P.TMGC(Q2) ;SAVE HOW MANY RECORDS TO DO
; HERE TO SEND A DATA OR POSITION REQUEST TO THE HSC
MSCSI8: MOVE T1,UDBSLV(P3) ;MSCP UNIT NUMBER
LSH T1,4 ;POSITION IT WHERE THE HSC WANTS IT
CALL REVFUL ;REVERSE THE BYTES FOR THE HSC
MOVEM T1,P.UNIT(Q2) ;TELL THE MSCP SERVER
HLRZ Q1,UDBKDB(P3) ;CID INDEX
SKIPG MSCCID(Q1) ;LEGAL CONNECT ID?
JRST RBDQUE ;NO -- ALL GONE REQUEUE
BLCAL. (SC.DCI,<MSCCID(Q1)>) ;GET THE CONNECT ID
JRST [ MOVE T1,MSCCID(Q1) ;GET THE SOURCE CONNECT ID
CALL SC.NOD ;(T1/T1,T2) GET THE DESTINATION NODE
BUG.(CHK,MSCIDG,PHYMSC,SOFT,<PHYMSC - Connect ID gone>,<<T2,NODE>,<T1,CID>>,<
Cause: When the MSCP driver was tyring to send a request to a server, the
source connect ID disappeared (call to SC.DCI failed). This appears to
be a SCAMPI problem.
Action: If this bug occurs often or is reproducible, change it to a BUGHLT and
submit an SPR along with a dump and instructions on reproducing it.
Data: NODE - destination node number
CID - source connect ID
>)
RET]
MOVEM T1,P.BUFF+2(Q2) ;TELL THE HSC THE LAST PART OF THE BUFFER NAME
BLCAL. (SC.SMG,<MSCCID(Q1),[0],[P%LBN],Q2,[MSCPRI],[1],[0]>) ;SEND THE PACKET
;FLAGS=0, PRIORITY=2, THRESHOLD=1
JRST MSCSI9 ;ERROR ON THE SEND
AOS MSCSNT ;[7211] COUNT THE MESSAGE
RETSKP ;PACKET IS SENT. GOOD RETURN
;HERE ON AN ERROR ON THE SEND. PROBLEM WITH SCA WHEN WE GET HERE WE HAVE LOST
;ON OUR SEND REQUEST. IF IT IS A REFUSAL DUE TO LOSS OF CREDIT THEN WE WILL
;JUST RE-QUEUE THE REQUEST OTHERWISE WE WILL COMPLAIN AND RETURN AN ERROR TO
;PHYSIO.
MSCSI9: CAIN T1,SCSNEC ;LOSE DUE TO NO CREDIT?
JRST [ AOS LCRDT
JRST RBDQUE] ;YES, QUEUE FOR LATER
CAIN T1,SCSCWS ;WRONG STATE?
JRST SNDWNS ;YUP WE LOST THIS ONE
MOVE T3,T1 ;MOVE ERROR CODE
MOVE T1,MSCCID(Q1) ;GET CONNECT ID
CALL SC.NOD ;(T1/T1,T2) GET NODE NUMBER
BUG.(CHK,MSCSDF,PHYMSC,SOFT,<PHYMSC - Send failure>,<<T2,NODE>,<T1,CID>,<T3,ERRCOD>>,<
Cause: A message sent to SCAMPI failed for reasons other than no credit or
connection in wrong state. The send request is retried. This
appears to be a SCAMPI problem.
Action: If this bug occurs often or is reproducible, change it to a BUGHLT and
submit an SPR along with a dump and instructions on reproducing it.
Data: NODE - node number
CID - connect ID
ERRCOD - error code
>)
JRST RBDQUE ;WAIT A WHILE AND TRY AGAIN
SNDWNS: MOVE T3,T1 ;MOVE ERROR CODE
MOVE T1,MSCCID(Q1) ;GET THE CONNECT INFORMATION
CALL SC.NOD ;(T1/T1,T2) GET THE NODE NUMBER FOR THE CONNECTION
BUG.(CHK,MSCSCW,PHYMSC,SOFT,<PHYMSC - Send found wrong connect state>,<<T2,NODE>,<T1,CID>,<T3,ERRCOD>>,<
Cause: The state of the connection is incorrect for the connect state.
Previous states should have caught this unless the state changed during
the send. The send should have been done with the channel off. The
send is tried again. This appears to be a SCAMPI problem.
Action: If this bug occurs often or is reproducible, change it to a BUGHLT and
submit an SPR along with a dump and instructions on reproducing it.
Data: NODE - node number
CID - connect ID
ERRCOD - error code
>)
SETOM MSCCID(Q1) ;CLEAR OUT THE CONNECT STATUS SO WE DON'T DO IT AGAIN
MOVX T1,DT.GAW
IORM T1,CIDATA(Q1)
CALL PHYOFL ;OFLINE THE DAMN THING BEFORE IT TRYS AGAIN
JRST RBDQUE ;AND RE-QUEUE THIS REQUEST
MSCSIT: MOVE T1,IRBCNT(P4) ;GET THE COUNT OF THE BYTES
LOAD T2,IRBDM,(P4) ;GET MODE
HLRZ T3,MODTBL(T2) ;GET BYTES
IMULI T1,(T3) ;NUMBER OF BYTES
LSH T1,4 ;PUT IN 32 BITS
CALL REVFUL
MOVEM T1,P.BCNT(Q2) ;STORE COUNT
JRST MSCSI8 ;RETURN TO COMMON CODE
COMBAD: MOVX T1,IS.ERR!IS.NRT!IS.DVE
IORM T1,IRBSTS(P4)
RET ;RETURN BAD WITH ERRORS
;
; ROUTINE TO SET THE DENSITY OF THE TAPE DRIVE. THIS IS ONLY
; EXECUTED AT BOT
;
SETDEN: LOAD T1,IRBDN,(P4) ;GET DENSITY
CAIL T1,4 ;CHECK DENSITY HERE TOO
CAILE T1,5 ;LEGAL DENSITY
JRST COMBAD ;NO BAD DENSITY
HLRZ T1,MTSZMT(T1) ;GET NEW DENSITY
CALL REVFUL ;REVERSE BITS
MOVEM T1,P.FORM(Q2) ;SET FORMAT
SETZM P.UNFL(Q2) ;SET NO FLAGS
MOVEI T3,P%NREC ;SIZE OF BLOCK
MOVX T2,OP.SUC!MD.CSE ;SET OPCODE TO SET UNIT CHARACTERISTICS
SETO P6,0 ;NO RETURN REQUIRED
HRRZ T1,UDBSLV(P3) ;UNIT NUMBER
HLRZ Q3,UDBKDB(P3) ;GET THE SID OFFSET
CALL SENDPK ;SEND THE PACKET
JRST MSCSI9
MOVX T1,US.BOT ;CLEAR BOT FLAG
ANDCAM T1,UDBSTS(P3)
JRST MSCRIO ;DO REAL TRANSFTER NEXT
ENDSV.
SUBTTL General Purpose Packet Routines
;HERE TO UNLINK THE QOR, RETURN THE BHD/BSDS AND REQUEUE
;RBDQUE
; CALL P2/KDB
; Q2 PACKET ADDRESS
; P6=-1 NO BHD TO REQUEUE
;
; RETURNS +2 ALWAYS THIS IS DONE TO SATISFY START I/O SUCCESS RETURN
;
; THIS ROUTINE RETURNS THE BHD/BSD, QOR AND BUFFERS. IT THEN
; REMOVES AN ENTRY FROM THE TRANSFER WAIT QUEUE AND PUTS IT
; ON THE POSITION WAIT QUEUE AND INDICATES THAT A TRANSFER
; IS NOW WAITING FOR A REQUEUE.
RBDQUE: JUMPL P6,RBFQUE ;REQUE PACKET ONLY
HLRZ Q1,.SBQOR(P2) ;GET ADDR OF QOR (LAST ENTRY ON QUEUE)
SKIPE T1,QORBHD(Q1) ;FIND THE BHD IF THERE IS ONE
CALL RTNBHX ;RETURN THE BHX
CALL ULKQOR ;UNLINK THE QOR
;HERE TO RETURN THE PACKET BUFFER AND REQUEUE
RBFQUE: CALL RTNBUF ;GIVE THE BUFFER BACK TO SCA
;HERE TO QUEUE THE IORB FOR LATER
QUEPAK:
QUEIRB: CALL OFFTWQ ;PULL IORB FROM TWQ
CAMN T1,UDBCHB(P3) ;IS THIS HOMEBLOCK?
JRST [ CALL CLRCHB ;CLEAR HOMEBLOCK REQUEST
JRST QUEHBK] ;AND RETURN TO CODE
CALL ONPWQ ; AND PUT IT ONTO THE PWQ
QUEHBK: SETOM QUEREQ ;INDICATE REQUEST RE-QUEUE'D
HRRZS P1
RETSKP ;TELL PHYSIO ALL IS WELL
;ROUTINE TO RETURN A BUFFER TO SCA
;CALL Q2/BUFFER ADDR
; THIS ROUTINE ASSUMES THAT WHEN THE BUFFER WAS ALLOCATED THE
; TOP OF THE BUFFER POINTS TO THE RETURN ADDRESS. SINCE
; PHYMSC ALWAYS USES GETBUF THIS IS A GOOD ASSUMPTION.
;RETURNS +1 ALWAYS
RTNBUF: SKIPE T1,Q2 ;GO AWAY IF BUFFER WAS ALREADY RETURNED
CALLRET @(Q2) ;RETURN THE PACKET BUFFER
RET
;ROUTINE TO RETURN THE BHD, BSDS ASSOCIATED WITH A PACKET
;CALL: Q2=ADDRESS OF PACKET BUFFER
;CALL RTNBHX WITH T1 = BUFFER NAME (IN CORRECT ORDER)
RTNBHX: CALL GIVBHD ;RETURN THE BHD/BDT
SKIPA T3,T2 ;POINT T3 AT 1ST BSD
RTNBH1: CALL GIVBSD ;RETURN THE BSD
SKIPN T1,T3 ;IS THERE A BSD?
RET ;NO. WE'RE DONE
MOVE T3,.BSNXT(T1) ;YES. PRESERVE ITS LINK
JRST RTNBH1 ;AND GIVE IT BACK
;ROUTINE TO GET A BUFFER FROM SCA
;CALL CALL GETBUF
;RETURN +1 IF NO BUFFERS AVAILABLE
;RETURN +2 Q2/ADDRESS OF BUFFER AND ADDRESS OF RETURN ROUTINE ON
; THE FIRST ENTRY OF THE BUFFER
GETBUF::MOVEI T1,1
CALL SC.ABF ;GET A PACKET BUFFER
RET ;NONE AVAILABLE
MOVE Q2,T1 ;SAVE ITS ADDRESS
MOVEM T3,(Q2) ;SAVE WHERE TO RETURN THE BUFFER IF WE DON'T USE IT
RETSKP ;GOOD RETURN
SUBTTL Interrupt Service
;CALL WITH T1-T4 HAVING STATUS INFORMATION PROVIDED BY SCAMPI
;THIS CODE IS ENTERED AT INTERRUPT LEVEL AND A RETURN
;WILL EVENTUALLY EXIT THRU THE KLIPA INTERRUPT ROUTINE.
;WE ARE ENTERED HERE IN RESPONSE TO SOME ACTION ON THE
;CI THAT WE MUST ATTEND.
INTRPT: SAVEPQ
CAIG T1,INTRLG ;CHECK FOR LEGAL DISPATCHES
JUMPGE T1,@DISPCH(T1)
BUG.(HLT,MSCILD,PHYMSC,SOFT,<PHYMSC - Illegal dispatch from SCAMPI>,<<T1,CODE>>,<
Cause: PHYMSC was called by SCAMPI with an illegal dispatch value (less than
zero or greater than INTRLG). This appears to be a SCAMPI problem.
Data: CODE - Dispatch value
>)
DISPCH: MSEC1,,DGREC ;.SSDGR - Datagram received
MSEC1,,MSGREC ;.SSMGR - Message received
MSEC1,,PBRCON ;.SSPBC - Port broke connection
MSEC1,,R ;.SSCTL - Connect to listen
MSEC1,,CNRAVL ;.SSCRA - Connect response available
MSEC1,,R ;.SSMSC - Message/datagram send complete
MSEC1,,R ;.SSDDG - Datagram dropped
MSEC1,,R ;.SSLCL - Little credit left
MSEC1,,MSCONL ;.SSNCO - Node came online
MSEC1,,R ;.SSOSD - OK to send data
MSEC1,,DSCREQ ;.SSRID - Remote initiated disconnect
MSEC1,,MSCCIA ;.SSCIA - Credit is available
MSEC1,,R ;.SSDMA - DMA complete
INTRLG==.-DISPCH-1
;
DSCREQ: LOAD T1,SID,T2 ;GET INDEX
SKIPG MSCCID(T1) ;VALID CONNECT ID?
RET ;FORGET IT
MOVE T1,T2 ;GET CID
CALL SC.NOD ;(T1/T1,T2) GET NODE NUMBER
BUG.(INF,MSCDSR,PHYMSC,SOFT,<PHYMSC - Disconnect request by remote node>,<<T2,NODE>,<T1,CID>,<T3,REASON>>,<
Cause: The remote node has disconnected, the remote node has probably timed
out on some operation to the MSCP driver. All drives connected to the
node are put offline.
Action: No action is required, this bug is informational only. The remote node
might indicate why it disconnected.
Data: NODE - node number
CID - connect ID
REASON - reason for disconnect
>,,<DB%NND>) ;[7.1210]
MOVE T2,T1 ;REPOSITION CID
LOAD Q3,SID,T2 ;GET INDEX AGAIN
MOVX T3,DT.DIS ;INDICATE DISCONNECTED
IORM T3,CIDATA(Q3) ;SET IN STATUS
CALL PBRCOA ;PUT IT OFFLINE
SETOM MSCCID(Q3)
RET ;RETURN
;HERE ON A NODE GOING AWAY (PORT BROKE CONNECTION)
;ENTER WITH T2=CONNECT ID OR -1 IF THIS IS AN EXTRANEOUS CALLBACK
;WE WILL SET THE DATABASE FLAGS IN MSCCID AND CIDATA TO INDICATE
;THAT WE HAVE LOST THE CONNECTION. WE THEN DECLARE THE DRIVE
;TO BE OFFLINE AND RE-QUEUE ALL THE REQUESTS.
;WHEN THE PORT REVIVES THE POLLER SHOULD RECOVER FROM THIS PROBLEM.
PBRCON: SKIPGE T2 ;IS THIS AN EXTRA CALLBACK?
RET ;YES, JUST RETURN
MOVE T1,T2 ;GET CONNECT ID
CALL SC.NOD ;(T1/T1,T2) GET NODE NUMBER
SKIPE CIBUGX ;CI DEBUGGING?
BUG.(INF,MSCPTG,PHYMSC,SOFT,<PHYMSC - port went away>,<<T2,NODE>,<T1,CID>>,<
Cause: The remote node has dropped the connection. All drives connected to
the node are put offline.
Action: No action is required, this bug is informational only.
Data: NODE - node number
CID - connect ID
>,,<DB%NND>) ;[7.1210]
MOVE T2,T1 ;REPOSITION CID
NODBYE: CALL FNDNDX ;SET UP MSCCID INDEX, CB ADDR
JRST [ MOVX T2,DT.KEP ;CLEAR STATUS
ANDM T2,CIDATA(T1)
RET] ;AND QUIT
SETOM MSCCID(T1) ;INDICATE WE ARE GONE
MOVX T4,DT.KEP ;INDICATE DISCONNECT
ANDM T4,CIDATA(T1)
JRST PBRCOB ;JUMP FINISH OFFLINE
PBRCOA: CALL FNDNDX
JFCL ;THIS GUY BETTER NOT LOOSE...
MOVX T3,DT.GAW ;INDICATE GONE AWAY
IORM T3,CIDATA(T1)
PBRCOB: SAVEP
MOVE T1,.CBSBA(T2) ;POINT AT SB
MOVE P1,KDBIUN(T1) ;POINT AT UNIT LIST
PBRCO1: SKIPN P3,(P1) ;UNIT THERE?
JRST PBRCO2 ;NO
PBRC11: CALL PHYOFL ;YES. TELL THE WORLD IT'S OFF LINE
MOVX T1,UA.PAT ;THIS PORT IS NO LONGER ATTACHED
ANDCAM T1,UDBALT(P3)
PBRCO2: AOBJN P1,PBRCO1
RET
;HERE ON A NODE COMING ONLINE
; WHEN A NODE COMES ONLINE WE MUST FIRST SEE IF THERE IS
; A FREE SLOT TO USE FOR A CONNECT ID. AFTER THIS WE THEN
; GO THRU THE INIT CODE ATTEMPTING TO PUT THIS SPECIFIC
; UNIT ONLINE.
;T2 = INDEX INTO SB TABLE OF NODE
MSCONL: HRRO Q1,T2 ;SB INDEX INTO A MORE PERMANENT AC
CALL FNDSLT ;FIND AN OPEN SLOT TO USE FOR THIS CONNECT
RET ;LOST ALL FULL
CALLRET MSCIN1 ;BUILD UDBS FOR THE UNITS
;HERE ON A CONNECTION RESPONSE AVAILABLE
; WHEN WE GET A CONNECT RESPONSE AVAILABLE IT IS IN RESPONSE TO A
; CONNECT THAT WE HAVE ISSUED. WE FIRST CHECK TO SEE IF THE NODE
; WAS REALLY ONE THAT WE REALLY REQUESTED. IF NOT THEN SCAMPI
; IS REALLY CONFUSED. WHEN WE FIND WHICH ONE IT IS WE CAN THEN
; DETERMINE IF THE REQUEST WAS OK. IF SO THEN IT IS LEGAL TO
; START TRAFFIC WITH THIS NODE. IF NOT THEN WE FLAG THE NODE
; AS GONE AND FORGET ABOUT IT SINCE IT REALLY DIDN'T LIKE US.
; T2=CONNECT ID
; T3=-1 IF ACCEPTED,, 0 IF REJECTED
; IF REJECTED T4= REASON CODE
CNRAVL: LOAD Q3,SID,T2 ;WHICH NODE IS THIS TALKING ABOUT
JUMPE T3,CRNAV1 ;CHECK TO SEE IF REJECTED
SKIPG T2 ;DID WE GET A VALID CID?
BUG.(HLT,MSCBID,PHYMSC,SOFT,<PHYMSC - bad connect ID from SCAMPI>,<<T2,CID>>,<
Cause: A connect response available occurred and a negative or zero Connect ID
was returned from SCA. This indicates a SCAMPI problem.
Data: CID - connect ID
>)
CAME T2,MSCOLD(Q3) ;MATCH?
JRST CNRREJ ;WE ALREADY KNOW ABOUT YOU??
SETO T1,0
CAMN T1,MSCCID(Q3) ;[8913] Coming online (waiting for this one?)
IFSKP. ;[8913] No
CNRREJ: MOVE T1,T2 ;GET CONNECT ID
CALL SC.NOD ;(T1/T1,T2) GET NODE NUMBER
BUG.(CHK,MSCNRA,PHYMSC,SOFT,<PHYMSC - Node response available when not requested>,<<T2,NODE>,<T1,CID>>,<
Cause: A connect response available occurred on a node that isn't expected to
have an available happen. This could be a SCAMPI or PHYMSC problem.
Action: If this bug occurs often or is reproducible, change it to a BUGHLT and
submit an SPR along with a dump and instructions on reproducing it.
Data: NODE - node number
CID - connect ID
>,R)
ENDIF.
MOVEM T2,MSCCID(Q3) ;SAVE CONNECT ID
MOVEM T2,MSCOLD(Q3) ;SAVE IT FOR DISCONNECT
CRNAV1: MOVX T1,DT.KEP ;CLEAR STATUS
ANDM T1,CIDATA(Q3)
JUMPN T3,MSCIN5 ;CONTINUE CONNECT INIT PROCESS
MOVE T1,T2 ;SAVE CONNECT ID
MOVX T2,DT.GAW ;INDICATE WE DIDN'T GET THIS ONE
IORM T2,CIDATA(Q3)
SETOM MSCCID(Q3) ;INDICATE NOW UNUSED
CAIN T4,.CMCNM ;CHECK FOR NO MATCH
RET
SKIPN CIBUGX ;[7191] ARE WE IN DEBUGGING MODE?
RET ;[7191] NO, THEN DON'T SCARE THE OPERATOR
CALL SC.NOD ;(T1/T1,T2) GET NODE NUMBER
BUG.(INF,MSCREJ,PHYMSC,SOFT,<PHYMSC - Node connection reject>,<<T2,NODE>,<T1,CID>>,<
Cause: A connection response available was rejected. The node cannot be
reached. The MSCP server on another TOPS-20 system rejects all
connections until that system has joined the CFS cluster.
Action: No action is required, this bug is for information only.
Data: NODE - node number
CID - connect ID
>,R,<DB%NND>) ;[7.1210]
;ROUTINE TO SEARCH FOR MATCHING CONNECT ID
;ENTER T2/CONNECT ID
; NON-SKIP RETURN IF NO MATCH
; SKIP RETURN IF MATCH WITH T1/MSCCID INDEX, T2/CB ADDRESS
;PRESERVES T3, T4
FNDNDX: SKIPN T2 ;CHECK FOR BROKEN SCAMPI
MSNGID: BUG.(CHK,MSCMID,PHYMSC,SOFT,<PHYMSC - Missing connect ID>,,<
Cause: There is a missing or zero connect ID on call to FNDNDX. This has to
be a SCAMPI problem.
Action: If this bug occurs often or is reproducible, change it to a BUGHLT and
submit an SPR along with a dump and instructions on reproducing it.
>)
LOAD T1,SID,T2 ;GET THE OFFSET INTO THE MSCCID TABLE
CAME T2,MSCCID(T1) ;CHECK FOR CORRECT CONNECT ID
RET ;NOPE THIS IS AN OLD ONE
$LDCID T2,T2 ;FOUND A MATCH FIND CB ADDRESS
RETSKP ;RETURN
;ROUTINE TO SEARCH FOR AN OPEN OR UNUSED SLOT FOR CONNECT ID'S
;ENTER: Q1 = SBI COMING ON LINE
;RETURNS: Q3 = INDEX INTO MSCCID FOR NEW SLOT
; RETURNS +1 ENTRY ALREADY IN USE
; RETURNS +2 ALL OK
FNDSLT: MOVE Q3,Q1 ;SET UP Q3
SKIPG T1,MSCCID(Q3) ;SEE IF THIS ENTRY IS FREE
RETSKP ;YES
MOVX T1,DT.GAW ;YES CHECK TO SEE IF REALLY GONE
TDNE T1,CIDATA(Q3) ;HERE?
RETSKP
MOVE T1,MSCCID(Q3) ;GET CONNECT ID
CALL SC.NOD ;(T1/T1,T2) GET NODE NUMBER
BUG.(CHK,MSCAOL,PHYMSC,SOFT,<PHYMSC - Online node event while node already online>,<<T2,NODE>,<T1,CID>,<Q1,SBI>>,<
Cause: SCAMPI told us that this node was coming back on line but we think that
it is already online. We believe SCAMPI and put it online. This is
commonly seen from the HSC.
Action: No action is required. However, if this bug occurs often or is
reproducible, change it to a BUGHLT and submit an SPR along with a dump
and instructions on reproducing it.
Data: NODE - node number
CID - connect ID
SBI - system block index
>,R,<DB%NND>) ;[7.1210]
;HERE ON MESSAGE RECEIVED.
;WHEN WE GET HERE WE HAVE RECEIVED A MESSAGE FROM A NODE THAT
;WE ARE CONNECTED TO. WE MUST DETERMINE THE TYPE OF THE
;MESSAGE AND THEN DECIDE WHAT FUNCTION TO PERFORM. WE
;CHECK TO SEE THAT THE MESSAGE IS REALLY ONE FOR WHICH WE
;HAVE A CONNECT ID. AFTER THAT WE CHECK TO SEE IF IT IS A
;MESSAGE THAT WAS INITIATED OR AN END PACKET (RESPONSE)
;TO A REQUEST THAT WE HAVE MADE. IF IT WAS A REQUEST THAT
;WE MADE THE LEFT HALF OF THE COMMAND REFERENCE NUMBER IS
;AN INDICATOR OF WHICH ROUTINE HANDLES THE COMPLETION OF
;THIS TYPE OF MESSAGE. IF THE COMMAND REFERENCE LEFT HALF
;IS -1 THEN THE REQUESTOR DOES NOT NEED TO DO ANYTHING
;ON THE COMPLETION OF THE COMMAND.
; ENTER WITH: T1/ .SSMGR
; T2/ CONNECT ID
; T3/ ADDRESS OF MESSAGE BUFFER
; T4/ FLAGS AND ADDRESS OF ROUTINE TO RETURN BUFFER
MSGREC: AOS MSCRCV ;[7211] COUNT THE MESSAGES
TLZ T4,770000 ;[7211] REMOVE FLAG BITS
MOVEM T4,(T3) ;SAVE BUFFER-RETURN ADDRESS IN BUFFER
MOVE Q2,T3 ;Q2=BUFFER ADDR
MOVE P5,T2 ;SAVE CONNECT ID IN CASE WE NEED IT
CALL FNDNDX ;FIND MSCCID INDEX
JRST RTNBUF ;NONE FOUND RETURN BUFFER AND QUIT
MOVE Q3,T1 ;SET IT IN Q3
$LDCID P2,P5 ;GET CONNECTION BLOCK ADDRESS
MOVE P2,.CBSBA(P2) ;SYSTEM BLOCK (KDB)
MOVE P1,.SBACD(P2) ;CDB
CALL REVSTS ;MAKE THE BITS UNDERSTANDABLE
LOAD T1,PKYECD,(Q2) ;GET ENDCODE
TRZE T1,OP%AVA ;AVAILABLE?
JRST MSGAVA ;YES. GO HANDLE IT
TRZN T1,OP%END ;REASONABLE?
JRST MSGRC8 ;NO. THE SERVER BLEW IT
CAIN T1,OP%ABO ;AN ABORT END PACKET?
CALLRET RTNBUF ;YES. NOTHING NEEDS TO BE DONE
MOVE T2,P.CRF(Q2) ;COMMAND REFERENCE NUMBER
ASH T2,-4 ;RIGHT ADJUST IT IN 36 BITS
TLNN T2,-1 ;LH NON-0?
JRST MSGRC2 ;NO, REGULAR MESSAGE
CAIL T1,OP%GCS ;YES. IS IT A REASONABLE END CODE?
CAILE T1,OP%SUC
JRST MSGRC8 ;NO. THE SERVER SCREWED UP
CAIN T1,OP%SUC ;CHECK FOR SET UNIT CHAR'S
JRST TAPSUC ;YES MUST BE A TAPE
HLRZ T2,T2 ;FIND THE COMMAND REQUEST
CAIN T2,-1 ;CHECK FOR -1 (ALL DONE)
CALLRET RTNBUF ;DONE RETURN FROM INTERRUPT
CAME T1,CMDTBL(T2) ;CHECK TO SEE THAT IT IS CONSISTENT
JRST BROKE ;NO NOT REALLY
; AT THIS POINT P2= KDB,T1= END CODE, T2= FUNCTION DISPATCH
; Q2 = PACKET ADDRESS, Q3 = CONNECT ID INDEX
; WHEN WE GET HERE WE HAVE CHECKED THE CONSISTENCY OF THE
; COMMAND REFERENCE NUMBER BY CHECKING THE END CODE AGAINST
; THE LEFT HALF OF THE ENDCODE. WE NOW GO TO THE ROUTINE
; THAT WAS REQUESTED ON COMPLETION OF THE REQUESTED SERVER
; FUNCTION.
JRST @CMDJMP(T2)
BROKE: DMOVE T3,T1 ;MOVE ENDCODE AND FUNCTION CODE
MOVE T1,P5 ;GET CONNECT ID
CALL SC.NOD ;(T1/T1,T2) AND NODE NUMBER
BUG.(CHK,MSCBCN,PHYMSC,SOFT,<PHYMSC - Command reference number bad>,<<T2,NODE>,<T1,CID>,<T3,ENDCODE>,<T4,FUNCTION>>,<
Cause: The command reference number is invalid. This is an MSCP protocol
problem.
Action: If this bug occurs often or is reproducible, change it to a BUGHLT and
submit an SPR along with a dump and instructions on reproducing it.
Data: NODE - node number
CID - connect ID
ENDCODE - packet end code
FUNCTION - command request
>)
CALLRET RTNBUF ;QUIT THIS ONE IS JUNK
TAPSUC: LOAD T3,PKYEST,(Q2) ;GET STATUS
JUMPE T3,RTNBUF ;ALL OK
MOVE T1,P5
CALL SC.NOD ;GET NODE NUMBER
BUG.(INF,MSCSUF,PHYMSC,SOFT,<PHYMSC - Set density failed>,<<T2,NODE>,<T1,CID>,<3,CODE>>,<
Cause: The set unit characteristics command failed for a tape drive.
Action: If this bug occurs often or is reproducible, change it to a BUGHLT and
submit an SPR along with a dump and instructions on reproducing it.
Data: NODE - Node number
CID - Connect ID
CODE - Status code
>)
JRST RTNBUF ;RETURN BUFFER
;WHEN WE GET HERE WE HAVE RECEIVED A RESPONSE TO A DATA TRANSFER
;MESSAGE. THE ONLY REQUESTS THAT HAVE A LEFT HALF COMMAND REFERENCE
;NUMBER OF ZERO ARE DATA FUNCTIONS TO THE SERVER. WE MUST NOW PROCEED TO
;SERVICE THE COMPLETION OF THE DATA REQUEST BY CLEANING UP THE
;DATA BASE AND CHECKING FOR THE STATUS OF THE TRANSFER REQUEST.
MSGRC2: CAIG T1,OP%GUS ;"REAL" MESSAGE?
JRST RTNBFX ;NO. RETURN THE BUFFER AND EXIT
MSGRC3: HRRZ Q1,.SBQOR(P2) ;START AT 1ST QOR ON THE SYSTEM BLOCK
MOVE T2,P.CRF(Q2) ;WE'RE LOOKING FOR THIS COMMAND REFERENCE NUMBER
MSGRC4: CAMN T2,QORCRF(Q1) ;MATCH?
JRST MSGRC5 ;YES
HRRZ Q1,QORLNK(Q1) ;NO, STEP TO NEXT
CAIE Q1,.SBQOR(P2) ;ARE WE AT THE END OF THE QORS?
JUMPN Q1, MSGRC4 ;NO, TEST THIS ONE
;IF Q1 IS 0 THEN TABLE IS CLOBBERED!
RTNBFX: DMOVE T3,T1 ;MOVE ENDCODE AND COMMAND REFERENCE NUMBER
MOVE T1,P5 ;GET CONNECT ID
CALL SC.NOD ;(T1/T1,T2) GET NODE NUMBER
JUMPE Q1,[BUG.(CHK,MSCQRC,PHYMSC,SOFT,<PHYMSC - QOR list clobbered>,<<T2,NODE>,<P2,KONT>,<T4,CRN>>,<
Cause: The QOR (the link between MSCP commands and IORBs) list has been
clobbered and has a 0 in it. This indicates a PHYMSC problem.
Action: If this bug occurs often or is reproducible, change it to a BUGHLT and
submit an SPR along with a dump and instructions on reproducing it.
Data: NODE - Node number
KONT - Controller number
CRN - Command reference number
>,RTNBUF)]
BUG.(CHK,MSCBPK,PHYMSC,SOFT,<PHYMSC - QOR bad packet>,<<T2,NODE>,<T1,CID>,<T3,ENDCODE>,<T4,CRN>>,<
Cause: The HSC sent a packet whose command reference number can't be found.
The packet is ignored.
Action: If this bug occurs often or is reproducible, change it to a BUGHLT and
submit an SPR along with a dump and instructions on reproducing it.
Data: NODE - node number
CID - connect ID
ENDCODE - packet end code
CRN - Command reference number
>,,<DB%NND>) ;[7.1210]
CALLRET RTNBUF ;RETURN THE PACKET AND EXIT
;HERE WITH Q1 POINTING AT THE QOR FOR THE PACKET WE JUST REC'D
MSGRC5: SKIPN T1,QORBHD(Q1) ;RETURN THE BHD IF THERE IS ONE
JRST MSGR5A ;NO BHD
LDB T3,[POINT BHSIDX,T1,BHPIDX] ;GET INDEX INTO BUFFER DESCRIPTOR TABLE
ADD T3,BHDIPT ;POINT AT ENTRY
MOVX T2,BH.ERR ;ERROR
TDNE T2,(T3) ;IS THE ERROR BIT SET?
BUG.(HLT,MSCBHE,PHYMSC,SOFT,<PHYMSC - BHD error bit set>,,<
Cause: The BHD error bit was set. This implies that the BSD had the wrong
length. Something is inconsistent in the state or too much data was
sent.
>)
SETZM 0(T3) ;CLEAR FLAGS WORD
CALL RTNBHX
MSGR5A: HRRZ P4,QORIRB(Q1) ;POINT P4 AT IORB
HLRZ P3,QORUNI(Q1) ;GET UDB ADDRESS
HRRZ T1,.SBQOR(P2) ;OLDEST QOR (COMMAND) OUTSTANDING
CAIE T1,(Q1) ;IS THIS THAT QOR?
JRST MSGRC6 ;NO
HLRZ T1,UDBKDB(P3) ;YES. SET NEW COMMAND STATUS
HRLOI T2,377777 ; TO INFINITY FOR NEXT GCS
MOVEM T2,CICMST(T1)
;
;AT THIS POINT THE UDB (P3) MAY BE WRONG. THIS IS BECAUSE
;THE I/O REQUEST MAY HAVE BEEN REQUEUE'D AND QORUNI WAS
;NOT FIXED UP WHEN THE REQUEST WAS MOVED BY PHYSIO FROM
;ONE UDB TO THE ALTERNATE UDB THIS IS WHY WE CHECK HERE
;FOR THE OTHER PORT ACTIVE.
;
MSGRC6: CALL FRONTW ;MOVE THE REQUESTED ITEM TO THE FRONT OF THE QUEUE
SKIPA ;IT WASN'T HERE
JRST MSGR6A ;FOUND IT ALL MUST BE OK
HRRZ P3,UDBALT(P3) ;TRY ALTERNATE
JUMPE P3,DONE3 ;OOPS LOST THE ENTRY
CALL FRONTW ;TRY TO MOVE THIS ONE TO THE FRONT
JRST DONE3 ;NOT HERE EITHER WELL THEN QUIT
MSGR6A: CALL ULKQOR ;UNLOCK AND LOOSE THE QOR FOR THIS XFR
LOAD T1,PKYEST,(Q2) ;STATUS OF UNIT
CAIE T1,ST%OFL ;OFF LINE?
CAIN T1,ST%AVL ;AVAILABLE ALSO?
SKIPA ;YES PUT THE DRIVE OFF-LINE DON'T CAUSE AN ERROR.
JRST MSGRC7 ;NO, CONTINUE
CALL PHYOFL ;YES, TELL PHYSIO THE UNIT WENT OFF LINE
MOVE T1,UDBSTR(P3) ;IS THE UNIT IN A STR?
AOJE T1,ERRDON ;NOT IF UDBSTR=-1. IF SO, JUST RETURN AN ERROR
MOVX T1,US.OIR ;IN A STR. BITCH AT THE OPERATOR
IORM T1,UDBSTS(P3) ;SET TO GET THE "PROBLEM ON DEVICE" MESSAGE
CALLRET RTNBUF ;GIVE BACK THE BUFFER AND RETURN
;
MSGRC7: LDB T1,IRYFCN ;FUNCTION
MOVE Q3,MSCFCN(T1) ;GET FUNCTION
MOVE T1,P.BCNT(Q2) ;GET BYTE COUNT
CALL REVFUL ;MAKE IT UNDERSTANDABLE
LSH T1,-4 ;RIGHT ADJUST IT
MOVX T2,US.DSK
TDNE T2,UDBSTS(P3) ;WHAT FLAVOR OF DEVICE IS THIS?
JRST DSKEND ;DISK
JRST TAPEND ;TAPE
;HERE ON A MESSAGE WITH A BAD END CODE
MSGRC8: MOVE T3,T1 ;SAVE ENDCODE
MOVE T4,P.CRF(Q2) ;MAKE SURE WE HAVE COMMAND REFERENCE NUMBER
ASH T4,-4 ;RIGHT ADJUST IT IN 36 BITS
MOVE T1,P5 ;GET CONNECT ID
CALL SC.NOD ;(T1/T1,T2) GET NODE NUMBER
BUG.(CHK,MSCPEI,PHYMSC,SOFT,<PHYMSC - Packet end code incorrect>,<<T2,NODE>,<T1,CID>,<T3,ENDCODE>,<T4,CRN>>,<
Cause: The HSC sent a packet that had a bad packet end code. There may be a
problem with the HSC or it could be a software problem.
Action: If this bug occurs often or is reproducible, change it to a BUGHLT and
submit an SPR along with a dump and instructions on reproducing it.
Data: NODE - node number
CID - connect ID
ENDCODE - packet end code
CRN - command reference number
>)
CALLRET RTNBUF ;CHUCK THE PACKET AND EXIT THE INTERRUPT
TAPEND: MOVE P5,UDBDEN(P3) ;GET DENSITY
CAIN P5,.SJD16 ;1600 BPI (PE MODE)?
SKIPA P5,P3 ;YES, SET TO ACCUMULATE PE FRAMES
MOVEI P5,1(P3) ;NO, SET TO ACCUMULATE GCR FRAMES
TXNE Q3,OP.AVL ;AVLOAD?
JRST TAPDN4
TXNN Q3,OP.RDB ;READ?
JRST TAPDN2 ;NO
ADDM T1,UDBRED(P3) ;ACCUMULATE FRAMES READ
ADDM T1,UDBRPE(P5) ;ACCUMULATE FRAMES READ IN PE/GCR
LOAD T3,IRBDM,(P4)
HLRZ T3,MODTBL(T3) ;COMPUTE WORDS READ
SOJE T3,TAPDN1 ;SAVE TIME IF BYTES=FRAMES
IDIVI T1,1(T3)
JUMPE T2,TAPDN1 ;GO IF AN INTEGRAL NUMBER OF BYTES
ADDI T1,1
TAPDN1: MOVEM T1,IRBCNT(P4) ;SAVE WORDCOUNT
TAPDN2: TXNE Q3,OP.RDB ;WRITE?
JRST TAPDN3 ;NO
LOAD T3,IRBDM,(P4) ;YES, ACCUMULATE BYTES WRITTEN
HLRZ T3,MODTBL(T3)
IMUL T3,IRBCNT(P4)
ADDM T3,UDBWRT(P3)
ADDM T3,UDBWPE(P5) ;ACCUMULATE BYTES WRITTEN IN PE OR GCR
TAPDN3: TXNE Q3,OP.REV
SOSA UDBPS1(P3) ;UPDATE RECORD COUNTER
AOS UDBPS1(P3)
TAPDN4: SETZ T3, ;ZERO STATUS
LOAD T1,PKYEST,(Q2) ;GET END-PACKET STATUS
JUMPE T1,DONET ;GO IF NO ERRORS
CAIN T1,ST%TM
TXO T3,IS.TPM ;TAPE MARK ENCOUNTERED
CAIN T1,ST%BOT
TXO T3,IS.BOT!IS.TPM ;BOT ENCOUNTERED
CAIN T1,ST%DAT ;DATA ERROR?
TXO T2,IS.NRT!IS.DTE!IS.ERR ;SET DATA ERROR
CAIN T1,ST%RDT
TXO T3,IS.RTL ;RECORD TOO LONG
TXNN T3,IS.RTL!IS.BOT!IS.TPM!IS.DTE ;ANY OF THESE?
TXO T3,IS.ERR!IS.NRT!IS.DVE ;NO. "REAL" ERROR
TXNN T3,IS.BOT!IS.TPM ;BOT OR EOF?
JRST DONET ;NO
SETZM UDBPS1(P3) ;YES. AT 0TH RECORD
TXNE T3,IS.BOT ;BOT?
TAPBOT: JRST [SETZM UDBPS2(P3) ;YES. AT 0TH FILE TOO
MOVX T2,US.BOT ;SET BOT
IORM T2,UDBSTS(P3)
JRST DONE]
TXNE Q3,OP.REV ;NO. BACKWARDS?
SOSA UDBPS2(P3)
AOS UDBPS2(P3) ;ADJUST FILE COUNT
JRST DONET
DONET: LOAD T2,PKYFCD,(Q2) ;GET FULL STATUS
TXNE T2,EF%EOT ;IS IT EOT?
TXO T3,IS.EOT ;YES SET EOT FLAG
TXNN Q3,OP.REW ;REWIND?
JRST DONE ;NO NOT BOT
JRST TAPBOT
;DISK TRANSFERS FINISH HERE BY UPDATING THE COUNT OF READS/WRITES
;AND CHECK FOR ERRORS BEFORE INFORMING PHYSIO THAT THE TRANSFER
;IS COMPLETE.
DSKEND: LSH T1,-11 ;CONVERT BYTES TO SECTORS
TXNE Q3,OP.RDB ;READ?
JRST [ADDM T1,UDBRED(P3) ;YES
AOS UDBRCT(P3)
JRST DSKEN1]
ADDM T1,UDBWRT(P3) ;NO
AOS UDBWCT(P3)
DSKEN1: LOAD T1,PKYEST,(Q2) ;GET END PACKET STATUS
JUMPE T1,DONE1 ;ERROR?
SKIPA T3,[IS.ERR!IS.DTE!IS.NRT] ;SET DATA ERROR SO WE GET BAT BLOCK ALLOCATION
ERRDON: MOVX T3,IS.ERR!IS.NRT!IS.DVE ;YES
;FALL INTO DONE
DONE: IORM T3,IRBSTS(P4) ;LIGHT BITS IN IORB
DONE1: CAIN T1,ST%CMD ;CHECK FOR ILLEGAL COMMAND
JRST [ LOAD T3,PKYQSB,(Q2)
BUG.(CHK,MSCIVC,PHYMSC,SOFT,<PHYMSC - Illegal command>,<<P1,CHAN>,<P2,KONT>,<P3,UNIT>,<T3,STS>>,<
Cause: The remote node claimed we sent it an illegal command. This indicates
a MSCP protocol problem with the local or remote node.
Action: If this bug occurs often or is reproducible, change it to a BUGHLT and
submit an SPR along with a dump and instructions on reproducing it.
Data: CHAN - Channel number
KONT - Controller number
UNIT - Unit number
STS - Status returned by remote node
>)
JRST .+1]
CAIN T1,ST%WPR ;CHECK FOR WRITE PROTECT
JRST [ MOVX T2,US.WLK ;SET WRITE LOCK BIT
IORM T2,UDBSTS(P3) ;SET IN UDB STATUS
JRST .+1]
LOAD T1,PKYFCD,(Q2) ;STATUS/END FLAGS
MOVX T3,IS.NRT
AND T3,IRBSTS(P4) ;ERROR STATUS FROM IORB
TXNN T1,EF%LOG ;ERROR LOG GENERATED?
JUMPE T3,DONE2 ;NO. DONE IF NO ERROR
CALL ERRSET ;YES. ALLOCATE AN ERROR BLOCK
JUMPE T1,DONE2 ;NO SPACE. CAN'T LOG IT
MOVEM T1,UDBERP(P3) ;GOT ONE. SAVE ITS ADDRESS
CALL REVSTS ;PUT P.STS BACK INTO ORIGINAL ORDER FOR ERROR LOG
LDB T1,IRYFCN ;FUNCTION WE'RE DOING INTO UDBERR
MOVEM T1,UDBERR(P3) ;JUST TO INFORM WORLD WE'RE PROCESSING AN ERROR
MOVE T3,UDBERP(P3) ;STORE INTO THE ERROR BLOCK
ADDI T3,CI%PAK+SEBDAT ;POINT TO THE WORD TO FILL IN
XMOVEI T2,P.CRF(Q2) ;FROM THE PACKET
MOVEI T1,P.TRBC-P.CRF+1 ;AMOUNT OF DATA TO MOVE
EXTEND T1,[XBLT] ;FILL IN THE DATA
DONE2: CALL RTNBUF ;GIVE THE BUFFER BACK TO SCA
CALL PHYINU ;TELL PHYSIO ABOUT THE COMPLETION
HRRZ T1,UDBPWQ(P3) ;IS THERE SOMETHING TO DO?
JUMPE T1,R ;NOPE FORGET IT
CALL UNQUNT ;YES TRY TO QUEUE ANOTHER REQUEST
RET ;NO PROBLEM IF FAILED
RET ;DONE - RETURN TO SCA
DONE3: SKIPN P4
BUG.(HLT,MSCNIR,PHYMSC,SOFT,<PHYMSC - IORB zero>,<<P5,CID>>,<
Cause: PHYMSC found the IORB register zero in a place it did not expect.
Data: CID - Connect ID
>)
MOVE T2,IRBSTS(P4) ;STATUS OF THE IORB (MAY NOT BE VALID)
BUG.(INF,MSCGON,PHYMSC,SOFT,<PHYMSC - IORB/QOR gone>,<<P5,CID>,<P4,IORB>,<T2,STATUS>>,<
Cause: PHYMSC had a data structure which pointed at an IORB. It cannot find
the IORB on the unit transfer queue. This seems to be a problem with
PHYMSC's handling of the QOR database.
Action: If this bug occurs often or is reproducible, change it to a BUGHLT and
submit an SPR along with a dump and instructions on reproducing it.
Data: CID - Connect ID
IORB - IORB address
STATUS - Status of IORB
>)
CALLRET RTNBUF
;HERE ON THE RECEIPT OF A DATAGRAM
;WE ENTER HERE TO PERFORM ERROR LOGGING OF PROBLEMS THAT
;ARE REPORTED TO US FROM THE DEVICE.
; ENTER WITH: T1/ .SSDGR
; T2/ CONNECT ID
; T3/ ADDRESS OF DATAGRAM BUFFER
; T4/ FLAGS AND ADDRESS OF ROUTINE TO RETURN BUFFER
DGREC: AOS MSCDRC ;[7211] COUNT THE INCOMING DATAGRAM
MOVE Q2,T3 ;[7211] SAVE ADDR OF BUFFER
MOVE P5,T2 ;SAVE CID
$LDCID T1,T2 ;CB ADDR
MOVE P1,.CBSBA(T1) ;SBK ADDR
MOVE T1,.MHPKL(Q2) ;TOTAL BLOCK LENGTH
IDIVI T1,4 ;CONVERT FROM BYTES
SKIPE T2 ;CHECK FOR PARTIAL BYTES
AOS T1 ;INCLUDE EXTRA BYTE FOR 1 WORD
AOS T2,T1 ;NON STRING DATA SIZE
CALL ALCSEB ;TRY TO GET ERROR BLOCK
JRST DGREC1 ;NONE AVAILABLE. RETURN BUFFER TO SCA AND EXIT
MOVE Q3,T1 ;SAVE LOC OF ERROR BLOCK
MOVEI T3,SEBDAT+EL%PAK(T1) ;STORE INTO THE ERROR BLOCK
MOVE T1,.MHPKL(Q2) ;AMOUNT OF DATA TO MOVE
IDIVI T1,4 ;CONVERT FROM BYTES
SKIPE T2
AOS T1
XMOVEI T2,P.CRF(Q2) ;FROM THE PACKET
EXTEND T1,[XBLT] ;FILL IN THE DATA
MOVE T1,Q3 ;ERROR BLOCK LOC AGAIN
MOVE T2,[-NELTAB,,ELTAB] ;FILL IN THE HEADER
CALL SEBCPY
JFCL
MOVE T1,Q3 ;RECOVER ERROR BLOCK
CALL QUESEB ;HAND IT TO SPEAR
DGREC1: MOVE T1,Q2 ;ADDRESS OF BUFFER
SETZM (Q2) ;CLEAR THE LINK TO THE NEXT BUFFER
BLCAL. (SC.RDG,<P5,[1],Q2>)
JFCL
RET
ELTAB: SEBPTR 0,SBTEVC,SEC%EL ;BLOCK TYPE
SEBPTR EL%NOD,SBTWD,.SBDSP(P1) ;PORT,,NODE
NELTAB==.-ELTAB
;HERE ON AN AVAILABLE MESSAGE
;WHEN A DISK BECOMES AVAILABLE WE GET A MESSAGE THAT TELLS
;US THAT IT HAS RETURNED FROM A STATE WHERE IT WE COULD NOT
;USE IT. WHEN WE GET HERE WE MUST CHECK TO SEE IF IT IS A NEW
;UNIT OR ONE THAT WE ALREADY KNEW ABOUT. IF IT IS A NEW
;UNIT THEN WE MUST BUILD A UDB FOR IT AND MAKE IT KNOWN TO
;THE SYSTEM. WHEN IT IS A UNIT THAT WE USED TO KNOW ABOUT
;THEN WE MUST PUT IT ONLINE AND REQUEST THAT THE HOMEBLOCKS
;BE RE-READ. IF IT IS A UNIT THAT IS ALREADY ONLINE THEN
;WE MUST ALSO GO THRU THE CODE TO RE-READ THE HOMEBLOCKS
;BECAUSE THE DRIVE MAY HAVE GONE OFFLINE AND RETURND WITHOUT
;TELLING US OF IT'S DISAPPEARANCE. FOR THE PURPOSE OF THIS
;ROUTINE AVAILABLE IMPLIES THAT THE UNIT HAS RECIENTLY BEEN
;OFFLINE!
MSGAVA: BLCAL. (SC.RMG,<P5,[1],[0]>) ;REQUEST MORE CREDIT
JFCL ;OOPS WELL WE LOST ONE
CALL SETSUN ;GET UNIT NUMBER
MOVE T4,T1 ;SAVE UNIT NUMBER
MOVE T1,P5 ;GET CONNECT ID
CALL SC.NOD ;(T1/T1,T2) GET NODE NUMBER
SKIPE CIBUGX ;CI DEBUGGING?
BUG.(INF,MSCAVA,PHYMSC,SOFT,<PHYMSC - Available message received>,<<T2,NODE>,<T1,CID>,<T4,UNIT>>,<
Cause: When a disk becomes available we get a message that tells us that it
has returned from a state where it we could not use it. We then build
a UDB if needed and start checking the home blocks.
Action: No action required, this bug is for information only.
Data: NODE - node number
CID - connect ID
UNIT - Unit number
>,,<DB%NND>) ;[7.1210]
MOVE T2,P5 ;GET CONNECT ID
CALL FNDNDX ;COMPUTE SB INDEX
JRST RTNBUF ;NO MATCHING ID!
MOVE Q3,T1 ;PUT INDEX WHERE SCA WILL LOOK FOR IT
;HERE FROM MSCOUN TO ONLINE A UNIT IN RESPONSE TO A DIAG JSYS
INIUNI: CALL SETP3 ;SET P3 POINTING TO THE UDB
JFCL ;NO SUCH UDB, IT'S A NEW UNIT
MSGAV1: MOVEI P6,MSGA1 ;RETURN ON DONE TO MSGAA
MOVEI T2,OP.GUS ;DO A GET UNIT STATUS
CALL CURUN ;ASK THE HSC WHAT THE NEXT UNIT IS
IFNSK.
MOVE T3,T1 ;MOVE ERROR CODE
MOVE T1,P5 ;GET CONNECT ID
CALL SC.NOD ;(T1/T1,T2) GET NODE NUMBER
BUG.(INF,MSCNUF,PHYMSC,SOFT,<PHYMSC - Get next unit failed>,<<T2,NODE>,<T1,CID>,<T3,ERRCOD>>,<
Cause: PHYMSC was unable to get the next unit from a HSC, probably because
SC.SMG failed. This is seen most often with broken HSC hardware.
Action: If the hardware checks out OK, and if this bug occurs often or is
reproducible, change it to a BUGHLT and submit an SPR along with a dump
and instructions on reproducing it.
Data: NODE - node number
CID - connect ID
ERRCOD - error code
>,,<DB%NND>) ;[7.1210]
ENDIF.
RET
;WAIT FOR ANSWER
; ENTER HERE AFTER GET NEXT UNIT CALL FROM MESSAG AVAILABLE
MSGAA: CALL SETP3 ;CHECK FOR A UNIT FOUND
SKIPA ;UNIT NOT FOUND BUILD ONE
JRST MSGAV7 ;FOUND IT?? DOESN'T MATTER ONLINE IT
MOVE Q1,T1 ;GET UNIT NUMBER
LOAD T3,PKYEST,(Q2) ;YES. GET STATUS OF UNIT
CAIE T3,ST%AVL ;AVAILABLE?
JUMPN T3,RTNBUF ;NO. IF NOT ONLINE THEN WE CAN'T USE IT
TRNE Q3,TAPSID ;CHECK FOR TAPE
JRST MSCI22 ;YES ONLINE IT DIFFERENTLY
CALL UNTYPE ;SET UNIT TYPE FROM MEDIA TYPE IN PACKET
JRST RTNBUF ;NO ENTRY FOUND IN TABLE
HRLI P2,1(Q1) ;UNIT NUMBER+1 IN LH(P2) FOR SETUDB
CALL BLDUDB ;BUILD THE UDB
JRST RTNBUF ;NO SPACE TO CREATE THE UDB
TLZ P2,-1 ;CLEAR JUNK FROM LH OF P2
CALL PHYDUA ;(P3/) LOOK FOR ANOTHER UDB WITH SAME DSN
MSGAV3: MOVE T1,Q1 ;RECOVER UNIT NUMBER
MSGAV7: MOVEI P6,MSCGO1 ;SET RETURN TO MSSONL WHEN ONLINE SUCCESSFUL
ONLINA: CALL ONLINE ;ONLINE THE UNIT
JRST [ MOVE T3,T1 ;MOVE ERROR CODE
MOVE T1,MSCOLD(Q3) ;GET CONNECT ID
CALL SC.NOD ;(T1/T1,T2) GET NODE NUMBER
BUG.(INF,MSCOLF,PHYMSC,SOFT,<PHYMSC - Available online failed>,<<T2,NODE>,<T1,CID>,<T3,ERRCOD>>,<
Cause: An attempt to put an available unit online failed because of a send
failure. The remote node could have crashed during the online attempt.
Action: If this bug occurs often or is reproducible, change it to a BUGHLT and
submit an SPR along with a dump and instructions on reproducing it.
Data: NODE - node number
CID - connect ID
ERRCOD - error code
>,,<DB%NND>)] ;[7.1210]
RET
;WAIT FOR ONLINE TO COMPLETE
;HERE WHEN ONLINE RETURNS FROM MSGAV3. WE MUST CHECK TO SEE THAT
;WE ARE NOW SUCCESSFUL AND SET ONLINE.
MSSONL: LOAD T1,PKYEST,(Q2) ;CHECK TO SEE THAT ONLINE SUCCEEDED
JUMPN T1,BUGMSC
CALL SETP3
CALL NOONL ;CAN'T ONLINE A UNIT WE HAVE
CALL GETSER ;(Q2,P3/) RE SETUP UDBDSN,UDBDSH.
MOVE Q1,P.UNFL(Q2) ;SAVE UNIT FLAGS FOR FORMAT CHECK
CALL RTNBUF ;GIVE BUFFER BACK TO SCA
TXNE Q3,TAPSID ;CHECK FOR TAPE CONTROLLER
JRST TAPAVL ;TAPE AVAILABLE (CLEAN UP STUFF)
MOVE T1,UDBSTS(P3) ;GET STATUS
TXNE T1,US.TPD ;CHECK FOR TPD
RET ;YES FORGET USE OF THIS DISK
MOVE T1,Q1 ;GET THE UNIT FLAGS
CALL REVFUL ;SWAP BYTES
TXNN T1,UF.576 ;CHECK FOR 576 FORMAT
CALLRET PHYOFL ;OFFLINE THE THING IT ISN'T OURS
MOVX T1,UA.PAT ;CLEAR AND SET PAT ON CORRECT DRIVES
IORM T1,UDBALT(P3) ;SET PAT ON NEW DRIVE
HRRZ T2,UDBALT(P3) ;GET OLD DRIVE
SKIPE T2 ;CHECK AND SEE IF THE OLD ONE EXISTS
ANDCAM T1,UDBALT(T2)
CALL FLGHOM ;FLAG HOME BLOCKS NEED REREADING
CALL PHYONL ;INFORM PHYSIO
HRRZ P3,UDBALT(P3) ;OFFLINE THIS DRIVE
JUMPE P3,R ;QUIT IF NO ALTERNATE
MOVX T1,US.ACT ;CLEAR ACTIVE BITS
ANDCAM T1,UDBSTS(P3)
CALLRET PHYOFL ;AND QUIT
;ROUTINE TO FLAG UDB SO PHYSIO WILL REREAD HOME BLOCKS
;CALL WITH P3/UDB
FLGHOM: SAVEAC <P2>
MOVX T1,US.CHB ;NEED TO CHECK HOME BLOCKS
SKIPL UDBSTR(P3)
TXO T1,US.OIR ;OPR INTERVENTION IF IN A STR
IORM T1,UDBSTS(P3) ;MUST CHECK HOME BLOCKS
MOVX T1,US.ACT ;MAKE UNIT INACTIVE
ANDCAM T1,UDBSTS(P3) ; SO PHYSIO WILL DO HOME BLOCK CHECK
HRRZ T1,UDBALT(P3) ;IS THERE AN ALTERNATE UDB?
JUMPN T1,TW2PWQ ;YES GET ALL THE IORBS ONTO 1 QUEUE
MOVE P5,P3 ;SET UP TO MOVE TWQ TO PWQ
CALL TW2PW3
RET ;QUIT
TAPAVL: MOVX T1,US.WLK!US.OMS!US.OIR ;CLEAN UP WRITE LOCK
ANDCAM T1,UDBSTS(P3) ;BEFORE PUTTING TAPE BACK ONLINE
JRST PHYONL
SUBTTL Diag Online
;HERE FROM DIAG TO ONLINE A UNIT
;IT IS NOT OBVIOUS THAT THIS ROUTINE IS NECESSARY SINCE WE ARE
;SUPPOSED TO SEE ALL NODES/UNITS WHEN THEY COME ONLINE
;THEREFORE THERE IS NOTHING HERE...
REPEAT 0,<
;CALL: T1/NODE NUMBER
; T2/UNIT NUMBER
; CALL MSCOUN
;RETURNS +1 LOSE, +2 - WIN
MSCOUN::SAVEPQ
MOVE P6,T2 ;SAVE UNIT
SETZ Q3,
MSCOU1: CAIGE Q2,C%SBLL ;CHECK FOR END OF LIST
SKIPG T2,MSCCID(Q3) ;GET CID
RET
$LDCID T2,T2 ;CB ADDR
MOVE P2,.CBSBA(T2) ;SB ADDR
HRRZ T2,.SBDSP(P2) ;NODE NUMBER
CAME T1,T2 ;MATCH?
AOJA Q3,MSCOU1
CALL GETBUF ;YES, GET A BUFFER FROM SCA
RET ;NONE
LSH P6,4 ;POSITION UNIT CORRECTLY
MOVE T1,P6
CALL REVFUL ;SWAP THE BYTES
MOVEM T1,P.UNIT(Q2) ;SAVE WHERE WE EXPECT THE UNIT NUMBER
HRRZ P1,.SBACD(P2) ;POINT AT CDB
CALL INIUNI ;PRETEND WE JUST GOT AN AVAILABLE ATTENTION AND
RETSKP ; GO ONLINE THE UNIT
>
MSCOUN::RETSKP ;RETURN SUCCESS
BUGMSC: MOVE T3,T1 ;SAVE CODE
CAIN T3,ST%OFL ;IS IT OFFLINE? (REALLY POSSIBLE..)
CALLRET RTNBUF ;YES FORGET IT FOR NOW IT MAY SHOW UP LATER
MOVE T1,MSCOLD(Q3) ;GET CONNECT ID
CALL SC.NOD ;(T1/T1,T2) GET NODE NUMBER
BUG.(INF,MSCORO,PHYMSC,SOFT,<PHYMSC - Offline return to online when we were told avail>,<<T2,NODE>,<T1,CID>,<T3,CODE>>,<
Cause: A node that indicated an online is not available when the online is
attempted. The remote node could have crashed during the online
attempt.
Action: If this bug occurs often or is reproducible, change it to a BUGHLT and
submit an SPR along with a dump and instructions on reproducing it.
Data: NODE - node number
CID - connect ID
CODE - end packet status code
>,,<DB%NND>) ;[7.1210]
CALL RTNBUF
MOVE T2,MSCCID(Q3) ;INSURE WE HAVE CONNECT ID
CALL PBRCOA
BLCAL. (SC.DIS,<MSCCID(Q3),[0]>)
JFCL
SETOM MSCCID(Q3)
MOVX T1,DT.IDC
IORM T1,CIDATA(Q3)
RET
SUBTTL General Purpose Routines
;ROUTINE TO SET UP P3 WITH THE UDB ADDRESS
;CALL: Q2/PACKET ADDRESS
; P2/SYSTEM BLOCK ADDR. UNIT NUMBER IN P.UNIT
;RETURN+1 IF NO SUCH UDB EXISTS, WITH T1/UNIT NUMBER
;RETURN+2 WITH P3/UDB ADDR T1/UNIT NUMBER
SETP3: CALL SETSUN ;GET UNIT NUMBER
HRRZ T2,P2 ;JUST ADDRESS PART
MOVE T2,KDBIUN(T2) ;POINTER TO UDBS
SETP31: SKIPE P3,(T2) ;UNIT EXIST?
CAME T1,UDBSLV(P3) ;YES. IS IT THIS ONE?
AOBJN T2,SETP31 ;NO, TRY NEXT
JUMPL T2,RSKP ;RETURN SKIP IF FOUND A UDB
RET ;RETURN NO SUCH UNIT
;HERE ON SCA CALLBACK IF MORE CREDIT IS AVAILABLE
;WHEN MORE CREDIT IS AVAILABLE THEN WE MUST TRY TO UNQUEUE
;ANY REQUESTS THAT WERE DELAYED DUE TO LACK OF CREDIT. IF
;NOTHING WAS WAITING THEN WE JUST RETURN.
MSCCIA: ;FALL INTO UNQALL TO START WHAT WE CAN
;CHECK TO SEE IF ANY QUEUED REQUESTS ARE WAITING. IF SO, START WHAT WE CAN
MOVE Q1,T2 ;SAVE THE CONNECT ID
CALL FNDNDX ;GET THE KDB
RET ;NONE FOUND NO PROBLEM FORGET IT
MOVE P2,.CBSBA(T2) ;SET UP THE KDB POINTER
MOVE P1,CHNTAB+KLPRH2 ;GET THE CHANNEL POINTER
CALLRET UNQALL ;RESTART ALL UNITS ON THIS KDB
;ROUTINE TO UNQUEUE REQUESTS FOR A SINGLE NODE
;CALL P2/KDB FOR THE NODE
;RETURNS +1 ALWAYS
UNQALL: MOVE T1,KDBCUN(P2) ;WHERE WE LAST LEFT OFF
UNQNO1: SKIPN P3,(T1) ;UNIT EXIST?
JRST UNQNO5
CALL UNQUNT ;UNQUEUE FOR THIS UNIT
RET ;ALL DONE CAN'T QUEUE
UNQNO5: AOBJN T1,UNQNO1 ;NO, STEP TO NEXT UNIT
RET
;UNQUNT -- ROUTINE TO UNQUEUE AND RE-START FOR A GIVEN UNIT
;P1/CHN P2/KDB P3/UDB
;
UNQUNT: SAVET ;SAVE A FEW REGISTERS
SETZM QUEREQ ;INDICATE NO REQUEUE
UNQLOP: HRRZ T2,UDBPWQ(P3) ;YES. PWQ NON-EMPTY?
JUMPE T2,RSKP
MOVE T2,UDBSTS(P3) ;ON LINE AND NOT REREADING HOME BLOCKS??
TXNE T2,US.OFS!US.CHB
JRST RSKP ;NO. TRY ANOTHER UNIT
HRRZ T2,UDBTWQ(P3) ;YES. IF DISK IS NOT IN A STR
SKIPGE UDBSTR(P3) ; THEN ONLY ALLOW 1 REQUEST TO BE OUTSTANDING
JUMPN T2,RSKP
CALL OFFPWQ ;PULL 1ST REQUEST FROM PWQ
MOVE P4,T1 ;WHERE MSCSIO WANTS IORB ADDRESS
CALL ONFTWQ
CALL MSCSIO ;START THE IO
JRST [ BUG.(CHK,MSCSIF,PHYMSC,SOFT,<PHYMSC - Start IO failed>,<<P3,UDB>,<P2,KDB>,<P1,CHAN>>,<
Cause: A call to MSCRIO failed when it was not expected to in UNQUNT. This
appears to be a PHYMSC problem.
Action: If this bug occurs often or is reproducible, change it to a BUGHLT and
submit an SPR along with a dump and instructions on reproducing it.
Data: UDB - UDB address
KDB - KDB address
CHAN - Channel number
>)
RET]
SKIPN QUEREQ ;DID WE FAIL AND REQUEUE?
JRST UNQLOP ;NO TRY ANOTHER REQUEST
RETSKP ;YES. DONE WITH THIS NODE
;ROUTINE TO MOVE ALL THE REQUESTS FROM THE PRIMARY AND ALTERNATE
;QUEUE'S TO THE PWQ OF THE PRIMARY UDB. THIS PERMITS UNIT SWITCHING
;AND ASSURES THAT THERE ARE NO LOST TRANSFERS ON THE UNUSED UDB.
;
;CALL T1/ UDB OF OLD REQUESTS
; P3/ UDB OF NEW REQUESTS
;RETURNS +1 ALWAYS
TW2PWQ::SAVEPQ ;SAVE A LOT OF REGISTERS FIRST
SAVET ;OR POLLER WILL HATE US
MOVE Q3,T1 ;SAVE THE OLD UDB ADDRESS
MOVE P5,P3 ;WHERE TO STORE THE TWQ
CALL TW2PWP ;MOVE THE NEW UDB TO PWQ
EXCH Q3,P3 ;MOVE THE OLD UDB
MOVX T1,US.CHB!US.OMS!US.OIR ;CLEAR UP FLAGS IN OLD UDB
ANDCAM T1,UDBSTS(P3)
CALL TW2PWP
TW2PWE: HRRZ T1,UDBPWQ(P3) ;ANYTHING ON OLD PWQ?
JUMPE T1,R ;NO QUIT NOW
CALL OFFPWQ ;REMOVE IT
EXCH P3,P5 ;WHERE TO PUT IT
CALL ONFPWQ ;STORE IT ON QUEUE
EXCH P3,P5 ;AND TRY NEXT ENTRY
JRST TW2PWE
;ROUTINE TO MOVE THE ENTRIES FROM THE TWQ TO THE PWQ
; CALL /P3 SOURCE UDB
; /P5 DESTINATION UDB
; RETURNS +1 ALWAYS
TW2PW3: SAVEQ ;SAVE A FEW REGS
TW2PWP: HRRZ T1,UDBTWQ(P3) ;PICK UP IORB
JUMPE T1,R ;DONE IF 0
CALL OFFTWQ ;PULL FIRST ITEM FROM TWQ
MOVE Q2,T1 ;SAVE THE IORB ADDRESS
HRRZ P2,UDBKDB(P3) ;GET KDB ADDRESS
HRRZ Q1,.SBQOR(P2) ;PICK UP THE BEGINNING OF QOR TABLE
TW2PW5: HRRZ T2,QORIRB(Q1) ;GET THE IRB ADDRESS
CAIN T1,(T2) ;IS IT THE RIGHT ONE?
JRST TW2PW2 ;YES EXTRACT IT
HRRZ Q1,QORLNK(Q1) ;NOPE TRY NEXT ONE
CAIE Q1,.SBQOR(P2) ;END OF LIST?
JRST TW2PW5 ;NOPE TRY NEXT ONE
JRST TW2PW4 ;NOT FOUND COULD BE NOT QUEUE'D YET
TW2PW2: SKIPE T1,QORBHD(Q1) ;BHD THERE?
CALL RTNBHX ;YES RETURN IT
CALL ULKQOR ;RETURN QOR
TW2PW4: HRRZ T1,Q2 ;RESTORE IORB
CAMN T1,UDBCHB(P3) ;HOMEBLOCK IORB?
JRST [ CALL CLRCHB ;YES RELEASE IT
JRST TW2PWP] ;AND FORGET IT
EXCH P5,P3 ;WHERE WE WANT ENTRY PUT
CALL ONFPWQ ;AND INSERT IT ON PWQ
EXCH P5,P3 ;RESTORE UDB
JRST TW2PWP ;LOOK FOR ANOTHER
;**** TEMP KILL ROUTINE FOR TAPES*****
PHYMKL::HRLZI T1,UDBPWQ(P3) ;ZERO QUEUE
EXCH T1,UDBPWQ(P3) ;TAKE ALL THE CURRENT ENTRIES
HRRZS T1 ;ZERO LEFT HALF JUNK
RET ;RETURN
CLRCHB: SAVET ;SAVE A COUPLE OF REGISTERS
MOVX T1,IS.ERR ;INDICATE OFFLINE
MOVE T2,UDBCHB(P3) ;GET IORB ADDRESS
IORM T1,IRBSTS(T2) ;STORE THE STATUS
RET ;AND RETURN
;ROUTINE TO UNLINK AND FREE UP A QOR
;CALL Q1/QOR LOC
;RETURNS +1 ALWAYS
ULKQOR: HRRZ T2,QORLNK(Q1) ;FORWARD-POINTER
HLRZ T3,QORLNK(Q1) ;BACKWARD-POINTER
HRRM T2,QORLNK(T3) ;LINK AROUND THIS QOR
HRLM T3,QORLNK(T2)
SETZM QORLNK(Q1) ;INDICATE THE QOR IS AVAILABLE
SETZM QORCRF(Q1) ;SO WE CAN CATCH DUPLICATES
SETZM QORBHD(Q1) ;CLEAR THE BHD ADDRESS JUST IN CASE
SETZM QORIRB(Q1) ;AND IORB JUST IN CASE
RET
;ROUTINE TO PUT AN IORB ON THE FRONT OF THE TWQ
;CALL P3/UDB
; P4/IORB
;RETURNS +1 IORB DOESN'T APPEAR ANYWHERE ON TWQ
;RETURNS +2 NORMALLY, IORB ON THE FRONT OF THE QUEUE
FRONTW: HRRZ T1,UDBTWQ(P3) ;GET 1ST ITEM ON TWQ
JUMPE T1,R ;NONE FOUND
CAIN T1,(P4) ;IS IT THIS IORB?
RETSKP ;YES, NO NEED TO FIDDLE WITH TWQ
FRONT1: HRRZ T2,IRBLNK(T1) ;NO. STEP TO NEXT IORB IN QUEUE
JUMPE T2,R ;CAN'T FIND IORB
CAIN T2,(P4) ;IS THIS THE ONE?
JRST FRONT2 ;YES
MOVE T1,T2 ;NO, TRY ONE MORE
JRST FRONT1
FRONT2: CALL CONSTW ;REMOVE THE IORB FROM THE TWQ
MOVE T1,P4
CALL ONFTWQ ;AND INSERT IT AT THE FRONT OF THE QUEUE
RETSKP ;GOOD RETURN
SUBTTL PHYSIO Interface
;MSCEXT - CHECK FOR LEGALITY OF A UNIT
; ENTER Q2/UNIT NUMBER
; EXIT NON-SKIP IF BAD NUMBER
; EXIT SKIP IF OK, P3/UDB
MSCEXT: SKIPL Q2 ;NEGATIVE
CAILE Q2,MAXUNN ;OR GREATER THAN HIGHEST USED NUMBER
JRST RFALSE ;GETS T1=-1
MOVE T1,KDBIUN(P2) ;AOBJN WORD FOR ALL UNITS
MSCEX1: SKIPE P3,(T1) ;GET A UNIT
CAME Q2,UDBSLV(P3) ;RIGHT ONE?
AOBJN T1,MSCEX1
JUMPL T1,RSKP ;MATCH - GOOD RETURN
JRST RTRUE ;NO MATCH
REPEAT 0,<
;HERE TO ABORT ALL TRANSFERS CURRENTLY IN PROGRESS ON A UNIT
;CALL P2/SYSTEM BLOCK
; P3/UDB ADDRESS
MSCABT: SAVEQ
HRRZ Q1,.SBQOR(P2) ;POINT AT 1ST THING ON THE QUEUE
HLRZ Q3,UDBKDB(P3) ;POINT AT MSCCID INDEX
MSCAB1: CAIN Q1,.SBQOR(P2) ;END OF QUEUE?
RET ;YES. DONE
HLRZ T1,QORUNI(Q1) ;UDB
CAIE T1,(P3) ;IS IT FOR THIS UNIT?
JRST MSCAB2 ;NO, TRY NEXT QOR
CALL GETBUF ;GET A BUFFER
RET ;NONE FOUND
MOVE T1,UDBSLV(P3) ;YES. GET MSCP UNIT NUMBER
MOVEI T2,OP.ABO ;ABORT THE REQUEST
MOVE T3,QORCRF(Q1) ;COMMAND REF NUMBER TO ABORT
MOVEM T3,P.OTRF(Q2) ;PUT IT INTO THE PACKET
MOVEI T3,P%OTRF ;LENGTH PF MESSAGE
SETO P6, ;SHOULDN'T NEED TO WORRY ABOUT RETURN
CALL SENDPK ;TELL THE HSC TO ABORT THIS COMMAND
SKIPE T1,QORBHD(Q1) ;BUFFER NAME ASSOCIATED WITH REQUEST
CALL RTNBHX ;RETURN THE RESOURCES
HRRZ Q2,QORLNK(Q1) ;GET LINK TO NEXT QOR
CALL ULKQOR ;RETURN THE QOR
SKIPA Q1,Q2 ;LOOK AT LINK OF THIS QOR
MSCAB2: HRRZ Q1,QORLNK(Q1) ;STEP TO NEXT QOR IN CHAIN
JRST MSCAB1 ;AND SEE IF IT'S FOR THE BAD UNIT
> ;END REPEAT
SUBTTL Initialization
;
; INITIALIZATION IS CALLED BY PHYSIO TO DETERMINE WHAT DEVICES
; ARE ON THE CI. THE FIRST THING THAT WE MUST DO IS TO CHECK THE
; TIME SINCE WHEN IT BECOMES AVAILABLE WE MUST SEND THE TIME TO
; EACH HSC CONTROLLER.
MSCINI::
SETOM HAVTIM ;INDICATE TIMES NOT YET SET IN SERVERS
SETZM MSCHSC ;INITIALIZE THE CONTROLLER TIMER WORD
SETOM MSCITD ;SET INITIALIZED FLAG
MSCINA: BLCAL. (SC.SOA,<<.,INTRPT>>) ;TELL ME WHEN A NODE COMES OR GOES
BUG.(HLT,MSCSOA,PHYMSC,SOFT,<PHYMSC - SC.SOA failed>,<<T1,ERRCOD>>,<
Cause: Interrupts were requested and failed. This has to be a SCAMPI problem.
Data: ERRCOD - Error Code
>)
SETZB Q3,Q1 ;Q3 COUNTS MSCP CONTROLLERS, START AT 1ST SB
SETOM MSCINF ;SET INIT FLAG
SKIPA Q2,MSCINF ;SET INIT FLAG
;FALL INTO MSCIN1
; WE ENTER HERE BOTH AT INIT TIME AND WHEN A UNIT IS TO BE
; CONNECTED BECAUSE THE POLLER HAS LOST THE UNIT AND WANTS
; TO TRY AGAIN. THE FIRST THING WE DO IS TO GET THE TYPE
; OF NODE AND THEN WHEN WE DETERMINE THAT IT IS A HSC WE
; CONNECT TO IT. AFTER THE CONNECT COMPLETES WE WILL GET A
; CONNECT RESPONSE AVAILABLE WHICH WILL TELL US THAT WE
; CAN SUCCESSFULLY TALK TO THE HSC ON THE OTHER END. WE THEN
; SET SET CONTROLLER CHARACTERISTICS AND LOOK TO SEE WHAT TYPE
; OF DEVICE IS ON THE CONTROLLER. ONCE WE FIND THAT IT IS REASONABLE
; WE THEN DO A GET NEXT UNIT STATUS TO FIND OUT WHAT ALL THE
; UNIT TYPES. THIS THEN LEADS US TO TRY TO ONLINE THE UNITS AND
; SET THEM AVAILABLE FOR PHYSIO USE.
;ENTERED HERE IF NODE ONLINE INTERRUPT
MSCIN1: SETZ Q2,
MSCINZ: HRRZ T1,Q1 ;ISOLATE ADDRESS PORTION
SKIPN SBLIST(Q3) ;DO WE EXIST?
JRST MSCI18 ;NO THEN THERE IS NOTHING TO DO
MOVX T2,DT.IRC ;RELOADING ALREADY?
TDNE T2,CIDATA(Q3)
JRST MSCI18 ;YES IGNORE IT
SETOM MSCCID(Q3) ;INDICATE IN USE
MOVE T1,[XWD .RESP1,.RDLEN] ;PRIORITY,,LENGTH OF FREE SPACE
MOVEI T2,.RESGP ;GET SPACE FROM RESIDENT FREE POOL
CALL ASGRES ;(T1,T2/T1) OBTAIN BLOCK
JRST MSCI18 ;ERROR - COULD NOT GET A FREE SPACE BLOCK
MOVEM T1,T2 ;SAVE BLOCK ADDRESS
HRRZ T1,Q1 ;GET NODE NUMBER
BLCAL. (SC.RCD,<<T1>,<T2>>) ;GET CONGIFGURATION OF THIS NODE
JRST [ MOVE T1,T2 ;GET BLOCK ADDRESS
CALL RELRES ;(T1) RETURN BLOCK TO FREE POOL
JRST MSCI18]
MOVE T1,[BYTE (8) "T","-","2","0"]
CAMN T1,.RDDST(T2) ;IS IT TOPS-20?
JRST [ MOVX T1,DT.KL ;YES, SET KL FLAG
IORM T1,CIDATA(Q3) ;SET IN DATA FLAG
JRST MSCINN] ;RETURN TO COMMON CODE
MOVE T1,[BYTE (8) "H","S","C"," "]
CAME T1,.RDDST(T2) ;IS IT HSC?
JRST [ MOVE T1,T2 ;NO, GET BLOCK ADDRESS
CALL RELRES ;(T1) RETURN BLOCK TO FREE POOL
JRST MSCI18] ;NO, DON'T WANT TO TALK TO IT
MSCINN: MOVE T1,T2 ;GET BLOCK ADDRESS
CALL RELRES ;(T1) RETURN BLOCK TO FREE POOL
MSCIND: HRRZ T1,Q1 ;ELIMINATE POSSIBLE LH NON-0
MOVX T2,DT.KEP ;CLEAR STATUS
ANDM T2,CIDATA(Q3)
MOVX T2,DT.IRC ;INDICATE WE ARE RECONNECTING
IORM T2,CIDATA(Q3) ;SET RECONNECTING
BLCAL. (SC.CON,<<.,OURDNM>,<.,YURDNM>,T1,[DCREDT],[DCREDT],<.,INTRPT>,Q3,[0],[HSCBFN],[DGNUM]>) ;CONNECT TO THE MSCP SERVER
JRST [ MOVE T2,HAVTIM ;GET TIME POLLER STARTUP
CAIN T1,KLPX9 ;VC OPEN?
CAIL T2,10 ;NO CHECK FOR TOO SOON
SKIPE CIBUGX ;[7.1193]CI DEBUGGING?
BUG.(INF,MSCCDF,PHYMSC,SOFT,<PHYMSC - Connect to disk failure>,<<Q1,NODE>,<T1,ERRCOD>>,<
Cause: A connect failure to use the disks on an HSC occurred after an
indication that an HSC was present. Connection attempts are not timed
out by SCAMPI. If PHYMSC is in the middle of connecting to a server on
another node, and that node crashes, these BUGCHKs continue to appear
until that node reappears.
Action: Bring up the remote node as soon as possible. No other action is
required.
Data: NODE - node number
ERRCOD - error code
>,CONFLD,<DB%NND>) ;[7.1210] Go to CONFLD when done
JRST CONFLD]
MOVEM T1,MSCOLD(Q3) ;SAVE CONNECT ID FOR ABORT
JUMPG Q2,R ;RETURN IF ONLY THIS ONE WANTED
TAPCON: JRST MSCI18 ;TEMP!!!
;TAPCON: JFCL ;PUT ABOVE IN IF YOU DON'T LIKE TAPES
;TAPCON:
TXO Q3,TAPSID ;SET INDICATOR THAT THIS IS A TAPE
MOVX T2,DT.KEP ;CLEAR STATUS
ANDM T2,CIDATA(Q3)
MOVX T2,DT.IRC!DT.TAP ;SET RELOADING AND TAPES
IORM T2,CIDATA(Q3)
SETOM MSCCID(Q3)
HRRZ T1,Q1 ;GET SBI
BLCAL. (SC.CON,<<.,OURTNM>,<.,YURTNM>,T1,[TCREDT],[TCREDT],<.,INTRPT>,Q3,[0],[HSCBFT],[DGNUM]>)
BUG. (INF,MSCCTF,PHYMSC,SOFT,<PHYMSC - Connect to tape failure>,<<Q1,NODE>,<T1,ERRCOD>>,<
Cause: A connect failure to use the tapes on an HSC occurred after an
indication that an HSC was present. Connection attempts are not timed
out by SCAMPI. If PHYMSC is in the middle of connecting to a server on
another node, and that node crashes, these BUGCHKs continue to appear
until that node reappears.
Action: Bring up the remote node as soon as possible. No other action is
required.
Data: NODE - node number
ERRCOD - error code
>,TACFAL)
MOVEM T1,MSCOLD(Q3) ;SAVE CONNECT ID FOR ABORT
TXZ Q3,TAPSID ;NO LONGER TAPES SETUP
JRST MSCI18
;HERE ON FAILURE OF TAPES TO CONNECT
TACFAL: MOVX T2,DT.KEP ;CLEAR STATUS
ANDM T2,CIDATA(Q3)
MOVX T2,DT.GAW ;INDICATE GONE
IORM T2,CIDATA(Q3)
TXZ Q3,TAPSID ;NO LONGER WORKING ON TAPES
JRST MSCI18
;HERE AFTER CONFAL BUGCHECK
; THE CONNECT HAS FAILED AND WE MUST CLEAR THE CONNECT IN PROGRESS
; FLAGS AND INDICATE THAT THE CONTROLLER HAS GONE AWAY. THIS WILL
; CAUSE THE POLLER TO TRY AGAIN LATER WHEN THE HSC MAY HAVE RECOVERED.
CONFLD: MOVX T2,DT.KEP ;CLEAR STATUS
ANDM T2,CIDATA(Q3)
MOVX T2,DT.GAW
IORM T2,CIDATA(Q3) ;MARK GONE SO WE WILL TRY LATER
JRST MSCI18 ;TRY NEXT NODE
;ENTERED HERE IF ONLY A SINGLE NODE AND TYPE REQUIRED
MSCIN2: SAVEQ ;SAVE A COUPLE OF REGISTERS TO KEEP POLLER HAPPY
MOVEI Q2,1 ;INDICATE WE CAME FROM POLLER AND ONLY WANT 1 CONNECT
MOVX T2,DT.IRC ;CHECK FOR RELOADING
TDNE T2,CIDATA(Q3) ;ARE WE?
RET ;YES QUIT
TXNE Q3,TAPSID ;TAPE?
JRST TAPCON ;YES HANDLE THIS CONNECT ONLY
JRST MSCIND ;NO DO DISK
;ENTER HERE TO LOOP OVER ALL THE UNITS TO DO CONNECTS.
;
MSCI18: AOJA Q3,MSCI23 ;COUNT A CONTROLLER
;HERE WHEN WE OBTAIN A TAPE UNIT
MSCI20: CALL SETP3 ;SET UP P3 IF IT EXISTS
SKIPA ;NOT THERE
JRST MSCI22 ;FOUND THE UNIT USE IT
HRLOI Q1,-MTAN-1 ;YES. DRIVE IS THERE. FIND SLOT TO SAVE IT
MSCI21: AOBJP Q1, [BUG.(INF,MSCN2S,PHYMSC,HARD,<PHYMSC - More tape drives than table space, excess ignored>,<<P2,KDB>,<P1,CHN>>,<
Cause: The number of tape drives available exceeds the constant value MTAN.
Only MTAN drives can be configured.
Action: The monitor should be rebuilt after changing MTAN in STG with a value
of MTAN large enough to accommodate all the tape drives available to
the system.
Data: KDB - KDB address
CHN - Channel number
>,,<DB%NND>) ;[7.1210]
MOVE T1,P2
JRST RTNBUF]
SKIPE MTCUTB(Q1) ;CHECK TO SEE IF UNIT FREE
JRST MSCI21 ;NOPE TRY NEXT ONE
BLOCK.
SAVEAC <Q1,Q2>
LDB Q2,PKYNOD ;NODE NUMBER IS THE UNIT NUMBER
MOVE T3,[MSCDSP,,LU.TAP] ;YES, SET UP ADDRESS,,LENGTH
CALL PHYUDB ;AND ASK FOR UDB ALLOCATION
RET ;EXIT BLOCK NONSKIP
RETSKP ;EXIT BLOCK SKIPPING
ENDBK.
JRST RTNBUF ;RETURN NO SPACE FOUND
CALL SETUDB ;SET UP UDB
JRST RTNBUF
HRLZM P1,MTCUTB(Q1) ;SAVE LINK TO CDB IN LOGICAL TABLE
HRRM P3,MTCUTB(Q1) ;SAVE LINK TO UDB
MSCI22: MOVE T1,P.UNFL(Q2) ;UNIT FLAGS
CALL REVFUL ;MAKE THEM SENSIBLE
MOVX T2,US.TAP!US.CIP ;UNIT IS A CI TAPE
TXNE T1,UF.SWP!UF.HWP
TXO T2,US.WLK ;WRITE LOCKED
LOAD T1,PKYEST,(Q2)
CAIN T1,ST%OFL
TXO T2,US.OFS ;OFF LINE
HLLM T2,UDBSTS(P3) ;SAVE STATUS
MOVX T2,.UTTA7
STOR T2,USTYP,(P3) ;DRIVE IS A TA78
MOVE T1,P.FMEN(Q2) ;SPEEDS/FORMATS DRIVE IS CAPABLE OF
CALL REVFUL ;MAKE IT UNDERSTANDABLE
MOVX T2,UC.CD!UC.IC!UC.HD ;MODES - CORE DUMP, IND COMPAT, HIGH DENS
TXNE T1,FM.800
TXO T2,UC.800 ;NRZI 800 BPI
TXNE T1,FM.PE
TXO T2,UC.160 ;PE 1600 BPI
TXNE T1,FM.GCR
TXO T2,UC.625 ;GCR 6250 BPI
MOVEM T2,UDBCHR(P3) ;SAVE IN UDB
SKIPGE UDBSTS(P3) ;OFF LINE?
JRST MSCI17 ;YES, CAN'T DO AN ONLINE
MOVE T1,P.FORM(Q2) ;FORMAT
CALL REVFUL ;MAKE IT INTELLIGIBLE
TXNE T1,FM.800
MOVX T2,.SJDN8 ;800 BPI
TXNE T1,FM.PE
MOVX T2,.SJD16 ;1600 BPI
TXNE T1,FM.GCR
MOVX T2,.SJD62 ;6200 BPI
MOVEM T2,UDBDEN(P3) ;SAVE DENSITY WHERE MAGTAP WANTS TO SEE IT
;***************************************************************************
;SINCE THERE IS NO WAY TO GAIN EXCLUSIVE USE OF A TAPE,
;WE WILL EVENTUALLY GO TO A METHOD WHERE OPR WILL DO A JSYS WHICH WILL
;LIGHT A BIT IN THE UDB. WE WILL ONLY ONLINE A TAPE IF THE BIT IS ON
;***************************************************************************
JRST MSCI14 ;GO DO AN ONLINE TO THE DRIVE
;WHEN WE GET HERE WE MUST CHECK TO SEE IF THIS IS INIT TIME.
;IF SO THEN WE TRY TO CHECK EACH KNOWN NODE. OTHERWISE WE
;JUST RETURN TO THE CALLER. THE INTERRUPT SERVICE STUFF WILL
; EVENTUALLY BRING THE UNITS ONLINE.
MSCI23: JUMPGE Q2,R ;DONE IF NOT INIT
CAIGE Q1,C%SBLL-1 ;YES, AT TOP?
AOJA Q1,MSCINZ ;NO, TRY NEXT CONTROLLER
RET ;RETURN TO SCA
;HERE TO FINISH UP ON A NEW/RETURNED NODE DURING T/S
MSCI27: JUMPGE Q1,R ;GO AWAY IF A NEW NODE
;***************************************************************************
;THE QUEUED REQUESTS HAVE BEEN MOVED TO THE PWQ. THEY WILL GET
;REPLAYED AFTER THE HOME BLOCKS HAVE BEEN CHECKED, BUT ALL OF THEM WILL GET
;PUT ON THE TWQ AT ONCE. THE MSCP SPEC SAYS THAT IT WOULD BE BETTER
;(BUT NOT MANDATORY) TO DO THEM ONE AT A TIME, NOT ASKING FOR ONE UNTIL THE
;PREVIOUS ONE FINISHES. TO DO THIS WE WOULD NEED A UDBSTS BIT
;***************************************************************************
RET ;AND RETURN TO SCA
MSCI78: CALL SETSUN ;SET UNIT NUMBER
MOVE T3,T1 ;SAVE UNIT NUMBER
MOVE T1,MSCOLD(Q3) ;GET CONNECT ID
CALL SC.NOD ;(T1/T1,T2) GET NODE NUMBER
BUG.(INF,MSCCWM,PHYMSC,HARD,<PHYMSC - Controller not in 576 mode>,<<T2,NODE>,<T1,CID>,<T3,UNIT>>,<
Cause: The HSC controller is not in 576 bytes per sector mode. It cannot be
used by TOPS-20 unless it is in 576 bytes per sector mode.
Action: Set the HSC in 576 mode.
Data: NODE - node number
CID - connect ID
UNIT - unit number
>,,<DB%NND>) ;[7.1210]
JRST RTNBUF ;QUIT CAN'T USE THIS HSC50
MSCI38: CALL SETSUN ;GET UNIT NUMBER
MOVX T3,US.UNA ;SET UNAVAILABLE
IORM T3,UDBSTS(P3)
MOVE T3,T1 ;SAVE UNIT NUMBER
MOVE T1,MSCOLD(Q3) ;GET CONNECT ID
CALL SC.NOD ;(T1/T1,T2) GET NODE NUMBER
BUG.(INF,MSCDWM,PHYMSC,HARD,<PHYMSC - Disk not in 576 mode>,<<T2,NODE>,<T1,CID>,<T3,UNIT>>,<
Cause: A disk unit is not a 576 bytes per sector disk. The disk unit will not
be used. This bug will be seen when a 16 bit HDA (used on VAX systems)
is connected to a HSC that TOPS-20 is trying to use.
Action: No action is required, this bug is for information only.
Data: NODE - node number
CID - connect ID
UNIT - unit number
>,,<DB%NND>) ;[7.1210]
JRST MSCI15
; ENTER HERE FROM A CONNECT RESPONSE AVAILABLE THAT WAS SUCCESSFUL.
; WE NOW WANT TO SET CONTROLLER CHARACTERISTICS AND FIND OUT IF THE DISK
; OR TAPE IS ONE THAT WE AN USE.
; ENTERED P2 = KDB
MSCIN5: MOVEI P6,MSC5A ;RETURN TO MSC5AA ON RETURN FROM SET CHARACTERISTICS
CALL SETCCH ;SET CONTROLLER CHARACTERISTICS
SKIPG T3,MSCCID(Q3) ;CHECK FOR VALID CONNECT ID
RET ;ALL OK QUIT
EXCH T1,T3 ;SWAP ERROR CODE AND CID
CALL SC.NOD ;(T1/T1,T2) GET NODE NUMBER
BUG.(INF,MSCSCF,PHYMSC,SOFT,<PHYMSC - SETCCH failed to set characteristics>,<<T2,NODE>,<T1,CID>,<T3,ERRCOD>,<Q3,INDEX>>,<
Cause: SETCHH failed to set characteristics. This appears to be a hardware
problem with the remote node.
Action: Field Service should check the remote node's hardware.
Data: NODE - node number
CID - connect ID
ERRCOD - error code
INDEX - MSCCID table index
>)
RET
;WAIT FOR SET CHARACTERISTICS TO URN
; ENTER HERE ON RETURN FROM SETCCH
; NOW WE MUST CHECK TO SEE THAT THIS IS REALLY USEFUL TYPE DISK
; AND THEN WE WILL TRY TO LOOK AT ALL THE UNITS ON THIS HSC TO
; SEE IF THEY ARE USABLE
;
MSC5AA: MOVE T1,P.CNTF(Q2)
CALL REVFUL ;REVERSE THE BYTES FROM THE HSC
TXNN T1,CF.576 ;DOES IT SUPPORT 576 BYTE XFERS?
TXNE Q3,TAPSID ;CHECK FOR TAPE DRIVE
SKIPA ;YES MUST BE OK
JRST MSCI78 ;NO. FORGET IT!
DMOVE T1,P.CNTI(Q2) ;NEW - CONTROLLER ID
DMOVEM T1,KDBCID(P2)
MOVE P3,P2 ;NEED POINTER OF KDB ALSO IN P3
MOVEI T1,.BTKDB ;MARK AS A KDB
DPB T1,USYBKT ;SET .BTKDB IN KDB
MOVEI T1,.UTHSC ;GET CODE FOR HSC50
STOR T1,USTYP,(P2) ;AND STORE IT INTO THE KDB
MOVEI T1,MSCDSP ;GET CONTROLLER/UNIT DISPATCH VECTOR
MOVEM T1,KDBDSP(P2) ;PUT IT IN KDB
MOVX T1,KS.DSK ;GET FLAG READY
TRNN Q3,TAPSID ;CHECK FOR TAPE
IORM T1,KDBSTS(P2) ;REMEMBER THAT THIS CONTROLLER DRIVES DISKS
MOVE T1,P.CTMO(Q2) ;GET CONTROLLER TIMEOUT
CALL REVFUL ;MAKE IT USABLE
LOAD T1,LOBYTE,T1 ;GET THE LOW ORDER BYTE (THE ACTUAL TIMEOUT)
CAIG T1,12 ;CHECK FOR TIMEOUT OF 10
MOVEI T1,12 ;INSURE IT IS 10
IDIVI T1,TIMOUT ;COMPUTE NUMBER OF OUR TIMEOUTS
SKIPE T2 ; IN 1 OF THEIRS
ADDI T1,1
LSH T1,1 ;HSC PEOPLE LIKE *2 TIMEOUT
MOVEM T1,MSCTMO(Q3) ;SET UP TIMEOUT INTERVAL
MOVEM T1,MSCINT(Q3) ;SAVE THE TIMEOUT INTERVAL
MOVX T1,DT.NXU ;SET UP NEXT UNIT FIRST PASS
IORM T1,CIDATA(Q3)
MSCIN7: HRRZ P2,P2 ;START AT THE FIRST UNIT
SKIPA
MSCIN8: ADD P2,[1,,0] ;ADD 1 TO UNIT NUMBER SO WE DON'T GET OURSELVES TWICE
HLRZ T1,P2
MOVEI P6,MSCA8 ;RETURN FROM NEXTUN TO MSCIA8
CALL NEXTUN ;ASK THE HSC WHAT THE NEXT UNIT IS
SKIPG T3,MSCCID(Q3) ;CHECK FOR LEGAL CONNECT ID
RET ;DONE
EXCH T1,T3 ;SWAP ERROR CODE AND CID
CALL SC.NOD ;(T1/T1,T2) GET NODE NUMBER
BUG.(INF,MSCNXF,PHYMSC,SOFT,<PHYMSC - Get next unit failed>,<<T2,NODE>,<T1,CID>,<T3,ERRCOD>,<Q3,INDEX>>,<
Cause: Get a next unit failed. All the units on this HSC50 may not be found.
This is seen most often with broken HSC hardware.
Action: If the hardware checks out OK, and if this bug occurs often or is
reproducible, change it to a BUGHLT and submit an SPR along with a dump
and instructions on reproducing it.
Data: NODE - node number
CID - connect ID
ERRCOD - error code
INDEX - MSCCID table index
>)
RET
;RETURN FROM INTERRUPT AND WAIT TILL
;
; RETURN FROM MSCIN8 CALL TO NEXTUN
; THIS WILL HAVE THE NEW UNIT ON THE HSC STORED IN THE PACKET
; WE MUST CHECK TO SEE IF THAT UNIT IS AVAILABLE AND IF SO
; THEN WE CAN SET IT ONLINE.
;
; ENTERED WITH P2 = KDB,Q2 = PACKET ADDRESS
MSCIA8: CALL SETSUN ;GET UNIT NUMBER
JUMPN T1,MSCI8A ;NOT UNIT 0 THEN NOT DONE
LOAD T3,PKYEST,(Q2) ;GET STATUS
CAIN T3,ST%OFL ;CHECK FOR OFFLINE
JRST RTNBUF ;GO AWAY WE ARE NOT INTERESTED IF NO DRIVES
MOVE T3,CIDATA(Q3) ;IS THIS THE FIRST TIME?
TXNN T3,DT.NXU ;IS THIS NEXT UNIT
JRST RTNBUF ;QUIT ALL DONE
MSCI8A: MOVX T3,DT.NXU ;CLEAR NEXT UNIT FLAG
ANDCAM T3,CIDATA(Q3) ;IN STATUS
HRLI P2,1(T1) ;REMEMBER NEXT UNIT NUMBER
TRNE Q3,TAPSID
JRST MSCI20 ; GO ELSEWHERE WHEN WE FIND A UNIT
SKIPE MSCINF
JRST MSCIN9 ;IF AN OLD CONTROLLER COMING BACK
CALL SETP3 ;SEARCH FOR THIS UNIT'S UDB
JRST MSCIN9 ;NO SUCH UDB. BUILD A NEW ONE
MOVX T1,UA.PAT ;OLD UDB. CLEAR PORT-ATTACHED BIT
ANDCAM T1,UDBALT(P3) ; SINCE IT IS CURRENTLY NOT ATTACHED AT ALL
HRLM Q3,UDBKDB(P3) ; SET UP THE NEW SERVER NUMBER
SETZ P4, ;THIS DISK IS A KNOWN TYPE
JRST MSCI12 ;GO USE THE UDB
MSCIN9: LOAD T3,PKYEST,(Q2) ;STATE OF UNIT
CAIE T3,ST%OFL ;OFF LINE?
JRST MSCI10 ;NO
LOAD T3,PKYQSB,(Q2) ;YES. GET REASON FOR OFFLINE
CAIE T3,SB%NVM ;NO VOLUME MOUNTED?
JRST MSCIN8 ;UNIT IS NG, LOOK FOR NEXT
TLO P1,-1 ;REMEMBER UNIT IS OFF-LINE
JRST MSCI11
MSCI10: CAIE T3,ST%AVL ;UNIT IS NOT OFF LINE. AVAILABLE?
JUMPN T3,MSCIN8 ;NOT AVAILABLE. IF NOT ONLINE THEN WE CAN'T USE IT
MSCI11: CALL UNTYPE ;SET UP UNIT TYPE IN UDB
JRST RTNBUF ;NO ENTRY FOUND
HRRZS P4 ;ISOLATE INDEX
CALL BLDUDB ;BUILD UNIT DATA BLOCK
JRST RTNBUF ;NO SPACE
TLZE P1,-1 ;OFF-LINE?
JRST MSCI17 ;YES. CAN'T DO AN ONLINE COMMAND
MSCI12: CALL PHYDUA ;(P3/) NO. SEE IF DISK IS DUAL PORTED
HLRZ Q3,UDBKDB(P3) ;RESTORE CID INDEX
SKIPE MSCINF ;CHECK FOR STARTUP
JRST MSCI2Z ;YES DON'T CHECK DUAL PORT
HRRZ T1,UDBALT(P3) ;IS IT DUAL-PORTED?
JUMPN T1,MSCI13 ;YES
JRST MSCI14 ;NO. BIND THE UNIT TO THIS CONTROLLER
MSCI2Z: HLRZ T1,P2 ;YES. GET UNIT NUMBER +1
HRRZ T2,P2 ;ISOLATE KDB ADDRESS
XOR T1,.SBDSP(T2) ;EVEN NUMBER UNIT ON EVEN KDB OR ODD ON ODD?
TRNE T1,1
JRST MSCI14 ;EVEN ON EVEN OR ODD ON ODD - BIND THE UNIT TO THIS KDB
MOVX T2,US.OFS ;SET OFFLINE FOR NOW
IORM T2,UDBSTS(P3)
HRL P2,UDBSLV(P3)
HRLM Q3,UDBKDB(P3)
JRST MSCIN8 ;TRY NEXT UNIT
;HERE IF WE FOUND THE UNIT ON A DIFFERENT KDB
MSCI13: SKIPG UDBALT(T1) ;ALREADY ATTACHED ON OTHER PORT?
JRST MSCI16 ;YES. DON'T TRY TO ONLINE IT HERE
MOVX T2,US.OFS ;NO, WE'LL ONLINE IT ON THIS PORT
IORM T2,UDBSTS(T1) ;SO MARK THE OTHER PORT AS OFFLINE
MSCI14: MOVE T1,UDBSLV(P3) ;UNIT NUMBER
MOVEI P6,MSCI4M ;ONLINE RETURN
JRST ONLINA ;ONLINE THE DISK
;RETURN FROM COMMAND
; HERE ON RETURN FROM ABOVE ONLINE.
; THIS WILL CHECK THE STATE OF THE UNIT THAT HAS JUST BEEN REQUESTED
; TO COME ONLINE AND IT WILL THEN INFORM PHYSIO THAT THE UNIT IS
; READY TO USE. IT ALSO CHECKS THE SIZE OF THE DISK AND SETS
; UP THE CORRECT GEOMETRY OF THE DISK.
MSCI1A: LOAD T1,PKYEST,(Q2) ;[7233] GET STATUS OF ON-LINE ATTEMPT
IFN. T1 ;[8913] Did online succeed?
SKIPN CIBUGX ;[7233] NO, ARE WE DEBUGGING?
JRST RTNBUF ;[7233] (Q2) NO, DON'T SCARE THE OPERATOR
CALL SETSUN ;[7233] (Q2/T1) YES, GET UNIT NUMBER FROM THE PACKET
LDB T2,PKYNOD ;[7233] GET SERVER'S NODE NUMBER
LOAD T3,PKYEST,(Q2) ;[7233] GET THE STATUS CODE AGAIN
BUG.(INF,MSCOLE,PHYMSC,HARD,<PHYMSC - Online failed>,<<T3,STATUS>,<T2,NODE>,<T1,UNIT>>,<
Cause: An online request failed. This has been known to happen when duplicate
unit numbers are found, and, in some cases, when the TOPS-20 MSCP
server returns a status of offline.
Action: Check the remote node to see if it crashes or any other information on
why the online failed.
Data: STATUS - Status code in ONLINE end message
>,RTNBUF,<DB%NND>) ;[7.1210][7233]
ENDIF. ;[7233]
CALL SETP3 ;[7233] (Q2,P2/T1,P3) SET UDB ADDRESS
JRST NOONL ;[7233] FAILED, THAT'S VERY BAD
CALL GETSER ;[7233] (Q2,P3/) SET DRIVE SERIAL NUMBER IN UDB
CALL PHYONL ;[7233] (P3) TELL PHYSIO
TRNE Q3,TAPSID ;IS THIS TAPE?
JRST MSCI17 ;YES, WE'RE DONE WITH THIS UNIT
MOVE T1,P.UNFL(Q2) ;NO, GET UNIT FLAGS
CALL REVFUL ;REVERSE THE BYTES FOR THE HSC
TXNN T1,UF.576 ;IS IT A 576-BYTE DISK?
JRST MSCI38 ;NO. CAN'T USE IT
MOVX T2,US.WLK ;YES. WRITE LOCKED?
TXNE T1,UF.WPH+UF.WPS
IORM T2,UDBSTS(P3) ;YES. FLAG IT
CALL UNTYPE ;IS IT A VALID UNIT?
SKIPA ;NOPE
JRST MSCI17 ;YES
MOVE T1,MSCOLD(Q3) ;GET CONNECT ID
CALL SC.NOD ;(T1/T1,T2) GET NODE NUMBER
BUG.(INF,MSCUKD,PHYMSC,HARD,<PHYMSC - Unknown disk type>,<<T2,NODE>,<T1,CID>>,<
Cause: A device on HSC is not a device recognized by TOPS-20 and is
not used.
Action: No action required, this bug is for information only.
Data: NODE - node number
CID - connect ID
>,,<DB%NND>) ;[7.1210]
;HERE IF THE DISK IS 16-BIT MODE.
; 16 BIT DISKS ARE NOT USABLE TO THE PDP-10 SO WE DECLARE THEM
; OFFLINE AND DO NOT TRY TO USE THEM
MSCI15: MOVE T1,UDBSLV(P3) ;GET UNIT NUMBER
MOVEI P6,MSG55 ;DON'T NEED RETURN FROM THIS MESSAGE
CALL OFLINE ;MAKE IT AVAILABLE (NOT ONLINE) SINCE WE
JFCL
RET
NOONL: BUG.(HLT,MSCUDB,PHYMSC,SOFT,<PHYMSC - UDB missing>,,<
Cause: We have just set up a unit during initalization and now we can't find
it. This indicates a software problem.
>) ;[8913]
;RETURN HERE FROM OFFLINE
MSC15A: CALL SETP3 ;FIND THE UDB ETC
CALL NOONL ;OOPS WHERE DID IT GO?
;HERE IF THE UNIT IS NOT USABLE
MSCI16: MOVX T1,US.OFS ;MAKE SURE IT DOESN'T GET USED
IORM T1,UDBSTS(P3)
MSCI17: HRL P2,UDBSLV(P3) ;GET UNIT NUMBER WHERE MSCIN8 NEEDS IT
HRLM Q3,UDBKDB(P3) ;SAVE NEW CID INDEX IN UDB
TRNN Q3,TAPSID ;CHECK FOR TAPE NO HOME BLOCKS HERE
CALL FLGHOM ;FLAG UDB SO HOME BLOCKS WILL BE REREAD AND IO RESTARTED
JRST MSCIN8 ;GO LOOK FOR ANOTHER UNIT ON THE KDB
;ROUTINE TO TEST FOR NON-BOUND UNITS AFTER ENTIRE CONFIGURATION IS KNOWN
;IF ANY ARE FOUND IT WILL BIND THEM TO THE FIRST (OR ONLY) CONTROLLER THEY ARE ON
;ROUTINE IS CALLED FOR EVERY UDB WITH US.CIP ON IN UDBSTS
MSCI28: MOVE T1,UDBSTS(P3) ;STATUS
TXNN T1,US.OFS ;OFFLINE?
TXNN T1,US.DSK ;NO. DISK?
RET ;NOT USABLE OR NOT A DISK
HRRZ T1,UDBALT(P3) ;ALREADY BOUND ON THIS PORT?
JUMPL T1,R ;YES. DON'T DO IT AGAIN
JUMPE T1,MSCI29 ;IF DUAL PORTED
MOVX T2,US.OFS ;INDICATE THE OTHER PORT IF OFFLINE
IORM T2,UDBSTS(T1) ; SINCE WE'LL BE USING THIS PORT
MSCI29: SAVEQ
CALL GETBUF ;GET A BUFFER TO ONLINE WITH
RET ;NONE WE LOST
HLRZ Q3,UDBKDB(P3) ;CID INDEX
MOVE T1,UDBSLV(P3) ;UNIT NUMBER
JRST MSGAV1 ;GET UNIT STATUS AND ONLINE IT
;AND RETURN
SUBTTL Init Assist Routines
;SUBROUTINE TO ASK THE HSC WHAT THE NEXT UNIT IS
;RETURNS +1 IF ERROR ON THE SEND
;RETURNS +2 T1/UNIT NUMBER AS RETURNED BY THE HSC
NEXTUN: MOVE T2,[MD.NXU+OP.GUS] ;ASK HSC FOR STATUS OF NEXT UNIT
CURUN: MOVEI T3,P%OPCD
JRST SENDPK ;SEND PACKET
;SETSUN ROUTINE TO RETURN THE UNIT FROM A PACKET
;
; Q2 - PACKET ADDRESS
;
; RETURNS: T1 UNIT NUMBER
;
SETSUN: MOVE T1,P.UNIT(Q2) ;UNIT NUMBER
CALL REVFUL ;REVERSE THE BYTES FOR THE HSC
LSH T1,-4 ;RIGH ADJUST ANSWER
ANDI T1,177777 ;JUST UNIT NUMBER
RET
;ROUTINE TO SET UP UNIT TYPE IN UDB
;ENTER WITH RESPONSE TO GUS IN PACKET POINTED TO BY Q2
;RETURNS +1 IF TYPE NOT FOUND
;RETURNS +2 NORMALLY, P4/INDEX TO TYPE
UNTYPE: MOVE T1,P.MEDI(Q2) ;MEDIA TYPE
CALL REVFUL ;REVERSE THE BYTES FROM THE HSC
MOVSI P4,-NUMTYP
CAMN T1,TYPTAB(P4) ;DO WE KNOW ABOUT THIS UNIT TYPE?
RETSKP ;YES. RETURN
AOBJN P4,.-2
RET ;TYPE NOT FOUND
REPEAT 0,<
;ROUTINE TO DETERMINE IF THE DEVICE IS A TAPE OR DISK.
;ENTERED WITH RESPONSE TO OP%GUS IN PACKET POINTED TO BY Q2.
;
; RETURNS +1 IF TAPE
; RETURNS +2 IF DISK
DRVTYP: MOVE T1,P.MEDI(Q2) ;LOOK AT MEDIA TYPE
CALL REVFUL ;PUT BYTES IN CORRECT ORDER
MOVSI T2,-MAXTYP ;COUNT OF UNITS TO CHECK
CAMN T1,TAPTYP(T2) ;CHECK TABLE FOR TAPE TYPES
RET ;FOUND TAPE TYPE
AOBJN T2,.-2 ;LOOP TILL ALL TYPES SEARCHED
RETSKP ;MUST BE DISK TYPE
> ;END REPEAT
;SUBROUTINE TO BUILD A UNIT DATA BLOCK
;CALL P2/UNIT+1,,KDB
; Q2/PACKET ADDRESS
; Q3/MSCCID INDEX
;RETURNS +1 IF NO SPACE TO CREATE THE UDB
;RETURNS +2 NORMALLY, P3/UDB ADDRESS
BLDUDB: SAVEQ
MOVE Q1,Q2 ;SAVE Q2 FOR SETUDB
LDB Q2,PKYNOD ;UNIT NUMBER IS THE NODE NUMBER
MOVE T3,[MSCDSP,,UDBDDD]
CALL PHYUDB
JRST UDBXTA ;LOSE
MOVE T1,SIZTAB(P4) ;SET UP VARIABLE PART OF UDB
HLRZM T1,UDBSIZ(P3)
HRRZS T1
TXO T1,US.OFS+US.DSK+US.CIP+US.2PT ;[7.1276] Indicate it's a CI disk, dual-ported, and off-line
IORM T1,UDBSTS(P3)
MOVX T1,U1.NOL ;[7.1276] Say we haven't been onlined yet
IORM T1,UDBST1(P3) ;[7.1276] Set the bit in the correct word
MOVE Q2,Q1 ;RESTORE PACKET BUFFER ADDRESS
CALLRET SETUDB ;SET UP UDB
;RETURN +1 OR +2 DEPENDING ON SETUDB
;SUBROUTINE TO PUT P.STS INTO CORRECT (REVERSED BYTES) ORDER
;CALL WITH Q2=ADDRESS OF BUFFER
REVSTS: MOVE T1,P.STS(Q2) ;PICK UP STATUS WORD
CALL REVFUL ;MAKE IT LOOK LIKE WE WANT IT
MOVEM T1,P.STS(Q2) ;STORE BACK IN THE PACKET
RET ;AND RETURN
SUBTTL General Routines
;THIS ROUTINE WILL BUILD A GENERAL PACKET TO BE USED
;BY ALL ROUTINES. IT FIRST BUILDS A UNIQUE COMMAND REFERENCE
;NUMBER THAT CAN BE USED TO IDENTIFY THE TYPE OF REQUEST.
;IT ALSO DOES A LIMITED AMOUNT OF CHECKING TO SEE THAT
;THE SEND WAS SUCCESSFUL. IF NOT THEN IT DECLARES THE
;UNIT TO BE GONE AND WAITS FOR THE POLLER TO PICK
;THIS UP AND TRY AND RE-START THE SEQUENCE.
;THIS ROUTINE IS NOT USED FOR DATA TRANSFERS AND
;THE LEFT HALF OF P6 CONTAINS THE INFORMATION ON WHERE
;TO GO AFTER THE COMPLETION OF THE PACKET. IF THE LEFT
;HALF OF P6 IS -1 THEN A RETURN IS NOT REQUIRED AND NO-ONE
;GETS CALLED ON COMPLETION OF THE PACKET.
;SUBROUTINE TO SEND A PACKET
;CALL Q3/CONNECT ID INDEX
; Q2/PACKET ADDRESS
; P6/REQUEST CODE
; RH(P2)/SB ADDRESS
; T1/UNIT NUMBER, RIGHT JUSTIFIED
; T2/OPCODE+MODIFIERS
; T3/LENGTH OF PACKET
; RETURN +1 ERROR CODE IN T1-- PACKET RETURNED!
; RETURN +2 SUCCESS
SENDPK: SAVEAC <P6> ;SAVE A REGISTER
MOVEI T4,1B31 ;BUMP COMMAND REFERENCE NUMBER
ADDB T4,CRFNUM
TLZE T4,-1 ;MAKE SURE LH STAYS 0
MOVEI T4,1B31 ;INSURE THAT COMMAND REFERENCE NUMBER IS NON-ZERO
MOVEM T4,CRFNUM ; (LH NON-0 IS A PC)
HRRM P6,CIDATA(Q3) ;SAVE THE ID OF THE LAST REQUEST
LSH P6,4
HRL T4,P6 ;SAVE REQUEST TYPE IN REFERENCE NUMBER
MOVEM T4,P.CRF(Q2) ;SAVE AS COMMAND REFERENCE NUMBER
LSH T1,4 ;POSITION UNIT FOR HSC
CALL SRVFUL ;REVERSE THE WORD FOR THE HSC, PRESERVE ACS
MOVEM T1,P.UNIT(Q2) ;SAVE IN PACKET
MOVE T1,T2 ;OPCODE, MODIFIERS
CALL SRVFUL ;REVERSE FOR THE HSC
MOVEM T1,P.OPCD(Q2) ;OPCODE + MODIFIERS
MOVX T1,KLPX9 ;SET NO VC OPEN
SKIPG T4,MSCCID(Q3)
JRST SNDERA ;CONNECT HAS GONE AWAY
BLCAL. (SC.SMG,<T4,[0],T3,Q2,[MSCPRI],[0],[0]>) ;SEND THE PACKET
JRST SNDERA ;LOST CHECK TO SEE WHY
AOS MSCSNT ;[7211] COUNT THE MESSAGE
RETSKP
SNDERA: MOVE P6,T1 ;SAVE THE ERROR CODE
CALL RTNBUF
MOVEM P6,T1
RETBAD () ;RETURN THE ERROR
;ROUTINE TO SET UP UDB
;CALL P2/UNIT+1,,KDB
; P3/UDB
; Q2/PACKET ADDRESS
; Q3/MSCCID INDEX
;
; RETURNS +1 IF TOO MANY UNITS
; RETURNS +2 IF ENTERED
SETUDB: HRRZ T1,P2 ;SBK ADDR
MOVE T1,KDBIUN(T1) ;POINTER TO UNITS
SKIPE (T1) ;FIND THE NEXT FREE SLOT
AOBJN T1,.-1
JUMPG T1,UDBXTA ;TOO MANY UNITS IF POSITIVE
HRRZM P3,(T1)
HRRZM P2,UDBKDB(P3) ;SAVE POINTER TO KDB
HRLM Q3,UDBKDB(P3) ;UDBKDB=CID INDEX,,SYSTEM BLOCK ADDRESS
HLRZ T1,P2 ;UNIT NUMBER
SUBI T1,1
HRRZM T1,UDBSLV(P3) ;SAVE IN UDB
CALL GETSER ;(Q2,P3/) RE SETUP UDBDSN,UDBDSH.
RETSKP ;AND WE'RE DONE
;GETSER - GET THE DRIVE SERIAL NUMBER
; Q2/ PACKET
; P3/ UDB
; CALL GETSER ;(Q2,P3/)
; RETURN +1
GETSER: STKVAR <DSN> ;LOW-ORDER DSN WORD
MOVE T1,P.UNTI(Q2) ;PUT UNIT ID INTO REASONABLE CONDITION
CALL REVFUL
LSH T1,-4
MOVEM T1,DSN ;STASH IT
MOVE T1,P.UNTI+1(Q2)
CALL REVFUL
LSH T1,-4
MOVE T2,DSN ;RETRIEVE LOW-ORDER WORD
CALL SETDSN ;(T1,T2,P3/) SET DRIVE SERIAL NUMBER
RET
ENDSV.
UDBXTA: BUG.(INF,MSCTMU,PHYMSC,HARD,<PHYMSC - Too many units for KDB>,<<P2,KDB>,<P1,CHN>>,<
Cause: There are more than PRTMXU units on a particular HSC, therefore there
is not enough room in the KDB for UDB entries.
Action: If you want to support more than PRTMXU units on a HSC, a source
rebuild of the monitor is required. Change the symbol PRTMXU in SCAPAR
and rebuild PHYMSC and PHYKLP.
Data: KDB - KDB address
CHN - Channel
>,,<DB%NND>) ;[7.1210]
RET ;RETURN WITH ERROR FOR NO ROOM
;HERE TO EXECUTE AN CALL TO MSCI28 ONCE FOR EACH UDB ON A CI CHANNEL
;CALL DGIMAP
;THE CALL TO MSCI28 WILL BE EXECUTED ONCE WITH P3 SETUP TO EACH UDB
DGIMAP: SAVEPQ
MOVEI P4,KLPRH2 ;KLIPA CHANNEL
DGIMA1: MOVX T1,CS.CIP
SKIPE P1,CHNTAB(P4) ;CHAN EXIST?
TDNN T1,CDBSTS(P1) ;YES. IS IT A CI CHAN?
RET ;NO. RETURN
CALL DGUMAP ;YES. DO INSTR FOR EACH UDB
CALL MSCI28 ;INSTRUCTION TO EXECUTE
RET ;DONE
;ROUTINES TO ONLINE, OFFLINE A DISK
;CALL P1,P2,P3 POINTING AT CDB,KDB,UDB
; P6/REQUESTED RETURN ADDRESS CODE
; T1/UNIT NUMBER
; Q3/MSCCID INDEX
;RETURNS +1 ERROR
;RETURNS +2 SUCCESSFUL QUEUE OF REQUEST
OFLINE: MOVEI T2,OP.AVL ;OPCODE=AVAIL
MOVEI T3,P%OPCD ;SIZE OF PACKET
CALLRET SENDPK ;SEND PACKET
ONLINE: MOVEI T2,OP.ONL ;OPCODE = ONLINE
MOVEI T3,P%SHUN ;SIZE OF PACKET
TXNE Q3,TAPSID ;TAPE OR DISK?
JRST ONLTAP ;TAPE WE NEED TO DO SPECIAL WORK
MOVX T4,UA.PAT ;INDICATE UDB IS ONLINE VIA THIS PORT
IORM T4,UDBALT(P3)
MOVX T4,US.UNA ;CLEAR UNIT UNAVAILABLE FLAG
ANDCAM T4,UDBSTS(P3)
MOVX T4,U1.NOL ;[7.1276] Say we have seen this disk
ANDCAM T4,UDBST1(P3) ;[7.1276] By clearing this bit
;********************************************************************
MOVEI T4,44000 ;TEMP FIX TO ONLINE/OFLINE BUGCHK
; MOVEM T4,13(Q2) ;TO BE REMOVED WHEN BUG IS FIXED IN FLAGS************
;********************************************************************
SETZM P.DVPM(Q2) ;CLEAR DEVICE PARAMETERS
SETZM P.SHUN(Q2) ;CLEAR SHADOW AND COPY SPEED
CALLRET SENDPK ;SEND PACKET
ONLTAP:
MOVX T4,US.BOT ;ASSUME BOT
IORM T4,UDBSTS(P3)
CALLRET SENDPK ;SEND ONLINE REQUEST
;ROUTINE TO SET CONTROLLER CHARACTERISTICS
;CALL Q3/MSCCID INDEX
; P6/REQUESTED RETURN ADDRESS CODE
;RETURNS +1 ON ERROR
;RETURN +2 IF OK
SETCCH: CALL GETBUF ;GET A BUFFER
RET ;NONE??????
$LDCID P2,MSCCID(Q3) ;GET CB ADDRESS
MOVE P2,.CBSBA(P2) ;SET SYSTEM BLOCK ADDRESS
HRRZ P1,.SBACD(P2)
SKIPG TADIDT ;HAVE THE TIME?
JRST [SETZB T1,P.TIME+1(Q2) ;NO. CLEAR TIME SINCE WE DON'T KNOW IT
JRST SETCC1] ;COME BACK LATER AND TELL IT THE RIGHT TIME
CALL LGTAD ;NO. GET CURRENT TIME
MOVE T2,TIMZON ;DIFFERENCE BETWEEN LOCAL TIME AND GMT
IMULI T2,ZON2TM ;COMPUTE DIFFERENCE IN TIME-UNITS
SUB T1,T2 ;CONVERT GMT TO LOCAL TIME
MUL T1,VAXTIM ;CONVERT TIME TO VAX'S REPRESENTATION
LSH T2,1
LSHC T1,-5
DPB T2,[POINT 32,P.TIME(Q2),31] ;SAVE LOW ORDER TIME
LSHC T1,-^D28
MOVE T1,T2
TRZ T1,17 ;CLEAR THE EXTRANEOUS BITS
CALL REVFUL ;REVERSE THE BYTES FOR THE HSC
MOVEM T1,P.TIME+1(Q2) ;SAVE HIGH ORDER TIME
MOVE T1,P.TIME(Q2) ;PICK UP LOW-ORDER TIME
CALL REVFUL ;'CAUSE 11'S DO IT BACKWARDS
SETCC1: MOVEM T1,P.TIME(Q2) ;MAKE IT UNDERSTANDABLE
SETZM T1,P.HTMO(Q2)
MOVX T1,CF.MSC+CF.THS+CF.576
TXO T1,CF.ATN ;ENABLE FOR ATTENTION MESSAGES TOO
CALL REVFUL ;REVERSE THE BYTES FOR THE HSC
MOVEM T1,P.CNTF(Q2) ;SAVE CONTROLLER FLAGS, MSCP VERSION = 0
MOVEI T2,OP.SCC ;SET CONTROLLER CHARACTERISTICS
SETZB T1,P.CDPR(Q2) ;CONTROLLER DEPENDENT PARAMS ARE 0
MOVEI T3,P%CDPR
JRST SENDPK ;SEND PACKET
SUBTTL Periodic Check
;
;THE POLLER HAS THE TASK OF FINDING OUT IF ALL THE UNITS ARE REALLY
;WORKING AND IN USE. BESIDES MAKING PERIODIC CHECKS IT WILL
;SET THE TIME IN THE HSC CONTROLLERS THE FIRST TIME IT FINDS THAT
;TOPS-20 HAS THE TIME AND DATE.
; IF THE POLLER FINDS THAT THE HSC HAS FORGOTTEN US IT WILL TRY
; TO DISCONNECT AND RE-CONNECT. THIS IS SUPPOSED TO CLEAN UP THE
; DATABASE AT THE HSC AND ALLOW US TO RE-START. IF THIS FAILS
; THEN WE WILL TRY THE MORE DRASTIC APPROACH AND TRY AND RE-START
; THE HSC. THIS IS A MUCH MORE DRASTIC THING TO DO SINCE IT MAY
; TAKE QUITE A WHILE FOR THE HSC-50 TO RE-START ITSELF FROM
; SCRATCH AND IN THE MEAN TIME WE CAN DO NOTHING WITH THE DISK
; OR TAPE TRANSFERS THAT ARE WAITING.
MSCCHK::MOVEI T1,^D1000 ;RESET
MOVEM T1,MSCTIM ; FOR SCHEDULER CLOCK
SAVEPQ
EA.ENT ;GET INTO SECTION 1
SKIPE MSCITD ;DON'T DO ANYTHING IF NOT INITED
SKIPG TADIDT ;DO WE KNOW THE TIME?
RET
AOSE T1,HAVTIM ;FIRST TIME?
JRST MSCCH2 ;NO
SETZ Q3, ;YES. TELL THE MSCP SERVERS THE CORRECT TIME
MSCCH1: SKIPG T1,MSCCID(Q3) ;SERVER EXIST?
JUMPE T1,MSCCA2 ;NO, CHECK NEXT ONE
JUMPL T1,MSCCA2 ;NOT REALLY READY YET STILL CONNECTING
SETO P6, ;DON'T NEED RETURN FROM SET CHARACTERISTICS
MOVE T1,CIDATA(Q3) ;YES. GET STATE OF SERVER
TXNN T1,DT.GAW ;ARE WE CONNECTED TO IT?
CALL SETCCH ;YES. DO A SET CONT. CHAR. (WITH CURRENT TIME)
JFCL ;DON'T CARE IF ERROR WE WILL DO IT LATER
MSCCA2: CAIGE Q3,CTABSZ-1 ;AT THE END OF THE TABLE?
AOJA Q3,MSCCH1 ;NO, TRY NEXT ONE
MSCCH2: MOVE T1,HAVTIM ;CHECK FOR INIT DONE
CAIE T1,10 ;IF DONE THEN WE CLEAR INIT FLAG
JRST MSCCB2
SETZM MSCINF
CALL DGIMAP
MSCCB2: SOSLE MSCHSC ;TIME TO GET COMMAND STATUS?
RET ;NO. WE'RE DONE
SETZ Q3, ;YES. START AT THE BEGINNING
MOVEI T1,TIMOUT
MOVEM T1,MSCHSC ;RESET TIMER
MSCCH3: CAIL Q3,C%SBLL ;END OF LOOP?
RET ;ALL DONE
MOVE T2,CIDATA(Q3)
TXNN T2,DT.GAW ;GONE AWAY?
JRST MSCC3A ;NO CONTINUE
;HERE ON 1ST POLL AFTER WE DISCONNECTED
MSCCH6: HRRO Q1,Q3 ;DO ONLY ONE NODE
CALL MSCIN2 ;FOUND IT. TRY TO RECONNECT
AOJA Q3,MSCCH3 ;GO CHECK NEXT CID
MSCC3A: TXNE T2,DT.GCS ;STILL HAVE AN OUTSTANDING GCS COMMAND?
JRST [ SOSL MSCTMO(Q3) ;DECREMENT COUNT WHILE WAITING
JRST MSCC44 ;NOT TIMEOUT CHECK STATUS
CAIG Q3,C%SBLL-1
CALL DEDKON ;OOPS LOST HIM SINCE HE ISN'T TALKING
AOJA Q3,MSCCH3] ;GO TO NEXT NODE
TXNN T2,DT.IRC ;RELOADING?
JRST MSCC3F
MOVX T2,DT.IRC ;SET UP BEFORE TURNING OF PI
HRRZ T3,CIDATA(Q3)
IOPIOF ;TURN OF INTERRUPTS TO INSURE NO CHANGE
TDNN T2,CIDATA(Q3) ;RE-CHECK STATE
JRST MSCC3D ;NOT SAME QUIT
CAIG T3,CONTMO ;CHECK FOR TOMEOUT
JRST MSCC3B
MOVE T1,MSCOLD(Q3) ;GET CONNECT ID
CALL SC.NOD ;(T1/T1,T2) GET NODE NUMBER
BUG.(INF,MSCCRN,PHYMSC,SOFT,<PHYMSC - Connect did not complete in reasonable timeout>,<<T2,NODE>,<T1,CID>,<Q3,INDEX>>,<
Cause: There was a connect request and no response. The remote node probably
is sick or has gone away.
Action: Check the status of the remote node, and reload it if needed.
Data: NODE - node number
CID - connect ID
INDEX - MSCCID table index
>)
BLCAL. (SC.DIS,<MSCOLD(Q3),[0]>)
JFCL ;IGNORE ERROR AFTER ABORT
MOVX T2,DT.KEP ;CLEAR STATUS
ANDM T2,CIDATA(Q3)
MOVX T2,DT.GAW ;INDICATE GONE SO WE WILL RETRY LATER
IORM T2,CIDATA(Q3)
MSCC3B: AOS CIDATA(Q3)
MSCC3D: IOPION
MSCC3F: SKIPG P2,MSCCID(Q3) ;ARE WE HERE STILL?
AOJA Q3,MSCCH3 ;NO TRY AGAIN LATER
CALL GETBUF ;GET A BUFFER FROM SCA
RET ;NONE AVAILABLE BETTER QUIT NOW
$LDCID P2,P2 ;YES. GET ADDR OF CB
MOVE P2,.CBSBA(P2) ;SB ADDR
HRRZ Q1,.SBQOR(P2) ;1ST (OLDEST) ITEM ON QUEUE
CAIN Q1,.SBQOR(P2) ;EMPTY QUEUE?
JRST MSCCH4 ;YES
MOVE T1,QORCRF(Q1) ;NO. GET COMMAND REF NUMBER
HLRZ P1,QORUNI(Q1) ;GET ASSOCIATED UNIT
SKIPA P1,UDBSLV(P1) ;GET MSCP UNIT NUMBER
MSCCH4: SETZB T1,P1 ;IDLE - UNIT=COMMAND REF = 0
MOVEM T1,P.OTRF(Q2) ;SAVE REF NUMBER WE WANT AN ANSWER FOR
MOVE T1,P1 ;UNIT
LSH T1,4 ;POSITION IT
MOVX T2,DT.GCS ;SET STATUS AS GET COMMAND STATUS
IORM T2,CIDATA(Q3)
MOVEI T2,OP.GCS ;OP IS GET COMMAND STATUS
MOVEI T3,P%OTRF ;LENGTH OF MESSAGE
MOVEI P6,MSCH30
CALL SENDPK ;SEND THE COMMAND
SKIPA T1,[DT.GCS] ;CLEAR NO BITS SO WE COME BACK HERE
SKIPA ;GCS SUCCEEDED
ANDCAM T1,CIDATA(Q3) ; GCS COMMAND
MOVE T1,MSCINT(Q3) ;SET UP INTERVAL
MOVEM T1,MSCTMO(Q3)
MSCC44: SKIPG T2,MSCCID(Q3) ;GET CID
AOJA Q3,MSCCH3 ;TRY NEXT CONNECTION
$LDCID T2,T2 ;CB ADDR
MOVE P2,.CBSBA(T2) ;SB ADDR
JUMPE P2,MSC4L1 ;NONE QUIT NOW....
MOVE Q1,KDBIUN(P2) ;POINTER TO UDB'S
HRRZ P1,CHNTAB+KLPRH2 ;GET CHAN POINTER
MSC4L: SKIPN P3,(Q1) ;FOUND ONE?
MSC4L1: AOJA Q3,MSCCH3 ;NOPE DON'T NEED TO CHECK IT
MOVX T1,US.OFS!US.WLK ;[7465] CHECK FOR OFFLINE AND WRITE LOCKED
MOVX T3,US.UNA!US.TPD ;AND CHECK FOR UNAVAILABLE
TDNN T3,UDBSTS(P3) ;DON'T TRY TO PUT BACK ONLINE IF UNAVAILABLE (16 BIT DISK FOR NOW)
TDNN T1,UDBSTS(P3) ;IS IT?
JRST [ IOPIOF ;TURN OFF INTERRUTPS
CALL UNQUNT ;START I/O ON THIS UNTE IF POSSIBLE
JFCL ;NO PROBLEM ON FAILURE
IOPION ;INTERRUPTS BACK ON
AOBJN Q1,MSC4L ;NO CHECK NEXT UNIT
AOJA Q3,MSCCH3] ;LAST UNIT QUIT
CALL ONLCHK ;FOUND A UNIT THAT SHOULD BE ONLINE
AOBJN Q1,MSC4L ;TRY NEXT UNIT
AOJA Q3,MSCCH3 ;SEE IF ANOTHER NODE EXISTS
;HERE WHEN WE GET AN ANSWER TO THE GCS
MSCC10: MOVX T2,DT.GCS ;CLEAR GCS-IS-OUTSTANDING BIT, INITIATED A DISCONNECT
ANDCAM T2,CIDATA(Q3)
SKIPN T1,P.OTRF(Q2) ;REAL COMMAND REF NUMBER?
JRST MSCC11 ;NO. NOTHING TO CHECK
HRRZ T2,.SBQOR(P2) ;YES. GET OLDEST OUTSTANDING COMMAND
CAIE T2,.SBQOR(P2) ;IS THE QUEUE NOW EMPTY?
CAME T1,QORCRF(P2) ;NO. IS THIS STILL THE OLDEST?
JRST MSCC11 ;THE COMMAND WE ASKED ABOUT HAS COMPLETED
MOVE T1,P.CMST(Q2) ;THIS IS STILL THE OLDEST. GET ITS STATUS
CALL REVFUL
CAML T1,CICMST(Q3) ;HAS WORK BEEN DONE FOR IT?
CALLRET DEDKOA ;NO. THEY'VE GONE OFF THE DEEP END
MOVEM T1,CICMST(Q3) ;YES. SAVE NEW STATUS
MSCC11: CALLRET RTNBUF ;GIVE THE BUFFER BACK TO SCA AND RETURN
;HERE TO TRY TO GET THE STATUS OF A DRIVE THAT IS OFFLINE
;BECAUSE IT SEEMS THAT WE MAY NOT ALWAYS GET AN AVAILABLE
;STATUS BACK FROM THE HSC.
ONLCHK: CALL GETBUF ;GET A BUFFER FROM SCA
RET ;OOPS NONE AVAILABLE NOW
MOVE T1,UDBSLV(P3) ;GET UNIT NUMBER
MOVE P1,.SBACD(P2) ;GET THE CDB ADDRESS
MOVEI T2,OP.GUS ;GET STATUS OF UNIT
MOVEI P6,ONLC1 ;CODE FOR RETURN
CALL CURUN ;GET STATUS OF CURRENT UNIT
RET ;DON'T CARE ERROR RETURN
RET
;HERE ON RETURN FROM GET CURRENT UNIT STATUS
; NOW WE CHECK THE STATUS OF THE UNIT AND IF IT IS REALLY
; THERE THEN WE CAN PUT IT ONLINE. IF IT IS OFFLINE THEN
; WE JUST FORGET IT TILL THE NEXT TIME THRU THE POLLER.
ONLCK1: CALL SETP3 ;SET UNIT NUMBER
JRST RTNBUF ;NO UNIT FOUND QUIT
MOVE T1,P.UNFL(Q2) ;[7465] Get unit flags
CALL REVFUL ;[7465] (T1/T1) Byte forward-ize T1
TXNE T1,UF.WPH!UF.WPS ;[7465] Write protected??
RET ;[7465] Yes, no need to bring online then
MOVX T1,US.WLK ;[7465] Get write lock bit
ANDCAM T1,UDBSTS(P3) ;[7465] Unit no longer write locked
MOVX T1,US.OFS ;[7465] Get offline bit
TDNN T1,UDBSTS(P3) ;[7465] Was drive offline?
RET ;[7465] Nope, don't waste anymore time
LOAD T3,PKYEST,(Q2) ;GET STATUS OF UNIT
CAIE T3,ST%AVL ;AVAILABLE NOW?
JUMPN T3,RTNBUF ;NO TRY AGAIN LATER
MOVE Q1,UDBSLV(P3) ;GET THE UNIT NUMBER TO Q1
CALLRET MSGAV3 ;TRY AND ONLINE THE THING
;HERE IF THE CONTROLLER IS INSANE
DEDKOA: MOVE T1,MSCOLD(Q3) ;GET CONNECT ID
CALL SC.NOD ;(T1/T1,T2) GET NODE NUMBER
BUG.(INF,MSCCTO,PHYMSC,SOFT,<PHYMSC - Request HSC disconnect - command timeout>,<<T2,NODE>,<T1,CID>>,<
Cause: The HSC has not correctly responded to Get Command Status request.
Action: Check the remote node for evidence of problems and reload it if needed.
Data: NODE - node number
CID - connect ID
>)
CALL RTNBUF ;RETURN BUFFER
TXNE Q3,TAPSID ;CHECK FOR TAPE
RET ;IGNORE DON'T WANT TO LOOSE DISKS
JRST DEDKN3
DEDKON: MOVE T1,MSCOLD(Q3) ;GET CONNECT ID
CALL SC.NOD ;(T1/T1,T2) GET NODE NUMBER
BUG.(INF,MSCDIS,PHYMSC,SOFT,<PHYMSC - Request HSC disconnect>,<<T2,NODE>,<T1,CID>,<Q3,INDEX>>,<
Cause: The messages from the HSC indicate a problem. The HSC has probably
crashed. The HSC is disconnected and reconnected.
Action: Check the remote node for evidence of problems.
Data: NODE - node number
CID - connect ID
INDEX - MSCCID table index
>)
DEDKN3: IOPIOF
SKIPG T2,MSCCID(Q3) ;GET CONNECT ID
JRST DEDKN1 ;NO CONNECT THERE DON'T DISCONNECT
CALL PBRCOA ;MARK THE UNITS OFF-LINE
SETOM MSCCID(Q3) ;SET IT SO NO-ONE CAN USE THIS AGAIN
IOPION ;TURN INTERRUPTS BACK ON
BLCAL. (SC.DIS,<MSCOLD(Q3),[0]>) ;DO THE DISCONNECT
JFCL
SKIPA
DEDKN1: IOPION
SKIPG T1,CIDATA(Q3) ;DISK SERVER?
RET ;TAPE DRIVER. IGNORE IT IF DISKS OK
TXOE T1,DT.DI1 ;DISK DRIVER. HAVE WE TRIED DISCONNECT/RECON BEFORE?
JRST DEDKN2 ;YES. IT'S TIME TO REBOOT THEM
MOVEM T1,CIDATA(Q3) ;NO. TRY IT NOW
MOVE T1,CIDATA+1(Q3) ;ASSOCIATED TAPE DRIVER
TXNN T1,DT.GAW ;ARE WE CONNECTED TO IT?
TXOE T1,DT.DI1 ;AND HAVEN'T DISCONNECTED YET?
RET ;DON'T NEED TO DO ANYTHING TO IT
RET ;NO TAPES FOR NOW.....
TXO Q3,TAPSID ;LOOK AT TAPES
MOVEM T1,CIDATA(Q3) ;DISCONNECT FROM THE TAPE SERVER TOO
SKIPG T1,MSCCID(Q3) ;CONNECTED?
JRST DEDKNA
BLCAL. (SC.DIS,<T1,[0]>)
JFCL
DEDKNA: TXZ Q3,TAPSID ;BACK TO DISKS
RET ;AND TEST NEXT SERVER
;HERE IF THE DISCONNECT/RECONNECT DIDN'T FIX THE PROBLEM
DEDKN2: MOVE T1,MSCOLD(Q3) ;GET CONNECT ID
CALL SC.NOD ;(T1/T1,T2) GET NODE NUMBER
BUG.(INF,MSCRLD,PHYMSC,SOFT,<PHYMSC - HSC control reload initiated>,<<T2,NODE>,<T1,CID>>,<
Cause: After a disconnect and reconnect to the HSC to clear up problems, the
HSC is still not responding correctly and is reloaded.
Action: Check the remote node for evidence of problems.
Data: NODE - node number
CID - connect ID
>,,<DB%NND>) ;[7.1210]
;HERE TO RELOAD THE HSC
;
;CALL: Q3 = INDEX INTO CID
HSCREL: MOVE T1,MSCOLD(Q3) ;GET CID
CALL SC.NOD ;(T1/T1,T2) GET NODE NUMBER
BLCAL. (SC.RST,<T2,[1]>) ;RESET THE REMOTE
JRST HSCABT ;COMPLAIN ABOUT FAILURE
BLCAL. (SC.STA,<T2,[0],[0]>) ;START IT AT DEFAULT
JRST HSCABT
RET ;DONE SEE YA NEXT TIME.
HSCABT: MOVE T3,T1 ;MOVE ERROR CODE
MOVE T1,MSCOLD(Q3) ;GET CID
CALL SC.NOD ;(T1/T1,T2) GET NODE NUMBER
BUG.(CHK,MSCRLF,PHYMSC,SOFT,<PHYMSC - Start or reset failed>,<<T2,NODE>,<T1,CID>,<T3,ERRCOD>>,<
Cause: After problems were seen with a HSC, a disconnect and reconnect was
tired. The problems were not cleared up, it was sent a message to
reload itself. The HSC was unable to restart or reset.
Action: Check the remote node for evidence of problems.
Data: NODE - node number
CID - connect ID
ERRCOD - error code
>)
RET
SUBTTL CNFIG% JSYS Support -- CFHSC (Return list of HSC node names)
IFN CFSSCA,<
; Expects the following to be setup by .CNFIG entry code in JSYSA:
;
; P1/ Function code (in this case, .CFHSC)
; Q2/ Address of user block
; Q3/ Contents of user argument .CFNHN
; This subroutine will use the following registers:
;
; Q1/ Address of monitor block containing returned data
; P1/ Address of byte pointers in returned data block
; P2/ Address of HSC host names in returned data block
; P3/ AOBJN pointer
; P4/ Running address for byte pointers into users block
; P5/ Address of HSC name (in SC.RCD block)
CFHSC:: TRVAR <<CFHSCB,C%SBLL*3+1>,RCDBLK,<HSCNAM,2>>
;First, count up the number of HSCs in the system.
CIOFF ;Shut off the CI so we get an accurate count
SETZM T4 ;T4/ Count of HSCs in system
MOVSI P3,-C%SBLL ;P3/ AOBJN pointer into MSCCID
DO.
SKIPG MSCCID(P3) ;Is there an MSCP connection to this node?
IFSKP. ;Yes
MOVX T2,DT.KL
TDNN T2,CIDATA(P3) ;Is this system an HSC50?
AOS T4 ;Yes, count this node as an HSC
ENDIF.
AOBJN P3,TOP. ;Check every possible HSC connection
ENDDO.
XMOVEI Q1,CFHSCB ;Q1/ Address of monitor block
STOR T4,CF%NHN,.CFNHN(Q1) ;Store the number of HSC nodes found
MOVEI P4,.CFHP1(Q2)
ADD P4,T4 ;P4/ Running pointer into user block
XMOVEI P1,.CFHP1(Q1) ;P1/ Place to store byte pointers
MOVE P2,P1
ADD P2,T4 ;P2/ Place to store host names
; Here is our main loop to get the names and stash them.
MOVE T1,[XWD .RESP1,.RDLEN] ;Priority,,Length of free space
MOVEI T2,.RESGP ;Get space from resident free pool
CALL ASGRES ;(T1,T2/T1) Obtain block
IFNSK. ;Error - could not get a free space block
CION ;Turn on the CI
ITERR (MONX05) ;Return the error
ENDIF.
MOVEM T1,RCDBLK ;Save block address
MOVSI P3,-C%SBLL ;P3/ AOBJN pointer into MSCCID
DO.
SKIPG MSCCID(P3) ;Is there an MSCP connection to this node?
IFSKP. ;Yes
MOVX T2,DT.KL
TDNE T2,CIDATA(P3) ;Is this system an HSC50?
ANSKP. ;Yes
HRRZ T1,P3 ;Get node number
MOVE T4,RCDBLK ;Get block address
BLCAL. (SC.RCD,<<T1>,<T4>>) ;Get configuration of this node
JRST CFHS1 ;Error - skip this node
HRR T2,P4 ;Get the current offset pointer for user block
HRLI T2,(POINT 7,)
MOVEM T2,0(P1) ;Store the byte pointer to the name
AOS P1 ;Go to next byte pointer entry in block
ADDI P4,2 ;Go to next offset location into user block
MOVE P5,RCDBLK ;Get address of SC.RCD block
ADDI P5,.RDNNM ;Point to location of HSC name
DMOVE T1,(P5) ;Get the HSC name
DMOVEM T1,HSCNAM ;... and stash it in HSCNAM because
MOVEI P5,HSCNAM ;... ASC8T7 expects section 0/1 pointer to name
CALL ASC8T7 ;(P2,P5) Copy name to returned block and convert
ADDI P2,2 ;Point to start of next node name text area
ENDIF.
CFHS1: AOBJN P3,TOP. ;Continue at next entry in MSCCID
ENDDO.
CION ;Turn on the CI again
MOVE T1,RCDBLK ;Get the address of the SC.RCD block
CALL RELRES ;(T1) Return block to free pool
; Set up the initial values in the returned block.
LOAD T1,CF%NHN,.CFNHN(Q1) ;The number of HSC nodes found
MOVEM T1,P3 ;Save this number
IMULI T1,3 ;The number of nodes times 3
AOS T1 ;...plus 1 is maximum number of words returned
CALL CFLND2 ;(T1,Q1,Q2,Q3) Setup the first returned word
STOR P3,CF%NHN,.CFNHN(Q1) ;Restore the number of HSC nodes found
CALL CFRET ;(Q1,Q2,Q3) Transfer monitor data block to user
RETSKP ;Done
ENDTV.
> ;End of IFN CFSSCA
RS LCRDT,1 ;COUNT OF TIMES RAN OUT OF CREDIT
SUBTTL Storage
DCREDT==1 ;CREDIT BEFORE NOTICE
TCREDT==^D1 ;MIN TAPE CREDIT
HSCBFN==^D30 ;NUMBER OF BUFFERS HSC SHOULD KEEP FOR US
HSCBFT==^D15 ;NUMBER OF TAPE BUFFERS IT SHOULD KEEP
DGNUM==^D5 ;NUMBER OF DATAGRAM BUFFERS WE NEED
HSCDGL==^D96 ;MAX DATAGRAM LENGTH
TIMOUT==^D10 ;CONTROLLER TIMEOUT INTERVAL
CTABSZ==2*C%SBLL*MAXPRT ;SIZE OF VARIOUS CONNECTION TABLES
;UDB EXTENSIONS IF A MAGTAPE
UDBDEN==UDBDDM ;HARDWARE-DETERMINED DENSITY
; NOTE THAT MAGTAP USES THIS WORD
LU.TAP==UDBDEN+1 ;LENGTH OF MAGTAPE UDB
;BITS IN CIDATA
DT.TAP==1B0 ;CONTROLLER IS A TAPE DRIVER (MUST BE SIGN BIT)
DT.GAW==1B1 ;NODE HAS GONE AWAY (CONNECTION BROKEN)
DT.GCS==1B2 ;A GCS COMMAND IS OUTSTANDING
DT.IDC==1B3 ;WE'VE INITIATED A DISCONNECT
DT.IRC==1B4 ;WE'VE INITIATED A RECONNECT
DT.DIS==1B5 ;THEY INITIATED A DISCONNECT
DT.DI1==1B6 ;ALREADY TRIED DISCONNECT ONCE
DT.NXU==1B7 ;FIRST PASS NEXT UNIT TEST
DT.KL==1B8 ;REMOTE IS A KL
DT.KEP==DT.KL!DT.DI1 ;BITS TO KEEP AROUND ON RESET
CONTMO==15 ;APPROXIMATELY 15 SECOND TIMEOUT FOR CONNECT REQUEST
TAPSID==MAXNDS+1 ;MUST BE ON BIT BOUNDARY!! (I.E. 20 OR 40)
RS MSCINF,1 ;INITIALIZATION FLAG
RS MSCITD,1 ;REALLY STARTED FLAG
RS MSCHSC,1 ;COUNT-DOWN TIMER FOR GET COMMAND STATUS
RS INTRVL,1 ;NUMBER OF OUR TIMEOUTS IN 1 OF THEIRS
RS MSCCID,CTABSZ ;TABLE OF CONNECT IDS
RS MSCOLD,CTABSZ ;TABLE OF OLD CONNECT ID'S
RS CIDATA,CTABSZ ;BITS AND BYTES ASSOCIATED WITH THE CID
RS CICMST,CTABSZ ;STATUS OF OLDEST COMMAND FOR NODE
RS MSCTMO,CTABSZ ;TIME LEFT TO WAIT FOR REMOTE CONNECTION
RS MSCINT,CTABSZ ;INTERVAL TO WAIT FOR REMOTE
RS QUEREQ,1 ;NON-0 IF REQS GOT QUEUED ON SOME UNIT'S PWQ
RS HAVTIM,1 ;FLAG FOR SETTING CURRENT TIME IN SERVERS
VAXTIM: DEC 52734375 ;MAGIC CONSTANT FOR CONVERTING TO VAX TIME-BASE
ZON2TM==25252 ;CONSTANT TO CONVERT GMT OFFSET INTO DATE FRACTION
;TABLE OF MEDIA TYPES
TYPTAB: BYTE (16) 022544,010120 ;RA80
BYTE (16) 022544,010121 ;RA81
BYTE (16) 021244,010074 ;RA60
.UTRP4_4 ;RP04 (KL MSCP SERVER)
.UTRP6_4 ;RP06
.UTRP7_4 ;RP07
.UTP20_4 ;RP20
NUMTYP==.-TYPTAB
TAPTYP: BYTE (16) 064651,050116 ;TU78
BYTE (16) 066551,050121 ;TU81 25/75 IPS STREAMER
MAXTYP==.-TAPTYP
SIZTAB: DSKSZ5,,.UTR80
DSKSZ6,,.UTR81
DSKSZ7,,.UTR60
DSKSZ0,,.UTRP4
DSKSZ1,,.UTRP6
DSKSZ2,,.UTRP7
DSKSZ4,,.UTP20
DSKSZ8,,.UTR82
DSKSZ9,,.UTR62
;FRAMES/WORD,,MODE BITS
MODTBL: -1 ;0 - ILLEGAL
5,,(BS.CDM) ;1 - CORE DUMP
-1 ;2 - SIXBIT
-1 ;3 - 7 BIT (ASCII)
1,,(BS.ICM) ;4 - INDUSTRY COMPAT
^D9,,(BS.HDM) ;5 - HIGH DENSITY
MAXMOD==.-MODTBL-1
MTSZMT: -1 ;ILLEGAL MODE
-1,,^D10 ;CORE DUMP
-1
-1
FM.PE,,^D8 ;1600BPI,,INDUSTRY COMPATABLE
FM.GCR,,^D18 ;6250BPI,,HIGH DENSITY
;IORB FUNCTION TO MSCP FUNCTION TRANSLATION
OP.DAT==1B0 ;DATA FUNCTION
OP.REV==1B1 ;REVERSE
OP.CHK==1B2 ;CHECK AFTER FUNCTION IS DONE
OP.REW==1B3 ;REWIND
OP.RDB==1B4 ;READ (SINGLE BIT)
OP.DEN==1B5 ;SET DENSITY IF NECESSARY
MSCFCN: 0 ;0 - ILLEGAL
OP.DAT!OP.RDB!OP.RD ;1 - READ
OP.DAT!OP.RDB!OP.RD ;2 - READ FORMAT AND DATA
OP.DAT!OP.DEN!OP.WR ;3 - WRITE
OP.DAT!OP.DEN!OP.WR ;4 - WRITE FORMAT AND DATA
0 ;5 - SEEK
OP.REP!OP.DEN ;6 - SKIP RECORD
OP.REV!OP.REP ;7 - BACKSPACE RECORD
OP.WTM!OP.DEN ;10 - WRITE TAPE MARK
OP.ERG!OP.DEN ;11 - ERASE
OP.REW!OP.REP ;12 - REWIND
OP.AVL ;13 - UNLOAD
OP.DAT!OP.REV!OP.RDB!OP.RD ;14 - READ REVERSE
0 ;15 - RECOVERY READ. ILLEGAL
OP.DAT!OP.CHK!OP.WR ;16 - WRITE VALIDITY CHECK
OP.DAT!OP.CHK!OP.RDB!OP.RD ;17 - READ VALIDITY CHECK
;
; THE FOLLOWING THREE TABLES MUST REMAIN IN SYNC. THE EQUIV TABLE
; IS THE OFFSET INTO CMDJMP AND CMDTBL.
; WARNING!!! DO NOT USE 0 SINCE IT WILL BE CONFUSED WITH DATA REQUEST
;
ILEGLL==0 ;DON'T USE THIS ENTRY!!
MSCGO1==1
MSC5A==2
MSCA8==3
ONLC1==4
MSCH30==5
MSCI4M==6
MSGA1==7
MSG55==8
; COMMAND TABLE. THIS IS MAINLY USED AS A CHECK TO SEE THAT THE
; COMMAND WE HAVE MATCHES THE POSSIBLE COMMAND REFERENCE NUMBER
; AND IS REALLY A LEGALITY CHECK
CMDTBL: 0 ;ILLEGAL
OP%ONL ;ONLINE STATUS
OP%SCC ;SET UNIT STATUS
OP%GUS ;GET UNIT STATUS
OP%GUS ;GET UNIT STATUS
OP%GCS ;GET COMMAND STATUS
OP%ONL ;ON LINE
OP%GUS ;GET UNIT STATUS
OP%AVL ;SET AVAILABLE
; COMMAND JUMP TABLE. THIS IS THE ADDRESS TO WHICH WE WILL JUMP
; WHEN A REQUEST TO THE SERVER HAS FINISHED OUR REQUEST.
;
CMDJMP: 0,,0 ;JUMP TO TABLE
MSEC1,,MSSONL
MSEC1,,MSC5AA
MSEC1,,MSCIA8
MSEC1,,ONLCK1
MSEC1,,MSCC10
MSEC1,,MSCI1A
MSEC1,,MSGAA
MSEC1,,MSC15A
SUBTTL End of PHYMSC
TNXEND
END