]> git.saurik.com Git - apple/xnu.git/blob - iokit/Drivers/scsi/drvSymbios8xx/Sym8xxScript.lis
6b690920f4f528e5ea7a9a76c8fc9cae949dab3f
[apple/xnu.git] / iokit / Drivers / scsi / drvSymbios8xx / Sym8xxScript.lis
1 1
2 2 ; Copyright (c) 1997-1999 Apple Computer, Inc. All rights reserved.
3 3 ;
4 4 ; @APPLE_LICENSE_HEADER_START@
5 5 ;
6 6 ; The contents of this file constitute Original Code as defined in and
7 7 ; are subject to the Apple Public Source License Version 1.1 (the
8 8 ; "License"). You may not use this file except in compliance with the
9 9 ; License. Please obtain a copy of the License at
10 10 ; http://www.apple.com/publicsource and read it before using this file.
11 11 ;
12 12 ; This Original Code and all software distributed under the License are
13 13 ; distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14 14 ; EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 15 ; INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16 16 ; FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17 17 ; License for the specific language governing rights and limitations
18 18 ; under the License.
19 19 ;
20 20 ; @APPLE_LICENSE_HEADER_END@
21 21 ;
22 22 ; File Ownership:
23 23 ;
24 24 ; DRI: Mike Johnson
25 25 ;
26 26 ; Other Contact: Russ Berkoff
27 27 ;
28 28 ; Technology: SCSI
29 29 ;
30 30 ; Writers:
31 31 ;
32 32 ; (MLJ) Mike Johnson
33 33 ; (RRA) Rick Auricchio
34 34
35 35
36 36 ; NCR Errata Listing 125 Item 1 : Clear the SCNTL0 start bit
37 37 ; when jump to reselect during select (try_reselect)
38 38 ;
39 39 ; NCR Errata Listing 117 Item 4 : Bad parity if odd bytes during
40 40 ; wide transfer. Only for DATA OUT in Initiator mode.
41 41 ; (Confirm by Manfred Eierle 3rd June 93 not during DATA IN)
42 42
43 43 ARCH 825A ;specifically for 825a and 875 (new instructions)
44 44
45 45
46 46 ;*****************************************************************
47 47 ;
48 48 ; Phase codes - These values represent which action is being handled
49 49 ;
50 50 ;*****************************************************************
51 51
52 52 ABSOLUTE kphase_DATA_OUT = 0x00
53 53 ABSOLUTE kphase_DATA_IN = 0x01
54 54 ABSOLUTE kphase_COMMAND = 0x02
55 55 ABSOLUTE kphase_STATUS = 0x03
56 56 ABSOLUTE kphase_MSG_OUT = 0x06
57 57 ABSOLUTE kphase_MSG_IN = 0x07
58 58 ABSOLUTE kphase_SELECT = 0x08
59 59 ABSOLUTE kphase_RESELECT = 0x09
60 60 ABSOLUTE kphase_ABORT_CURRENT = 0x0A
61 61 ABSOLUTE kphase_ABORT_MAILBOX = 0x0B
62 62 ABSOLUTE kphase_CMD_COMPLETE = 0x0C
63 63 ABSOLUTE kphase_DISCONNECT = 0x0D
64 64 ABSOLUTE kphase_saveDataPointer = 0x0E ; ??? driver work to be done
65 65 ABSOLUTE kphase_restoreDataPointer = 0x0F ; ??? driver work to be done
66 66
67 67
68 68 ;*****************************************************************
69 69 ; interrupt codes
70 70 ;*****************************************************************
71 71
72 72 ABSOLUTE unknown_phase = 0x00 ; A spurious phase on SCSI Bus
73 73 ABSOLUTE status_error = 0x01 ; IO completes, but with status error
74 74 ABSOLUTE unexpected_msg = 0x02 ; An 'unknown' message is in ld_message var
75 75 ABSOLUTE unexpected_ext_msg = 0x03 ; An 'unknown' extended message in ld_message
76 76 ABSOLUTE wide_32_not_supported = 0x04 ; The device wants 32 bits data phase
77 77 ABSOLUTE no_msgin_after_reselect = 0x05 ; No message-in after reselection
78 78 ABSOLUTE reqack_too_large = 0x06 ; The device answer ReqAck offset is greater than 8
79 79 ABSOLUTE unknown_reselect = 0x07 ; The valid bit in SFBR reg not set
80 80 ABSOLUTE unallocated_nexus = 0x08 ; nexus index -> 0xFFFFFFFF
81 81 ABSOLUTE abort_mailbox = 0x09 ; Abort/BDR mailbox completed
82 82 ABSOLUTE abort_current = 0x0A ; Abort/BDR current op completed
83 83 ABSOLUTE unknown_message_out = 0x0B ; Unknown phase before message out
84 84 ABSOLUTE unknown_msg_reject = 0x0C ; Unknown message reject
85 85 ABSOLUTE negotiateSDTR = 0x0D ; Sync negotiation rx'd
86 86 ABSOLUTE negotiateWDTR = 0x0E ; Wide negotiation rx'd
87 87 ABSOLUTE sglist_complete = 0x0F ; SGList complete
88 88
89 89
90 90 ;*****************************************************************
91 91 ;
92 92 ; Data structure for T/L/Q Nexus:
93 93 ;
94 94 ;*****************************************************************
95 95
96 96 ABSOLUTE TLQ_SCSI_ID = 0 ; 4 SCSI ID et al for SELECT instruction
97 97 ABSOLUTE TLQ_xferAdr = 4 ; 4 Physical address of CHMOV instructions
98 98 ABSOLUTE TLQ_MSGOp = 8 ; 8 Byte count, data adr -> TLQ_MSGO
99 99 ABSOLUTE TLQ_CDBp = 16 ; 8 Byte count, data adr -> TLQ_CDB
100 100 ABSOLUTE TLQ_CDP = 24 ; 4 Current Data Pointer
101 101 ABSOLUTE TLQ_SDP = 28 ; 4 Saved Data Pointer
102 102 ABSOLUTE TLQ_index = 32 ; 1 index into nexus array
103 103 ABSOLUTE TLQ_xferStarted= 33 ; 1 transfer started flag
104 104 ABSOLUTE TLQ_IWR = 34 ; 1 flag to Ignore Wide Residue
105 105 ABSOLUTE TLQ_pad = 35 ; 1 pad byte
106 106
107 107
108 108 ;*****************************************************************
109 109 ;
110 110 ; ENTRY declarations - Declare entry points for driver
111 111 ;
112 112 ;*****************************************************************
113 113
114 114 ENTRY select_phase
115 115 ENTRY phase_handler
116 116 ENTRY issueMessageOut ; for negotiation and Reject messages
117 117 ENTRY issueAbort_BDR ; to immediately Abort or Bus-Device-Reset
118 118 ENTRY clearACK ; MsgIn done - clr ACK, jump to phase handler
119 119
120 120
121 121 ;*****************************************************************
122 122 ;
123 123 ; Define local data structure at start of SCRIPTS.
124 124 ; This structure is allocated by the following nops.
125 125 ;
126 126 ;*****************************************************************
127 127 ;
128 128
129 129 RELATIVE local_data \
130 130 00000000: ld_AbortCode = 4{??}\ ; 1 byte code to Abort or BDR
131 131 00000004: ld_zeroes = 4{??}\ ; 4 bytes of 0 to clear registers
132 132 00000008: ld_status = 4{??}\ ; Status byte from target
133 133 0000000C: ld_counter = 4{??}\ ; index into mailbox array
134 134 00000010: ld_AbortBdr_mailbox = 4{??}\ ; Abort/BusDeviceReset mailbox
135 135 00000014: ld_IOdone_mailbox = 4{??}\ ; [ nexus 0 0 semaphore ]
136 136 00000018: ld_sched_mlbx_base_adr = 4{??}\ ; base addr of mailbox array
137 137 0000001C: ld_mailboxp = 4{??}\ ; address of current mailbox
138 138 00000020: ld_scsi_id = 4{??}\ ; ptr to current mailbox
139 139 00000024: ld_nexus_array_base = 4{??}\ ; base address of Nexus pointers
140 140 00000028: ld_nexus_index = 4{??}\ ; index to Nexus pointer
141 141 0000002C: ld_nexus = 4{??}\ ; address of Nexus
142 142 00000030: ld_phase_flag = 4{??}\ ; for debugging
143 143 00000034: ld_device_table_base_adr = 4{??}\ ; device configuration table
144 144 00000038: ld_scratch = 4{??}\ ; scratch memory
145 145 0000003C: ld_unused = 4{??}\ ; unused
146 146 00000040: ld_message = 4{??}\ ; buffer for MsgIn bytes
147 147 00000044: ld_message4 = 4{??}\ ; buffer continuation
148 148 00000048: ld_pad = 4{??}\ ; padding
149 149 0000004C: ld_size = 4{??} ; size of this structure
150 150
151 151
152 152 00000000: PROC BSC_SCRIPT:
153 153
154 154 ; *** These NOPs must be at address 0. ***
155 155 ; *** This is reserved space for the structure "local_data". ***
156 156 ; *** The driver inits this area to zero. ***
157 157
158 158 00000000: 80000000 00000000 nop 0 ; ld_AbortCode, ld_zeroes
159 159 00000008: 80000000 00000000 nop 0 ; ld_status, ld_counter
160 160
161 161 00000010: 80000000 00000000 nop 0 ; ld_AbortBdr_mailbox, ld_IOdone_mailbox
162 162 00000018: 80000000 00000000 nop 0 ; ld_sched_mlbx_base_adr, ld_mailboxp
163 163
164 164 00000020: 80000000 00000000 nop 0 ; ld_scsi_id, ld_nexus_array_base
165 165 00000028: 80000000 00000000 nop 0 ; ld_nexus_index, ld_nexus
166 166
167 167 00000030: 80000000 00000000 nop 0 ; ld_phase_flag, ld_device_table_base_adr
168 168 00000038: 80000000 00000000 nop 0 ; ld_scratch, ld_unused
169 169
170 170 00000040: 80000000 00000000 nop 0 ; ld_message, ld_message4
171 171 00000048: 80000000 0000004C nop ld_size ; ld_pad, ld_size (Use ld_size or lose it)
172 172
173 173 00000050: 80000000 0000000F nop sglist_complete ; use sglist_complete or lose it from gen'd output file
174 174
175 175 ;****************************************************************************
176 176 ;
177 177 ; findNexusFromIndex - load DSA with pointer to Nexus given a Nexus index:
178 178 ;
179 179 ;****************************************************************************
180 180
181 181 00000058: findNexusFromIndex:
182 182
183 183 00000058: E1340004 00000028 load SCRATCHA0, 4, ld_nexus_index ; load index and leading zeroes
184 184 00000060: 60000400 00000000 clear CARRY
185 185 00000068: 79340000 00000000 move SCRATCHA0 SHL 0 to SCRATCHA0 ; double the index
186 186 00000070: 79350000 00000000 move SCRATCHA1 SHL 0 to SCRATCHA1
187 187 00000078: 79340000 00000000 move SCRATCHA0 SHL 0 to SCRATCHA0 ; double again
188 188 00000080: 79350000 00000000 move SCRATCHA1 SHL 0 to SCRATCHA1 ; A0 now has index to 4-byte address
189 189 00000088: E0340004 0000009C store SCRATCHA0, 4, patchArrayOffset+4 ; *** patch the code
190 190
191 191 00000090: E1100004 00000024 load DSA0, 4, ld_nexus_array_base ; load base address of array of Nexus pointers
192 192 00000098: patchArrayOffset:
193 193 00000098: F1100004 00000000 load DSA0, 4, DSAREL( 0 ) ; *** patched offset. Load pointer.
194 194
195 195 000000A0: 72100000 00000000 move DSA0 to SFBR ; Ensure pointer is not 0xFFFFFFFF
196 196 000000A8: 980C00FF 00000008 int unallocated_nexus, if 0xFF ; Interrupt if NFG
197 197
198 198 000000B0: E0100004 0000002C store DSA0, 4, ld_nexus ; Store the Nexus pointer
199 199 000000B8: 90080000 00000000 return ; end findNexusFromIndex
200 200
201 201
202 202 ;****************************************************************************
203 203 ;
204 204 ; initContext - Initialize the registers for Sync and Wide using
205 205 ; values stored in the device configuration table.
206 206 ; Return with values in SCRATCHB for Select code.
207 207 ;
208 208 ;****************************************************************************
209 209
210 210 000000C0: initContext:
211 211
212 212 000000C0: E15C0004 00000020 load SCRATCHB0, 4, ld_scsi_id ; load 4-bit SCSI ID and zeroes
213 213 000000C8: 60000400 00000000 clear CARRY
214 214 000000D0: 795C0000 00000000 move SCRATCHB0 SHL SCRATCHB0 ; * 2
215 215 000000D8: 795C0000 00000000 move SCRATCHB0 SHL SCRATCHB0 ; * 2 -> UInt32 index
216 216 000000E0: E05C0004 000000F4 store SCRATCHB0, 4, patchGetDevConfigOffset+4 ; *** Patch load code
217 217
218 218 000000E8: E1100004 00000034 load DSA0, 4, ld_device_table_base_adr ; load base physical addr of tables
219 219
220 220 000000F0: patchGetDevConfigOffset:
221 221 000000F0: F15C0004 00000000 load SCRATCHB0, 4, DSAREL( 0 ) ; *** Patched table offset ***
222 222
223 223 ; SCRATCHB0 = 0
224 224 ; SCRATCHB1 = TP,MO (SXFER bits7-5 bits3-0)
225 225 ; SCRATCHB2 = 0 (position for SCSI ID)
226 226 ; SCRATCHB3 = SCCF,EWS (SCNTL3 bits6-4 bit 3)
227 227
228 228 000000F8: 725D0000 00000000 move SCRATCHB1 to SFBR ; init SXFER from B1
229 229 00000100: 6A050000 00000000 move SFBR to SXFER
230 230 ; Init SCNTL3 from B3
231 231 00000108: 725F0000 00000000 move SCRATCHB3 to SFBR
232 232 00000110: 6A030000 00000000 move SFBR to SCNTL3
233 233 00000118: 90080000 00000000 return ; return with SCRATCHB intact.
234 234
235 235
236 236 ;*****************************************************************
237 237 ;
238 238 ; Select_phase:
239 239 ; Clear the SIGP bit.
240 240 ; Check if any Abort/BusDeviceReset request waiting.
241 241 ; Nexus is found in the list of 256 mailboxes.
242 242 ; If current mailbox is empty, jump to reselect_phase.
243 243 ; SCRIPTS tries to select device.
244 244 ; If select fails due to reselect, jump to reselect_phase
245 245 ; Select Timeout handled by driver.
246 246 ; If select succeeds, clear the mailbox entry
247 247 ; and increment the mailbox counter.
248 248 ; Jump to the phase_handler (hopefully for MSG_OUT)
249 249 ;
250 250 ;*****************************************************************
251 251
252 252 00000120: select_phase:
253 253
254 254 00000120: 7A1A0000 00000000 move CTEST2 | 0x00 to CTEST2 ; Clear SIGP bit from ISTAT reg
255 255
256 256 ; Check abort mailbox:
257 257
258 258 00000128: E1340004 00000010 load SCRATCHA0, 4, ld_AbortBdr_mailbox ; Get AbortBdr mailbox
259 259 ; The Identify byte in byte 0 is also the semaphore
260 260 ; A0 = Identify byte (0xC0 + LUN N.B. Disconnect allowed)
261 261 ; A1 = Tag, if any
262 262 ; A2 = SCSI ID
263 263 ; A3 = Abort code Abort=0x06; Abort Tag=0D; Bus Device Reset=0x0C
264 264 00000130: 72340000 00000000 move SCRATCHA0 to SFBR ; test the semaphore/Identify
265 265 00000138: 80840000 000005F0 jump rel( AbortMailbox ), if not 0 ; jump if aborting
266 266
267 267
268 268 ; Get the next IO nexus in the mailboxes circular list.
269 269 ; Calculate current mailbox address as so:
270 270 ; counter byte index * 4 to get mailbox index
271 271 ; add base physical address of mailboxes giving current mailbox address
272 272
273 273 00000140: E1340004 0000000C load SCRATCHA0, 4, ld_counter ; get 1-byte mailbox counter & 0s
274 274 00000148: 60000400 00000000 clear CARRY
275 275 00000150: 79340000 00000000 move SCRATCHA0 SHL 0 to SCRATCHA0 ; double it
276 276 00000158: 79350000 00000000 move SCRATCHA1 SHL 0 to SCRATCHA1
277 277 00000160: 79340000 00000000 move SCRATCHA0 SHL 0 to SCRATCHA0 ; double it again
278 278 00000168: 79350000 00000000 move SCRATCHA1 SHL 0 to SCRATCHA1 ; now have a UInt32 index
279 279 00000170: E0340004 0000018C store SCRATCHA0, 4, fetchMailbox+4 ; *** patch the load DSA instruction
280 280 00000178: E0340004 0000025C store SCRATCHA0, 4, clear_mailbox+4 ; *** patch the store DSA instruction
281 281
282 282 00000180: E1100004 00000018 load DSA0, 4, ld_sched_mlbx_base_adr ; load base physical address of mailboxes
283 283
284 284 00000188: fetchMailbox:
285 285 00000188: F1100004 00000000 load DSA0, 4, DSAREL( 0 ) ; *** Patched offset. Load Nexus address
286 286 00000190: E0100004 0000002C store DSA0, 4, ld_nexus ; save pointer to current Nexus
287 287 00000198: E1340004 0000002C load SCRATCHA0, 4, ld_nexus ; copy to A0
288 288
289 289 000001A0: 72340000 00000000 move SCRATCHA0 to SFBR ;
290 290 000001A8: 808C0001 00000098 jump rel( next_mailbox ), if 1 ; if low-byte == 0x01 then cancelled mailbox
291 291
292 292 000001B0: 72B50000 00000000 move SCRATCHA1 | SFBR to SFBR ; if non-zero, have implicit semaphore
293 293 000001B8: 72B60000 00000000 move SCRATCHA2 | SFBR to SFBR
294 294 000001C0: 72B70000 00000000 move SCRATCHA3 | SFBR to SFBR
295 295 000001C8: 808C0000 00000458 jump rel( reselect_phase ), if 0 ; go to reselect_phase if empty
296 296
297 297 ;*****************************************************************
298 298 ;
299 299 ; Something in mailbox: we have work to do
300 300 ;
301 301 ;*****************************************************************
302 302
303 303 000001D0: 785C0800 00000000 move kphase_SELECT to SCRATCHB0 ; set phase indicator
304 304 000001D8: E05C0001 00000030 store SCRATCHB0, 1, ld_phase_flag
305 305
306 306 000001E0: E15C0004 00000004 load SCRATCHB0, 4, ld_zeroes ; clr the invalid-nexus-index flag
307 307 000001E8: F15C0001 00000020 load SCRATCHB0, 1, DSAREL( TLQ_index ) ; get index byte from nexus
308 308 000001F0: E05C0004 00000028 store SCRATCHB0, 4, ld_nexus_index ; save it in local data
309 309
310 310 000001F8: E1100004 0000002C load DSA0, 4, ld_nexus ; restore DSA register
311 311 00000200: F15E0001 00000002 load SCRATCHB2, 1, DSAREL( TLQ_SCSI_ID+2 ) ; get Target's SCSI ID
312 312 00000208: 725E0000 00000000 move SCRATCHB2 to SFBR
313 313 00000210: 6A5C0000 00000000 move SFBR to SCRATCHB0 ; position it
314 314 00000218: E05C0001 00000020 store SCRATCHB0, 1, ld_scsi_id ; save it
315 315 00000220: 88880000 FFFFFE98 call rel( initContext ) ; setup Sync/Wide regs in SCRATCHB
316 316 00000228: E1100004 0000002C load DSA0, 4, ld_nexus ; restore DSA register
317 317 00000230: F05D0001 00000001 store SCRATCHB1, 1, DSAREL( TLQ_SCSI_ID+1 ) ; SXFER
318 318 00000238: F05F0001 00000003 store SCRATCHB3, 1, DSAREL( TLQ_SCSI_ID+3 ) ; SCNTL3
319 319
320 320 ;********************** select the device ********************************
321 321 00000240: 47000000 000003D0 SELECT ATN from TLQ_SCSI_ID, rel( try_reselect ) ; ************************
322 322 ;*************************************************************************
323 323
324 324 ; looking good - clear the mailbox:
325 325
326 326 00000248: next_mailbox:
327 327 00000248: E1340004 00000004 load SCRATCHA0, 4, ld_zeroes ; zero out scratch register A
328 328 00000250: E1100004 00000018 load DSA0, 4, ld_sched_mlbx_base_adr ; load base physical address of mailboxes
329 329 00000258: clear_mailbox:
330 330 00000258: F0340004 00000000 store SCRATCHA0, 4, DSAREL( 0 ) ; *** Patched offset. Zero the mailbox
331 331
332 332 ; Update the index to the mailbox circular list:
333 333 00000260: E15C0001 0000000C load SCRATCHB0, 1, ld_counter ; get counter (mailbox index)
334 334 00000268: 7E5C0100 00000000 move SCRATCHB0 + 1 to SCRATCHB0 ; add 1
335 335 00000270: E05C0001 0000000C store SCRATCHB0, 1, ld_counter ; put it back
336 336
337 337 00000278: E15C0001 0000002C load SCRATCHB0, 1, ld_nexus ; if low-byte == 0x01 then cancelled mailbox
338 338 00000280: 725C0000 00000000 move SCRATCHB0 to SFBR
339 339 00000288: 808C0001 FFFFFE90 jump rel( select_phase ), if 1
340 340
341 341 ; *** FALL THROUGH TO phase_handler ***
342 342
343 343
344 344 ;*****************************************************************
345 345 ;
346 346 ; Phase_handler
347 347 ; The phase handler script is a dispatcher function of SCSI phase
348 348 ;
349 349 ;*****************************************************************
350 350
351 351 00000290: phase_handler:
352 352 00000290: E1100004 0000002C load DSA0, 4, ld_nexus ; reload DSA
353 353 00000298: 828B0000 00000088 jump rel( command_phase ), when CMD ; wait for REQ
354 354 000002A0: 808A0000 000000A8 jump rel( data_out_phase ), if DATA_OUT ; already latched REQ signal
355 355 000002A8: 868A0000 00000020 jump rel( message_out_phase ), if MSG_OUT
356 356 000002B0: 818A0000 000000E0 jump rel( data_in_phase ), if DATA_IN
357 357 000002B8: 838A0000 00000108 jump rel( status_phase ), if STATUS
358 358 000002C0: 878A0000 00000120 jump rel( message_in_phase ), if MSG_IN
359 359 000002C8: 98080000 00000000 int unknown_phase
360 360
361 361
362 362 ;*****************************************************************
363 363 ;
364 364 ; Message-Out phase
365 365 ;
366 366 ;*****************************************************************
367 367
368 368 000002D0: message_out_phase:
369 369 000002D0: 785C0600 00000000 move kphase_MSG_OUT to SCRATCHB0 ; Set phase indicator
370 370 000002D8: E05C0001 00000030 store SCRATCHB0, 1, ld_phase_flag
371 371
372 372 000002E0: 1E000000 00000008 move from TLQ_MSGOp, when MSG_OUT ; put out the message(s)
373 373 000002E8: 80880000 FFFFFFA0 jump rel( phase_handler )
374 374
375 375
376 376 ; issueMessageOut - Driver entry point for Sync/Wide negotiation and
377 377 ; to issue message Reject:
378 378
379 379 000002F0: issueMessageOut:
380 380 000002F0: 58000008 00000000 set ATN ; tell Target we have something to say
381 381 000002F8: 60000040 00000000 clear ACK
382 382 00000300: 868B0000 FFFFFFC8 jump rel( message_out_phase ), when MSG_OUT ; wait for REQ. Jump if msg-out phase.
383 383 00000308: 87820000 FFFFFF80 jump rel( phase_handler ), if not MSG_IN ; jump if weird phase
384 384 00000310: 0F000001 00000039 move 1, ld_scratch+1, when MSG_IN ; dump the msg byte
385 385 00000318: 60000040 00000000 clear ACK ; accept Target's last msg-in byte
386 386 00000320: 80880000 FFFFFFC8 jump rel( issueMessageOut )
387 387
388 388
389 389 ;*****************************************************************
390 390 ;
391 391 ; Command phase
392 392 ;
393 393 ;*****************************************************************
394 394
395 395 00000328: command_phase:
396 396 00000328: 785C0200 00000000 move kphase_COMMAND to SCRATCHB0 ; Set phase indicator
397 397 00000330: E05C0001 00000030 store SCRATCHB0, 1, ld_phase_flag
398 398
399 399 00000338: 60000008 00000000 clear ATN ; In case we missed the sending nego
400 400 00000340: 1A000000 00000010 move FROM TLQ_CDBp, when CMD ; issue the CDB
401 401 00000348: 80880000 FFFFFF40 jump rel( phase_handler )
402 402
403 403
404 404 ;*****************************************************************
405 405 ;
406 406 ; Data_out_phase
407 407 ;
408 408 ;*****************************************************************
409 409
410 410 00000350: data_out_phase:
411 411 00000350: 785C0000 00000000 move kphase_DATA_OUT to SCRATCHB0 ; Set phase indicator
412 412 00000358: E05C0001 00000030 store SCRATCHB0, 1, ld_phase_flag
413 413
414 414 00000360: 88880000 00000008 call rel( driverXfer ) ; call driver-built CHMOV instructions
415 415 00000368: 80880000 FFFFFF20 jump rel( phase_handler ) ; if all data xfer'd, get next phase
416 416
417 417 00000370: driverXfer: ; get here from data-in code also
418 418 00000370: F1340004 00000004 load SCRATCHA0, 4, DSAREL( TLQ_xferAdr )
419 419 00000378: E0340004 00000394 store SCRATCHA0, 4, doItPatch+4 ; *** patch the JUMP address
420 420 00000380: 7835FF00 00000000 move 0xFF to SCRATCHA1
421 421 00000388: F0350001 00000021 store SCRATCHA1, 1, DSAREL( TLQ_xferStarted )
422 422
423 423 00000390: doItPatch:
424 424 00000390: 80080000 00000333 jump 0x0333 ; *** patched address
425 425
426 426
427 427
428 428 ;*****************************************************************
429 429 ;
430 430 ; Data_in_phase
431 431 ; 875 sets ATN if bad parity detected.
432 432 ; Use of CHMOV instructions assures that we properly handle
433 433 ; a leftover wide byte in the SWIDE or SODL register, depending
434 434 ; on the data direction. This can happen in either of two conditions:
435 435 ; 1. The Target disconnects at an odd boundary. This is
436 436 ; extremely unlikely with disk devices.
437 437 ; 2. The client passes either an odd buffer address or
438 438 ; an odd transfer count. When the Target disconnects (at
439 439 ; an even boundary, we end up with the extra wide
440 440 ; byte in SWIDE or SODL. MacOS does this with VM on.
441 441 ;
442 442 ;*****************************************************************
443 443
444 444 00000398: data_in_phase:
445 445 00000398: 785C0100 00000000 move kphase_DATA_IN to SCRATCHB0 ; Set phase indicator
446 446 000003A0: E05C0001 00000030 store SCRATCHB0, 1, ld_phase_flag
447 447
448 448 000003A8: 88880000 FFFFFFC0 call rel( driverXfer ) ; call driver-built CHMOV instructions
449 449
450 450 ; The driver gets interrupted if a phase mismatch occurs as when
451 451 ; the Target goes MSG-IN with a Disconnect.
452 452 ; The driver codes either a RETURN if the Scatter/Gather list is complete or
453 453 ; an INT if more Scatter/Gather elements need to be generated.
454 454 ; On the Macintosh, client programs expect extra incoming data to be dumped.
455 455 ; For example, during boot the ROM reads 512 bytes from a 2K-byte-sector CD.
456 456
457 457 000003B0: bucket_loop:
458 458 000003B0: 81830000 FFFFFED8 jump rel( phase_handler ), when not DATA_IN ; wait for phase, exit if changed
459 459 000003B8: 01000001 00000008 CHMOV 1, ld_status, when DATA_IN ; eat a byte
460 460 000003C0: 80880000 FFFFFFE8 jump rel( bucket_loop ); ; keep dumping bytes
461 461
462 462
463 463 ;*****************************************************************
464 464 ;
465 465 ; Status phase
466 466 ;
467 467 ;*****************************************************************
468 468
469 469 000003C8: status_phase:
470 470 000003C8: 785C0300 00000000 move kphase_STATUS to SCRATCHB0 ; Set phase indicator
471 471 000003D0: E05C0001 00000030 store SCRATCHB0, 1, ld_phase_flag
472 472
473 473 000003D8: 0B000001 00000008 move 1, ld_status, when STATUS ; Read Status byte from bus
474 474 000003E0: 80880000 FFFFFEA8 jump rel( phase_handler )
475 475
476 476
477 477 ;*****************************************************************
478 478 ;
479 479 ; Message-In phase
480 480 ;
481 481 ;*****************************************************************
482 482
483 483 000003E8: message_in_phase:
484 484 000003E8: 785C0700 00000000 move kphase_MSG_IN to SCRATCHB0 ; Set phase indicator
485 485 000003F0: E05C0001 00000030 store SCRATCHB0, 1, ld_phase_flag
486 486
487 487 000003F8: 0F000001 00000040 move 1, ld_message, when MSG_IN ; Read byte from bus
488 488
489 489 00000400: 808C0000 000000C0 jump rel( cmdComplete ), if 0x00 ; Command Complete
490 490 00000408: 808C0002 000001A8 jump rel( saveDataPointer ), if 0x02 ; Save Data Pointer
491 491 00000410: 808C0004 00000148 jump rel( disconnect_msg ), if 0x04 ; Disconnect
492 492 00000418: 808C0023 00000038 jump rel( ignoreWideResidue ), if 0x23 ; Ignore Wide Residue
493 493 00000420: 808C0003 000001B0 jump rel( restoreDataPointer ), if 0x03 ; Restore Data Pointer
494 494 00000428: 808C0001 00000058 jump rel( extended_msg ), if 0x01 ; Extended message
495 495 00000430: 808C0007 00000008 jump rel( msg_reject ), if 0x07 ; Message Reject
496 496 ; Identify, if 0x80-FF ; Identify + LUN
497 497 ; simple_queue_tag, if 0x20 ; Simple Queue Tag
498 498 ; initiate_recovery, if 0x0F ; Initiate Recovery
499 499 ; linked_cde_complete, if 0x0A/0x0B
500 500 00000438: 98080000 00000002 int unexpected_msg ; unknown
501 501
502 502 00000440: msg_reject:
503 503 00000440: 98080000 0000000C int unknown_msg_reject
504 504
505 505 00000448: clearACK: ; ENTRY point to end negotiation
506 506 00000448: 60000040 00000000 clear ACK
507 507 00000450: 80880000 FFFFFE38 jump rel( phase_handler )
508 508
509 509
510 510
511 511 ;*****************************************************************
512 512 ;
513 513 ; Ignore Wide Residue
514 514 ;
515 515 ;*****************************************************************
516 516
517 517 00000458: ignoreWideResidue: ; this is a two byte message so snag the 2nd byte here
518 518 00000458: 60000040 00000000 clear ACK
519 519 00000460: 0F000001 00000041 move 1, ld_message+1, when MSG_IN ; save residue count
520 520 00000468: 6A5E0000 00000000 move SFBR to SCRATCHB2 ; byte is still in SFBR. Position it.
521 521 00000470: F05E0001 00000022 store SCRATCHB2, 1, DSAREL( TLQ_IWR ) ; Store residue count in Nexus for driver.
522 522 00000478: 60000040 00000000 clear ACK
523 523 00000480: 80880000 FFFFFE08 jump rel( phase_handler )
524 524
525 525
526 526 ;*****************************************************************
527 527 ;
528 528 ; Extended message
529 529 ; Accept Wide and Synchronous Data Transfer messages
530 530 ;
531 531 ;*****************************************************************
532 532
533 533 00000488: extended_msg:
534 534 00000488: 60000040 00000000 clear ACK
535 535 00000490: 0F000001 00000041 move 1, ld_message+1, when MSG_IN ; read msg length byte from bus
536 536 00000498: 60000040 00000000 clear ACK
537 537 000004A0: 0F000001 00000042 move 1, ld_message+2, when MSG_IN ; read ext msg code from bus
538 538 000004A8: 60000040 00000000 clear ACK
539 539 ; extended_identify, IF 0x02
540 540 ; modify_data_pointer, if 0x00
541 541 000004B0: 808C0001 00000140 jump rel( sdtr ), if 0x01 ; jump if SDTR, sync negotiation msg
542 542 000004B8: 808C0003 00000148 jump rel( wdtr ), if 0x03 ; jump if WDTR, wide negotiation msg
543 543 000004C0: 98080000 00000003 int unexpected_ext_msg ; let driver deal with unknown
544 544
545 545
546 546 ;*****************************************************************
547 547 ;
548 548 ; Command complete
549 549 ; The Command-Complete message is sent to indicate that the
550 550 ; IO operation has completed and valid status has been sent.
551 551 ; The Target should then disconnect.
552 552 ; SCRIPTS must spin until the IOdone mailbox is empty.
553 553 ; Then it sets the IOdone mailbox with the current Nexus.
554 554 ; The status message is analyzed.
555 555 ; If status is good, INTF the driver and jump to select_phase.
556 556 ; If status is NG, save it in the NEXUS and INT the driver.
557 557 ;
558 558 ;*****************************************************************
559 559
560 560 000004C8: cmdComplete:
561 561 000004C8: 785C0C00 00000000 move kphase_CMD_COMPLETE to SCRATCHB0 ; Set phase indicator
562 562 000004D0: E05C0001 00000030 store SCRATCHB0, 1, ld_phase_flag
563 563
564 564 000004D8: 7C027F00 00000000 move SCNTL2 & 0X7F to SCNTL2 ; Clr SDU: SCSI Disconnect Unexpected
565 565 000004E0: 60000040 00000000 clear ACK
566 566 000004E8: 48000000 00000000 WAIT DISCONNECT
567 567
568 568 000004F0: testMbxLp: ; loop until IOdone mailbox empty
569 569 000004F0: E1340004 00000014 load SCRATCHA0, 4, ld_IOdone_mailbox
570 570 000004F8: 72370000 00000000 move SCRATCHA3 to SFBR ; A3 = semaphore
571 571 00000500: 80840000 FFFFFFE8 jump rel( testMbxLp ), if not 0
572 572
573 573 ; Fill in the IOdone mailbox with the following:
574 574 ; A0 = index to Nexus
575 575 ; A1 = Status
576 576 ; A2 = 0
577 577 ; A3 = semaphore (FF = set)
578 578 00000508: E1340001 00000028 load SCRATCHA0, 1, ld_nexus_index ; A0 = index to Nexus
579 579 00000510: E15C0001 00000008 load SCRATCHB0, 1, ld_status
580 580 00000518: 725C0000 00000000 move SCRATCHB0 to SFBR
581 581 00000520: 6A350000 00000000 move SFBR to SCRATCHA1 ; A1 = Status
582 582 00000528: 78360000 00000000 move 0x00 to SCRATCHA2 ; A2 = 0
583 583 00000530: 7837FF00 00000000 move 0xFF to SCRATCHA3 ; A3 = semaphore IOdone mailbox
584 584 00000538: E0340004 00000014 store SCRATCHA0, 4, ld_IOdone_mailbox
585 585
586 586 00000540: 72350000 00000000 move SCRATCHA1 to SFBR ; Test the Status of this IO
587 587 ; SFBR = status msg
588 588 ; Test status - If good, Interrupt on the fly and jump to select phase
589 589 00000548: 981CC100 000000FF intfly 0xFF, if 0 and mask 0xC1 ; mask off reserved bits
590 590 00000550: 808CC100 FFFFFBC8 jump rel( select_phase ), if 0 and mask 0xC1
591 591 00000558: 98080000 00000001 int status_error ; Status err. Interrupt driver & stop
592 592
593 593
594 594 ;*****************************************************************
595 595 ;
596 596 ; Disconnect
597 597 ; The 8xx Accepts the disconnection and jumps to the select_phase
598 598 ; to check for another IO
599 599 ;
600 600 ;*****************************************************************
601 601
602 602 00000560: disconnect_msg:
603 603 00000560: E15C0001 00000030 load SCRATCHB0, 1, ld_phase_flag
604 604 00000568: 725C0000 00000000 move SCRATCHB0 to SFBR
605 605 ; If we got here from reselect just bailout since ld_nexus is
606 606 ; not setup and the code using it is not needed anyway (no data xfer)
607 607 00000570: 808C0009 00000010 jump rel( bailout ), if kphase_RESELECT
608 608
609 609 00000578: 785C0D00 00000000 move kphase_DISCONNECT to SCRATCHB0
610 610 00000580: E05C0001 00000030 store SCRATCHB0, 1, ld_phase_flag
611 611
612 612 00000588: bailout:
613 613 00000588: 785FFF00 00000000 move 0xFF to SCRATCHB3 ; invalidate nexus index for driver
614 614 00000590: E05F0001 0000002B store SCRATCHB3, 1, ld_nexus_index+3
615 615 00000598: 7C027F00 00000000 move SCNTL2 & 0x7F to SCNTL2 ; Clr SDU: SCSI Disconnect Unexpected
616 616 000005A0: 60000040 00000000 clear ACK
617 617 000005A8: 48000000 00000000 WAIT DISCONNECT ; wait for bus-free
618 618 000005B0: 80880000 FFFFFB68 jump rel( select_phase ) ; go see if more to do
619 619
620 620
621 621 ;******************************************************************
622 622 ;
623 623 ; ??? mlj - saveDataPointer and restoreDataPointer are incorrect.
624 624 ; ??? They basically do nothing.
625 625 ; Save Data Pointer
626 626 ;
627 627 ;*****************************************************************
628 628
629 629 000005B8: saveDataPointer:
630 630 000005B8: 785C0E00 00000000 move kphase_saveDataPointer to SCRATCHB0
631 631 000005C0: E05C0001 00000030 store SCRATCHB0, 1, ld_phase_flag
632 632 000005C8: 60000040 00000000 clear ACK
633 633 000005D0: 80880000 FFFFFCB8 jump rel( phase_handler )
634 634
635 635
636 636 ;******************************************************************
637 637 ;
638 638 ; ??? mlj - saveDataPointer and restoreDataPointer are incorrect.
639 639 ; ??? They basically do nothing.
640 640 ; Restore Data Pointer
641 641 ; The local values still blocks, still bytes and data address
642 642 ; must be loaded from the corresponding NEXUS data set.
643 643 ; This message should followed an IDE (parity error)
644 644 ;
645 645 ;*****************************************************************
646 646
647 647 000005D8: restoreDataPointer:
648 648 000005D8: 785C0F00 00000000 move kphase_restoreDataPointer to SCRATCHB0
649 649 000005E0: E05C0001 00000030 store SCRATCHB0, 1, ld_phase_flag
650 650 000005E8: 60000040 00000000 clear ACK
651 651 000005F0: 80880000 FFFFFC98 jump rel( phase_handler )
652 652
653 653
654 654 ;*****************************************************************
655 655 ;
656 656 ; Synchronous data transfer request or response
657 657 ;
658 658 ;*****************************************************************
659 659 000005F8: sdtr:
660 660 000005F8: 0F000002 00000043 move 2, ld_message+3, when MSG_IN ; Read period & offset from bus
661 661 00000600: 98080000 0000000D int negotiateSDTR
662 662
663 663
664 664 ;***************************************************************************
665 665 ;
666 666 ; Wide Data Transfer request or response
667 667 ;
668 668 ;***************************************************************************
669 669 00000608: wdtr:
670 670 00000608: 0F000001 00000043 move 1, ld_message+3, when MSG_IN ; get Transfer Width Exponent fm bus
671 671 00000610: 98080000 0000000E int negotiateWDTR
672 672
673 673
674 674 ;*****************************************************************
675 675 ;
676 676 ; Reselect phase
677 677 ; The chip waits here either for a Reselection from a Target or
678 678 ; a SIGP from the driver indicating something in the mailbox.
679 679 ; If reselected, the script uses the Nexus value which is either
680 680 ; a Tag or a SCSI ID/LUN combo to lookup the Nexus.
681 681 ; Then init the SXFER and SCNTL3 registers from the device config table.
682 682 ;
683 683 ;*****************************************************************
684 684
685 685 00000618: try_reselect: ; Select failed - probably reselecting
686 686 ; Cf NCR Errata Listing 117 Item 1:
687 687 00000618: 7C00DF00 00000000 move SCNTL0 & 0xDF to SCNTL0 ; clr Start bit
688 688 00000620: 7A1A0000 00000000 move CTEST2 | 0x00 to CTEST2 ; Clear SIGP bit from ISTAT reg
689 689
690 690 00000628: reselect_phase:
691 691 00000628: 785C0900 00000000 move kphase_RESELECT to SCRATCHB0 ; Set phase indicator
692 692 00000630: E05C0001 00000030 store SCRATCHB0, 1, ld_phase_flag
693 693
694 694 00000638: 785FFF00 00000000 move 0xFF to SCRATCHB3 ; invalidate nexus index for driver
695 695 00000640: E05F0001 0000002B store SCRATCHB3, 1, ld_nexus_index+3
696 696
697 697 ; wait here for reselect from a Target
698 698 ; or SIGP from the driver
699 699
700 700 00000648: 54000000 FFFFFAD0 WAIT RESELECT REL( select_phase ) ; jump if SIGP
701 701
702 702 ; Reselected:
703 703
704 704 00000650: 720A0000 00000000 move SSID to SFBR ; SSID = [ Valxxx Scsi_id ]
705 705 00000658: 980C7F00 00000007 int unknown_reselect, if 0 and mask 0x7F; Interrupt if VAL bit not set
706 706 00000660: 6C5C0F00 00000000 move SFBR & 0x0F to SCRATCHB0 ; B0 = Target ID
707 707 00000668: E05C0001 00000020 store SCRATCHB0, 1, ld_scsi_id ; save it
708 708
709 709 00000670: 88880000 FFFFFA48 call rel( initContext ) ; setup sync regs here
710 710
711 711 00000678: 9F030000 00000005 int no_msgin_after_reselect, when not MSG_IN
712 712
713 713 00000680: 0F000001 00000040 move 1, ld_message, when MSG_IN ; Read Identify byte from bus
714 714
715 715 ; if another REQ is asserted, a SimpleQueueTag message should be next
716 716
717 717 00000688: 60000040 00000000 clear ACK ; notify Target: msg byte rx'd
718 718 00000690: 878B0000 00000048 jump rel( getNextMsg ), when MSG_IN ; jump if SimpleQueueTag coming
719 719
720 720 ; untagged operation:
721 721
722 722 00000698: 6C340700 00000000 move SFBR & 0x07 to SCRATCHA0 ; isolate LUN from Identify byte
723 723
724 724 000006A0: E15C0001 00000020 load SCRATCHB0, 1, ld_scsi_id ; B0 = Target ID
725 725 000006A8: 60000400 00000000 clear CARRY
726 726 000006B0: 715C0000 00000000 move SCRATCHB0 SHL SFBR ; shift left #1
727 727 000006B8: 695C0000 00000000 move SFBR SHL SCRATCHB0 ; shift left #2
728 728 000006C0: 715C0000 00000000 move SCRATCHB0 SHL SFBR ; shift left #3
729 729 000006C8: 7AB40000 00000000 move SCRATCHA0 | SFBR to SCRATCHA0 ; form Nexus index = 0b0TTTTLLL
730 730
731 731 000006D0: E0340001 00000028 store SCRATCHA0, 1, ld_nexus_index ; store as index to Nexus
732 732 000006D8: 80880000 00000030 jump rel( haveNexusIndex )
733 733
734 734 ; should be tagged operation:
735 735
736 736 000006E0: getNextMsg:
737 737 000006E0: 0F000001 00000040 move 1, ld_message, when MSG_IN ; read message byte from bus
738 738 000006E8: 808C0004 FFFFFE70 jump rel( disconnect_msg ), if 0x04 ; if Disconnect, oh well.
739 739 000006F0: 60000040 00000000 clear ACK
740 740 000006F8: 80840020 FFFFFB90 jump rel( phase_handler ), if not 0x20; Branch if not Queue tag code
741 741 ; get the Queue Tag and save as the nexus index
742 742 00000700: 0F000001 00000028 move 1, ld_nexus_index, when MSG_IN ; Nexus index <- Tag from bus
743 743 00000708: 60000040 00000000 clear ACK ; acknowledge it
744 744
745 745 00000710: haveNexusIndex:
746 746 00000710: 785F0000 00000000 move 0x00 to SCRATCHB3 ; clear invalid-nexus-index flag
747 747 00000718: E05F0001 0000002B store SCRATCHB3, 1, ld_nexus_index+3
748 748 00000720: 88880000 FFFFF930 call rel( findNexusFromIndex ) ; set DSA <- Nexus pointer
749 749 00000728: 80880000 FFFFFB60 jump rel( phase_handler ) ; start handling phases.
750 750
751 751
752 752 ;*****************************************************************
753 753 ;
754 754 ; AbortMailbox - Abort (or BusDeviceReset) the mailbox entry.
755 755 ; This is a queued operation - not an immediate
756 756 ; operation as is issueAbort_BDR.
757 757 ; The Abort message clears all IO processes for the
758 758 ; selecting Initiator on the specified LUN.
759 759 ;
760 760 ; The Bus Device Reset message clears all IO processes for
761 761 ; all Initiators on all LUNs of selected Target.
762 762 ; It forces a hard reset condition to the selected SCSI device.
763 763 ;
764 764 ; A0 = Identify byte (0xC0 + LUN N.B. Disconnect allowed)
765 765 ; A1 = Tag, if any
766 766 ; A2 = SCSI ID
767 767 ; A3 = Abort code Abort=0x06; Abort Tag=0D; Bus Device Reset=0x0C
768 768 ;
769 769 ; Mailbox not cleared by SCRIPTS so that driver can find SCSI ID when done
770 770 ; N.B.: Device is Async and Narrow after BDR!!!
771 771 ; Driver must set the device config table values accordingly.
772 772 ;*****************************************************************
773 773
774 774 00000730: AbortMailbox:
775 775 00000730: 785C0B00 00000000 move kphase_ABORT_MAILBOX to SCRATCHB0 ; Set phase code
776 776 00000738: E05C0001 00000030 store SCRATCHB0, 1, ld_phase_flag
777 777
778 778 00000740: 785FFF00 00000000 move 0xFF to SCRATCHB3 ; invalidate nexus index for driver
779 779 00000748: E05F0001 0000002B store SCRATCHB3, 1, ld_nexus_index+3
780 780
781 781 00000750: E15E0001 00000012 load SCRATCHB2, 1, ld_AbortBdr_mailbox+2 ; get SCSI ID
782 782 00000758: E05E0001 00000762 store SCRATCHB2, 1, AbortSelect+2 ; *** Patch the Select/ATN instruction
783 783
784 784 00000760: AbortSelect:
785 785 00000760: 45000000 FFFFFEB0 SELECT ATN 0, REL( try_reselect ) ; *** Patched SCSI ID
786 786
787 787 00000768: 72350000 00000000 move SCRATCHA1 to SFBR ; check for Tag
788 788 00000770: 80840000 00000038 jump rel( taggedAbort ) if not 0x00 ; jump if tagged abort
789 789
790 790 ; untagged Abort or BusDeviceReset:
791 791
792 792 00000778: 72370000 00000000 move SCRATCHA3 to SFBR ; position the abort code
793 793 00000780: 6A350000 00000000 move SFBR to SCRATCHA1
794 794 00000788: E0340002 00000038 store SCRATCHA0, 2, ld_scratch ; Store Identify and Abort msgs
795 795 00000790: 78020000 00000000 move 0x00 to SCNTL2 ; Clr SDU SCSI Disconnect Unexpected
796 796 00000798: 0E000002 00000038 move 2, ld_scratch , when MSG_OUT ; emit Identify and Abort messages
797 797 000007A0: 48000000 00000000 WAIT DISCONNECT
798 798 000007A8: 98080000 00000009 int abort_mailbox
799 799
800 800 ; AbortTag:
801 801
802 802 000007B0: taggedAbort:
803 803 000007B0: 72350000 00000000 move SCRATCHA1 to SFBR ; position the Tag
804 804 000007B8: 6A360000 00000000 move SFBR to SCRATCHA2
805 805 000007C0: 78352000 00000000 move 0x20 to SCRATCHA1 ; gen SimpleQueueTag code
806 806 000007C8: E0340004 00000038 store SCRATCHA0, 4, ld_scratch ; store Identify, SQT, Tag, AbortTag
807 807 000007D0: 78020000 00000000 move 0x00 to SCNTL2 ; Clr SDU SCSI Disconnect Unexpected
808 808 000007D8: 0E000004 00000038 move 4, ld_scratch, when MSG_OUT ; emit all 4 bytes
809 809 000007E0: 48000000 00000000 WAIT DISCONNECT
810 810 000007E8: 98080000 00000009 int abort_mailbox
811 811
812 812
813 813 ;*****************************************************************
814 814 ;
815 815 ; issueAbort_BDR - Abort (or BusDeviceReset) the current operation.
816 816 ; This is an immediate operation - not a queued operation
817 817 ; as is AbortMailbox.
818 818 ; The Abort message clears all IO processes for the
819 819 ; selecting Initiator on the specified LUN.
820 820 ;
821 821 ; The Bus Device Reset message clears all IO processes for
822 822 ; all Initiators on all LUNs of selected Target.
823 823 ; It forces a hard reset condition to the selected SCSI device.
824 824 ;
825 825 ;*****************************************************************
826 826
827 827 000007F0: issueAbort_BDR:
828 828 000007F0: 785C0A00 00000000 move kphase_ABORT_CURRENT to SCRATCHB0 ; Set phase code
829 829 000007F8: E05C0001 00000030 store SCRATCHB0, 1, ld_phase_flag
830 830
831 831 00000800: 74140800 00000000 move ISTAT & 0x08 to SFBR ; see if Target connected to bus
832 832 00000808: 980C0000 0000000A int abort_current, if 0 ; interrupt driver if not connected
833 833
834 834 00000810: 58000008 00000000 SET ATN ; get Target's attention
835 835 00000818: E1100004 0000002C load DSA0, 4, ld_nexus ; load pointer to Nexus
836 836
837 837 00000820: bucketLoop:
838 838 00000820: 60000040 00000000 clear ACK
839 839 00000828: 868B0000 000000A8 jump rel( sendAbortBDR ), when MSG_OUT ; wait for REQ. Jump if OK.
840 840
841 841 00000830: 838A0000 00000030 jump rel( BucketInStatus ), if STATUS ; bit bucket in
842 842 00000838: 878A0000 00000038 jump rel( BucketInMsg ), if MSG_IN ; bit bucket in
843 843 00000840: 818A0000 00000040 jump rel( BucketInData ), if DATA_IN ; bit bucket in
844 844
845 845 00000848: 7834AD00 00000000 move 0xAD to SCRATCHA0
846 846 00000850: 808A0000 00000040 jump rel( BucketOutData ), if DATA_OUT ; bit bucket out
847 847 00000858: 828A0000 00000058 jump rel( BucketOutCmd ), if CMD ; bit bucket out
848 848 00000860: 98080000 00000000 int unknown_phase ; back to driver for harsher measures
849 849
850 850
851 851 00000868: BucketInStatus:
852 852 00000868: 0B000001 00000038 move 1, ld_scratch, when STATUS ; eat the Status byte
853 853 00000870: 80880000 FFFFFFA8 jump rel( bucketLoop ); ; keep bit-bucketing bytes
854 854
855 855 00000878: BucketInMsg:
856 856 00000878: 0F000001 00000038 move 1, ld_scratch, when MSG_IN ; eat a message byte
857 857 00000880: 80880000 FFFFFF98 jump rel( bucketLoop ); ; keep bit-bucketing bytes
858 858
859 859 00000888: BucketInData:
860 860 00000888: 09000001 00000038 move 1, ld_scratch, when DATA_IN ; eat a data byte
861 861 00000890: 80880000 FFFFFF88 jump rel( bucketLoop ); ; keep bit-bucketing bytes
862 862
863 863 00000898: BucketOutData:
864 864 00000898: 7B347300 00000000 move SCRATCHA0 xor 0x73 to SCRATCHA0 ; gen 0xDEAD ...
865 865 000008A0: E0340001 00000038 store SCRATCHA0, 1, ld_scratch
866 866 000008A8: 08000001 00000038 move 1, ld_scratch, when DATA_OUT ; pad a byte out
867 867 000008B0: 80880000 FFFFFF68 jump rel( bucketLoop ); ; keep bit-bucketing bytes
868 868
869 869 000008B8: BucketOutCmd:
870 870 000008B8: 78340000 00000000 move 0x00 to SCRATCHA0 ; load Null, TestUnitReady, whatever
871 871 000008C0: E0340001 00000038 store SCRATCHA0, 1, ld_scratch
872 872 000008C8: 0A000001 00000038 move 1, ld_scratch, when CMD ; pad a byte out
873 873 000008D0: 80880000 FFFFFF48 jump rel( bucketLoop ); ; keep bit-bucketing bytes
874 874
875 875
876 876 000008D8: sendAbortBDR:
877 877 000008D8: 78020000 00000000 move 0x00 to SCNTL2 ; Clr SDU SCSI Disconnect Unexpected
878 878 000008E0: 0E000001 00000000 move 1, ld_AbortCode, when MSG_OUT ; Send Abort(06) or BDR(0C) message
879 879 000008E8: E1340004 00000004 load SCRATCHA0, 4, ld_zeroes ; load 0's
880 880 000008F0: E0340004 00000000 store SCRATCHA0, 4, ld_AbortCode ; clear the Abort code
881 881 000008F8: 48000000 00000000 WAIT DISCONNECT
882 882 00000900: 98080000 0000000A int abort_current ; went BusFree - tell Driver
883
884 --SYMBOL---------------------------VALUE------TYPE-------
885 abort_current 0000000A ABSOLUTE
886 abort_mailbox 00000009 ABSOLUTE
887 kphase_ABORT_MAILBOX 0000000B ABSOLUTE
888 kphase_ABORT_CURRENT 0000000A ABSOLUTE
889 kphase_CMD_COMPLETE 0000000C ABSOLUTE
890 kphase_COMMAND 00000002 ABSOLUTE
891 kphase_DATA_IN 00000001 ABSOLUTE
892 kphase_DATA_OUT 00000000 ABSOLUTE
893 kphase_DISCONNECT 0000000D ABSOLUTE
894 kphase_MSG_IN 00000007 ABSOLUTE
895 kphase_MSG_OUT 00000006 ABSOLUTE
896 kphase_RESELECT 00000009 ABSOLUTE
897 kphase_SELECT 00000008 ABSOLUTE
898 kphase_STATUS 00000003 ABSOLUTE
899 kphase_restoreDataPointer 0000000F ABSOLUTE
900 kphase_saveDataPointer 0000000E ABSOLUTE
901 negotiateWDTR 0000000E ABSOLUTE
902 negotiateSDTR 0000000D ABSOLUTE
903 no_msgin_after_reselect 00000005 ABSOLUTE
904 reqack_too_large 00000006 ABSOLUTE
905 sglist_complete 0000000F ABSOLUTE
906 status_error 00000001 ABSOLUTE
907 TLQ_CDP 00000018 ABSOLUTE
908 TLQ_CDBp 00000010 ABSOLUTE
909 TLQ_IWR 00000022 ABSOLUTE
910 TLQ_MSGOp 00000008 ABSOLUTE
911 TLQ_SDP 0000001C ABSOLUTE
912 TLQ_index 00000020 ABSOLUTE
913 TLQ_pad 00000023 ABSOLUTE
914 TLQ_xferAdr 00000004 ABSOLUTE
915 TLQ_SCSI_ID 00000000 ABSOLUTE
916 TLQ_xferStarted 00000021 ABSOLUTE
917 unallocated_nexus 00000008 ABSOLUTE
918 unexpected_ext_msg 00000003 ABSOLUTE
919 unexpected_msg 00000002 ABSOLUTE
920 unknown_message_out 0000000B ABSOLUTE
921 unknown_msg_reject 0000000C ABSOLUTE
922 unknown_phase 00000000 ABSOLUTE
923 unknown_reselect 00000007 ABSOLUTE
924 wide_32_not_supported 00000004 ABSOLUTE
925 BSC_SCRIPT 00000000 CODE SEGMENT
926 SCRIPT 00000000 CODE SEGMENT
927 local_data 00000000 DATA SEGMENT
928 clearACK 00000448 ENTRY
929 issueAbort_BDR 000007F0 ENTRY
930 issueMessageOut 000002F0 ENTRY
931 phase_handler 00000290 ENTRY
932 select_phase 00000120 ENTRY
933 AbortSelect 00000760 LABEL
934 AbortMailbox 00000730 LABEL
935 BucketInData 00000888 LABEL
936 BucketInMsg 00000878 LABEL
937 BucketInStatus 00000868 LABEL
938 BucketOutCmd 000008B8 LABEL
939 BucketOutData 00000898 LABEL
940 bucketLoop 00000820 LABEL
941 bailout 00000588 LABEL
942 bucket_loop 000003B0 LABEL
943 clear_mailbox 00000258 LABEL
944 cmdComplete 000004C8 LABEL
945 command_phase 00000328 LABEL
946 data_in_phase 00000398 LABEL
947 data_out_phase 00000350 LABEL
948 disconnect_msg 00000560 LABEL
949 doItPatch 00000390 LABEL
950 driverXfer 00000370 LABEL
951 extended_msg 00000488 LABEL
952 fetchMailbox 00000188 LABEL
953 findNexusFromIndex 00000058 LABEL
954 getNextMsg 000006E0 LABEL
955 haveNexusIndex 00000710 LABEL
956 ignoreWideResidue 00000458 LABEL
957 initContext 000000C0 LABEL
958 message_in_phase 000003E8 LABEL
959 message_out_phase 000002D0 LABEL
960 msg_reject 00000440 LABEL
961 next_mailbox 00000248 LABEL
962 patchGetDevConfigOffset 000000F0 LABEL
963 patchArrayOffset 00000098 LABEL
964 reselect_phase 00000628 LABEL
965 restoreDataPointer 000005D8 LABEL
966 sdtr 000005F8 LABEL
967 saveDataPointer 000005B8 LABEL
968 sendAbortBDR 000008D8 LABEL
969 status_phase 000003C8 LABEL
970 taggedAbort 000007B0 LABEL
971 testMbxLp 000004F0 LABEL
972 try_reselect 00000618 LABEL
973 wdtr 00000608 LABEL
974 ld_IOdone_mailbox 00000014 RELATIVE.
975 ld_AbortBdr_mailbox 00000010 RELATIVE.
976 ld_counter 0000000C RELATIVE.
977 ld_device_table_base_adr 00000034 RELATIVE.
978 ld_mailboxp 0000001C RELATIVE.
979 ld_message 00000040 RELATIVE.
980 ld_message4 00000044 RELATIVE.
981 ld_nexus 0000002C RELATIVE.
982 ld_nexus_array_base 00000024 RELATIVE.
983 ld_nexus_index 00000028 RELATIVE.
984 ld_pad 00000048 RELATIVE.
985 ld_phase_flag 00000030 RELATIVE.
986 ld_sched_mlbx_base_adr 00000018 RELATIVE.
987 ld_scratch 00000038 RELATIVE.
988 ld_scsi_id 00000020 RELATIVE.
989 ld_size 0000004C RELATIVE.
990 ld_status 00000008 RELATIVE.
991 ld_unused 0000003C RELATIVE.
992 ld_zeroes 00000004 RELATIVE.
993 ld_AbortCode 00000000 RELATIVE.