(DEFINE-FILE-INFO READTABLE "XCL" PACKAGE "INTERLISP")
(FILECREATED "11-Jul-88 23:14:35" {PHYLUM}<LISP>LYRIC>PATCHES>QUEUE-IOCB-PATCH.\;1 5484   

      |changes| |to:|  (VARS QUEUE-IOCB-PATCHCOMS) (FNS \\QUEUE.INPUT.IOCB))


; Copyright (c) 1988 by Xerox Corporation.  All rights reserved.

(PRETTYCOMPRINT QUEUE-IOCB-PATCHCOMS)

(RPAQQ QUEUE-IOCB-PATCHCOMS ((DECLARE\: EVAL@COMPILE EVAL@LOAD DONTCOPY (FILES SYSEDIT (LOADCOMP) 10MBDRIVER)) (FNS \\QUEUE.OUTPUT.IOCB \\QUEUE.INPUT.IOCB)))
(DECLARE\: EVAL@COMPILE EVAL@LOAD DONTCOPY 

(FILESLOAD SYSEDIT (LOADCOMP) 10MBDRIVER)
)
(DEFINEQ

(\\QUEUE.OUTPUT.IOCB
(LAMBDA (NDB IOCB BUFFER LENGTH) (* \; "Edited 11-Jul-88 22:55 by Burwell") (* |;;| "Queue up IOCB for transmission.  LENGTH is length of BUFFER in words") (PROG ((CSB (|fetch| NDBCSB |of| NDB))) (SELECTC \\MACHINETYPE (\\DANDELION (|replace| DLFOROUTPUTUSE |of| IOCB |with| 1) (* \; "So that \\10MB.GETPACKETSTATUS can tell which way packet is going") (* |;;| "the DLion IOCB Length is interpreted as the offset of the last word, not the number of words.") (|replace| DLIOCBLENGTH |of| IOCB |with| (SUB1 LENGTH)) (|replace| DLNEXTIOCB |of| IOCB |with| 0) (|replace| DLRETRANSMISSIONMASK |of| IOCB |with| 0) (|replace| DLIOCBSTATUS |of| IOCB |with| \\ES.PENDING) (|replace| DLIOCBBUFFER |of| IOCB |with| BUFFER) (COND ((NEQ (|fetch| DLFIRSTOCB |of| CSB) 0) (* \; "Hardware active, add to end of chain") (|replace| DLNEXTIOCB |of| (OR (EMPOINTER (|fetch| DLLASTOCB |of| CSB)) (RAID "Garbage Last OCB")) |with| (\\LOLOC IOCB)))) (COND ((AND (EQ (|fetch| DLFIRSTOCB |of| CSB) 0) (EQ (|fetch| DLIOCBSTATUS |of| IOCB) \\ES.PENDING)) (* \; "Separate check, as the hardware could have just gone idle since we last checked") (|replace| DLFIRSTOCB |of| CSB |with| (\\LOLOC IOCB)) (\\DEVICE.OUTPUT \\DL.ENABLE.OUTPUT \\DL.ETHEROUTPUTREG))) (|replace| DLLASTOCB |of| CSB |with| (\\LOLOC IOCB))) (\\DAYBREAK (|\\DoveEther.QueueOutput| IOCB BUFFER LENGTH)) (\\DOLPHIN (|replace| D0IOCBLENGTH |of| IOCB |with| (UNFOLD LENGTH BYTESPERWORD)) (|replace| D0NEXTIOCB |of| IOCB |with| 0) (|replace| D0RETRANSMISSIONMASK |of| IOCB |with| 0) (|replace| D0IOCBSTATUS |of| IOCB |with| \\ES.PENDING) (|replace| D0IOCBBUFFER |of| IOCB |with| BUFFER) (COND ((NEQ (|fetch| D0FIRSTOCB |of| CSB) 0) (* \; "Hardware active, add to end of chain") (|replace| D0NEXTIOCB |of| (OR (EMPOINTER (|fetch| D0LASTOCB |of| CSB)) (RAID "Garbage Last OCB")) |with| (\\LOLOC IOCB)))) (COND ((AND (EQ (|fetch| D0FIRSTOCB |of| CSB) 0) (EQ (|fetch| D0IOCBSTATUS |of| IOCB) \\ES.PENDING)) (* \; "Separate check, as the hardware could have just gone idle since we last checked") (|replace| D0FIRSTOCB |of| CSB |with| (\\LOLOC IOCB)) (\\DEVICE.OUTPUT \\D0.ENABLE.10MBOUTPUT (\\D0.CONTROLLERBITS NDB \\D0.OUTPUTSTATE)))) (|replace| D0LASTOCB |of| CSB |with| (\\LOLOC IOCB))) (\\NOMACHINETYPE))))
)

(\\QUEUE.INPUT.IOCB
(LAMBDA (NDB IOCB BUFFER LENGTH) (* \; "Edited 11-Jul-88 23:09 by Burwell") (* |;;| "Add IOCB to the end of the microcode input queue, with BUFFER of LENGTH words as its buffer.  I.e., this is a buffer that packets will be read into") (PROG ((CSB (|fetch| NDBCSB |of| NDB))) (SELECTC \\MACHINETYPE (\\DANDELION (|replace| DLFOROUTPUTUSE |of| IOCB |with| 0) (* \; "So that \\10MB.GETPACKETSTATUS can tell which way packet is going") (|replace| DLNEXTIOCB |of| IOCB |with| 0) (|replace| DLRETRANSMISSIONMASK |of| IOCB |with| 0) (|replace| DLIOCBSTATUS |of| IOCB |with| \\ES.PENDING) (* |;;| "DLion ucode interprets the length field as the offset of the last word not the number of words") (|replace| DLIOCBLENGTH |of| IOCB |with| (SUB1 LENGTH)) (|replace| DLIOCBBUFFER |of| IOCB |with| BUFFER) (COND ((NEQ (|fetch| DLFIRSTICB |of| CSB) 0) (* \; "There are some packets there, so add this to end") (|replace| DLNEXTIOCB |of| (OR (EMPOINTER (|fetch| DLLASTICB |of| CSB)) (RAID "Garbage last ICB")) |with| (\\LOLOC IOCB)))) (COND ((AND (EQ (|fetch| DLFIRSTICB |of| CSB) 0) (EQ (|fetch| DLIOCBSTATUS |of| IOCB) \\ES.PENDING)) (* |;;| "No buffers left, so queue this as the only one.  While we were in the last clause, microcode could have eaten up its last buffer, which is why we test twice") (|replace| DLFIRSTICB |of| CSB |with| (\\LOLOC IOCB)) (\\DEVICE.OUTPUT \\DL.ENABLE.INPUT \\DL.ETHERINPUTREG))) (|replace| DLLASTICB |of| CSB |with| (\\LOLOC IOCB))) (\\DAYBREAK (|\\DoveEther.QueueInput| IOCB BUFFER LENGTH)) (\\DOLPHIN (|replace| D0NEXTIOCB |of| IOCB |with| 0) (|replace| D0RETRANSMISSIONMASK |of| IOCB |with| 0) (|replace| D0IOCBSTATUS |of| IOCB |with| \\ES.PENDING) (|replace| D0IOCBLENGTH |of| IOCB |with| (UNFOLD LENGTH BYTESPERWORD)) (|replace| D0IOCBBUFFER |of| IOCB |with| BUFFER) (COND ((NEQ (|fetch| D0FIRSTICB |of| CSB) 0) (* \; "There are some packets there, so add this to end") (|replace| D0NEXTIOCB |of| (OR (EMPOINTER (|fetch| D0LASTICB |of| CSB)) (RAID "Garbage last ICB")) |with| (\\LOLOC IOCB)))) (COND ((AND (EQ (|fetch| D0FIRSTICB |of| CSB) 0) (EQ (|fetch| D0IOCBSTATUS |of| IOCB) \\ES.PENDING)) (* |;;| "No buffers left, so queue this as the only one.  While we were in the last clause, microcode could have eaten up its last buffer, which is why we test twice") (|replace| D0FIRSTICB |of| CSB |with| (\\LOLOC IOCB)) (\\DEVICE.OUTPUT \\D0.ENABLE.10MBINPUT (\\D0.CONTROLLERBITS NDB \\D0.INPUTSTATE)))) (|replace| D0LASTICB |of| CSB |with| (\\LOLOC IOCB))) (\\NOMACHINETYPE))))
)
)
(PUTPROPS QUEUE-IOCB-PATCH COPYRIGHT ("Xerox Corporation" 1988))
(DECLARE\: DONTCOPY
  (FILEMAP (NIL (586 5396 (\\QUEUE.OUTPUT.IOCB 596 . 2866) (\\QUEUE.INPUT.IOCB 2868 . 5394)))))
STOP