xref: /dragonfly/sys/dev/disk/sym/sym_fw2.h (revision 30702410)
1 /*-
2  *  Device driver optimized for the Symbios/LSI 53C896/53C895A/53C1010
3  *  PCI-SCSI controllers.
4  *
5  *  Copyright (C) 1999-2001  Gerard Roudier <groudier@free.fr>
6  *
7  *  This driver also supports the following Symbios/LSI PCI-SCSI chips:
8  *	53C810A, 53C825A, 53C860, 53C875, 53C876, 53C885, 53C895,
9  *	53C810,  53C815,  53C825 and the 53C1510D is 53C8XX mode.
10  *
11  *
12  *  This driver for FreeBSD-CAM is derived from the Linux sym53c8xx driver.
13  *  Copyright (C) 1998-1999  Gerard Roudier
14  *
15  *  The sym53c8xx driver is derived from the ncr53c8xx driver that had been
16  *  a port of the FreeBSD ncr driver to Linux-1.2.13.
17  *
18  *  The original ncr driver has been written for 386bsd and FreeBSD by
19  *          Wolfgang Stanglmeier        <wolf@cologne.de>
20  *          Stefan Esser                <se@mi.Uni-Koeln.de>
21  *  Copyright (C) 1994  Wolfgang Stanglmeier
22  *
23  *  The initialisation code, and part of the code that addresses
24  *  FreeBSD-CAM services is based on the aic7xxx driver for FreeBSD-CAM
25  *  written by Justin T. Gibbs.
26  *
27  *  Other major contributions:
28  *
29  *  NVRAM detection and reading.
30  *  Copyright (C) 1997 Richard Waltham <dormouse@farsrobt.demon.co.uk>
31  *
32  *-----------------------------------------------------------------------------
33  *
34  * Redistribution and use in source and binary forms, with or without
35  * modification, are permitted provided that the following conditions
36  * are met:
37  * 1. Redistributions of source code must retain the above copyright
38  *    notice, this list of conditions and the following disclaimer.
39  * 2. Redistributions in binary form must reproduce the above copyright
40  *    notice, this list of conditions and the following disclaimer in the
41  *    documentation and/or other materials provided with the distribution.
42  * 3. The name of the author may not be used to endorse or promote products
43  *    derived from this software without specific prior written permission.
44  *
45  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
46  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
47  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
48  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
49  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
50  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
51  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
52  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
53  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
54  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
55  * SUCH DAMAGE.
56  */
57 
58 /* $FreeBSD: src/sys/dev/sym/sym_fw2.h,v 1.13 2011/04/22 12:46:39 marius Exp $ */
59 
60 /*
61  *  Scripts for SYMBIOS-Processor
62  *
63  *  We have to know the offsets of all labels before we reach
64  *  them (for forward jumps). Therefore we declare a struct
65  *  here. If you make changes inside the script,
66  *
67  *  DONT FORGET TO CHANGE THE LENGTHS HERE!
68  */
69 
70 /*
71  *  Script fragments which are loaded into the on-chip RAM
72  *  of 825A, 875, 876, 895, 895A, 896 and 1010 chips.
73  *  Must not exceed 4K bytes.
74  */
75 struct SYM_FWA_SCR {
76 	u32 start		[ 14];
77 	u32 getjob_begin	[  4];
78 	u32 getjob_end		[  4];
79 	u32 select		[  8];
80 	u32 wf_sel_done		[  2];
81 	u32 sel_done		[  2];
82 	u32 send_ident		[  2];
83 #ifdef SYM_CONF_IARB_SUPPORT
84 	u32 select2		[  8];
85 #else
86 	u32 select2		[  2];
87 #endif
88 	u32 command		[  2];
89 	u32 dispatch		[ 28];
90 	u32 sel_no_cmd		[ 10];
91 	u32 init		[  6];
92 	u32 clrack		[  4];
93 	u32 disp_status		[  4];
94 	u32 datai_done		[ 26];
95 	u32 datao_done		[ 12];
96 	u32 datai_phase		[  2];
97 	u32 datao_phase		[  4];
98 	u32 msg_in		[  2];
99 	u32 msg_in2		[ 10];
100 #ifdef SYM_CONF_IARB_SUPPORT
101 	u32 status		[ 14];
102 #else
103 	u32 status		[ 10];
104 #endif
105 	u32 complete		[  8];
106 	u32 complete2		[ 12];
107 	u32 complete_error	[  4];
108 	u32 done		[ 14];
109 	u32 done_end		[  2];
110 	u32 save_dp		[  8];
111 	u32 restore_dp		[  4];
112 	u32 disconnect		[ 20];
113 #ifdef SYM_CONF_IARB_SUPPORT
114 	u32 idle		[  4];
115 #else
116 	u32 idle		[  2];
117 #endif
118 #ifdef SYM_CONF_IARB_SUPPORT
119 	u32 ungetjob		[  6];
120 #else
121 	u32 ungetjob		[  4];
122 #endif
123 	u32 reselect		[  4];
124 	u32 reselected		[ 22];
125 	u32 resel_scntl4	[ 20];
126 	u32 resel_lun0		[  6];
127 #if   SYM_CONF_MAX_TASK*4 > 512
128 	u32 resel_tag		[ 26];
129 #elif SYM_CONF_MAX_TASK*4 > 256
130 	u32 resel_tag		[ 20];
131 #else
132 	u32 resel_tag		[ 16];
133 #endif
134 	u32 resel_dsa		[  2];
135 	u32 resel_dsa1		[  6];
136 	u32 resel_no_tag	[  6];
137 	u32 data_in		[SYM_CONF_MAX_SG * 2];
138 	u32 data_in2		[  4];
139 	u32 data_out		[SYM_CONF_MAX_SG * 2];
140 	u32 data_out2		[  4];
141 	u32 pm0_data		[ 12];
142 	u32 pm0_data_out	[  6];
143 	u32 pm0_data_end	[  6];
144 	u32 pm1_data		[ 12];
145 	u32 pm1_data_out	[  6];
146 	u32 pm1_data_end	[  6];
147 };
148 
149 /*
150  *  Script fragments which stay in main memory for all chips
151  *  except for chips that support 8K on-chip RAM.
152  */
153 struct SYM_FWB_SCR {
154 	u32 start64		[  2];
155 	u32 no_data		[  2];
156 	u32 sel_for_abort	[ 18];
157 	u32 sel_for_abort_1	[  2];
158 	u32 msg_in_etc		[ 12];
159 	u32 msg_received	[  4];
160 	u32 msg_weird_seen	[  4];
161 	u32 msg_extended	[ 20];
162 	u32 msg_bad		[  6];
163 	u32 msg_weird		[  4];
164 	u32 msg_weird1		[  8];
165 
166 	u32 wdtr_resp		[  6];
167 	u32 send_wdtr		[  4];
168 	u32 sdtr_resp		[  6];
169 	u32 send_sdtr		[  4];
170 	u32 ppr_resp		[  6];
171 	u32 send_ppr		[  4];
172 	u32 nego_bad_phase	[  4];
173 	u32 msg_out		[  4];
174 	u32 msg_out_done	[  4];
175 	u32 data_ovrun		[  2];
176 	u32 data_ovrun1		[ 22];
177 	u32 data_ovrun2		[  8];
178 	u32 abort_resel		[ 16];
179 	u32 resend_ident	[  4];
180 	u32 ident_break		[  4];
181 	u32 ident_break_atn	[  4];
182 	u32 sdata_in		[  6];
183 	u32 resel_bad_lun	[  4];
184 	u32 bad_i_t_l		[  4];
185 	u32 bad_i_t_l_q		[  4];
186 	u32 bad_status		[  6];
187 	u32 pm_handle		[ 20];
188 	u32 pm_handle1		[  4];
189 	u32 pm_save		[  4];
190 	u32 pm0_save		[ 14];
191 	u32 pm1_save		[ 14];
192 
193 	/* WSR handling */
194 	u32 pm_wsr_handle	[ 42];
195 	u32 wsr_ma_helper	[  4];
196 
197 	/* Data area */
198 	u32 zero		[  1];
199 	u32 scratch		[  1];
200 	u32 pm0_data_addr	[  1];
201 	u32 pm1_data_addr	[  1];
202 	u32 saved_dsa		[  1];
203 	u32 saved_drs		[  1];
204 	u32 done_pos		[  1];
205 	u32 startpos		[  1];
206 	u32 targtbl		[  1];
207 	/* End of data area */
208 
209 	u32 snooptest		[  6];
210 	u32 snoopend		[  2];
211 };
212 
213 static const struct SYM_FWA_SCR SYM_FWA_SCR = {
214 /*--------------------------< START >----------------------------*/ {
215 	/*
216 	 *  Switch the LED on.
217 	 *  Will be patched with a NO_OP if LED
218 	 *  not needed or not desired.
219 	 */
220 	SCR_REG_REG (gpreg, SCR_AND, 0xfe),
221 		0,
222 	/*
223 	 *      Clear SIGP.
224 	 */
225 	SCR_FROM_REG (ctest2),
226 		0,
227 	/*
228 	 *  Stop here if the C code wants to perform
229 	 *  some error recovery procedure manually.
230 	 *  (Indicate this by setting SEM in ISTAT)
231 	 */
232 	SCR_FROM_REG (istat),
233 		0,
234 	/*
235 	 *  Report to the C code the next position in
236 	 *  the start queue the SCRIPTS will schedule.
237 	 *  The C code must not change SCRATCHA.
238 	 */
239 	SCR_LOAD_ABS (scratcha, 4),
240 		PADDR_B (startpos),
241 	SCR_INT ^ IFTRUE (MASK (SEM, SEM)),
242 		SIR_SCRIPT_STOPPED,
243 	/*
244 	 *  Start the next job.
245 	 *
246 	 *  @DSA     = start point for this job.
247 	 *  SCRATCHA = address of this job in the start queue.
248 	 *
249 	 *  We will restore startpos with SCRATCHA if we fails the
250 	 *  arbitration or if it is the idle job.
251 	 *
252 	 *  The below GETJOB_BEGIN to GETJOB_END section of SCRIPTS
253 	 *  is a critical path. If it is partially executed, it then
254 	 *  may happen that the job address is not yet in the DSA
255 	 *  and the next queue position points to the next JOB.
256 	 */
257 	SCR_LOAD_ABS (dsa, 4),
258 		PADDR_B (startpos),
259 	SCR_LOAD_REL (temp, 4),
260 		4,
261 }/*-------------------------< GETJOB_BEGIN >---------------------*/,{
262 	SCR_STORE_ABS (temp, 4),
263 		PADDR_B (startpos),
264 	SCR_LOAD_REL (dsa, 4),
265 		0,
266 }/*-------------------------< GETJOB_END >-----------------------*/,{
267 	SCR_LOAD_REL (temp, 4),
268 		0,
269 	SCR_RETURN,
270 		0,
271 }/*-------------------------< SELECT >---------------------------*/,{
272 	/*
273 	 *  DSA	contains the address of a scheduled
274 	 *  	data structure.
275 	 *
276 	 *  SCRATCHA contains the address of the start queue
277 	 *  	entry which points to the next job.
278 	 *
279 	 *  Set Initiator mode.
280 	 *
281 	 *  (Target mode is left as an exercise for the reader)
282 	 */
283 	SCR_CLR (SCR_TRG),
284 		0,
285 	/*
286 	 *      And try to select this target.
287 	 */
288 	SCR_SEL_TBL_ATN ^ offsetof (struct sym_dsb, select),
289 		PADDR_A (ungetjob),
290 	/*
291 	 *  Now there are 4 possibilities:
292 	 *
293 	 *  (1) The chip loses arbitration.
294 	 *  This is ok, because it will try again,
295 	 *  when the bus becomes idle.
296 	 *  (But beware of the timeout function!)
297 	 *
298 	 *  (2) The chip is reselected.
299 	 *  Then the script processor takes the jump
300 	 *  to the RESELECT label.
301 	 *
302 	 *  (3) The chip wins arbitration.
303 	 *  Then it will execute SCRIPTS instruction until
304 	 *  the next instruction that checks SCSI phase.
305 	 *  Then will stop and wait for selection to be
306 	 *  complete or selection time-out to occur.
307 	 *
308 	 *  After having won arbitration, the SCRIPTS
309 	 *  processor is able to execute instructions while
310 	 *  the SCSI core is performing SCSI selection.
311 	 */
312 	/*
313 	 *      load the savep (saved data pointer) into
314 	 *      the actual data pointer.
315 	 */
316 	SCR_LOAD_REL (temp, 4),
317 		offsetof (struct sym_ccb, phys.head.savep),
318 	/*
319 	 *      Initialize the status registers
320 	 */
321 	SCR_LOAD_REL (scr0, 4),
322 		offsetof (struct sym_ccb, phys.head.status),
323 }/*-------------------------< WF_SEL_DONE >----------------------*/,{
324 	SCR_INT ^ IFFALSE (WHEN (SCR_MSG_OUT)),
325 		SIR_SEL_ATN_NO_MSG_OUT,
326 }/*-------------------------< SEL_DONE >-------------------------*/,{
327 	/*
328 	 *  C1010-33 errata work-around.
329 	 *  Due to a race, the SCSI core may not have
330 	 *  loaded SCNTL3 on SEL_TBL instruction.
331 	 *  We reload it once phase is stable.
332 	 *  Patched with a NOOP for other chips.
333 	 */
334 	SCR_LOAD_REL (scntl3, 1),
335 		offsetof(struct sym_dsb, select.sel_scntl3),
336 }/*-------------------------< SEND_IDENT >-----------------------*/,{
337 	/*
338 	 *  Selection complete.
339 	 *  Send the IDENTIFY and possibly the TAG message
340 	 *  and negotiation message if present.
341 	 */
342 	SCR_MOVE_TBL ^ SCR_MSG_OUT,
343 		offsetof (struct sym_dsb, smsg),
344 }/*-------------------------< SELECT2 >--------------------------*/,{
345 #ifdef SYM_CONF_IARB_SUPPORT
346 	/*
347 	 *  Set IMMEDIATE ARBITRATION if we have been given
348 	 *  a hint to do so. (Some job to do after this one).
349 	 */
350 	SCR_FROM_REG (HF_REG),
351 		0,
352 	SCR_JUMPR ^ IFFALSE (MASK (HF_HINT_IARB, HF_HINT_IARB)),
353 		8,
354 	SCR_REG_REG (scntl1, SCR_OR, IARB),
355 		0,
356 #endif
357 	/*
358 	 *  Anticipate the COMMAND phase.
359 	 *  This is the PHASE we expect at this point.
360 	 */
361 	SCR_JUMP ^ IFFALSE (WHEN (SCR_COMMAND)),
362 		PADDR_A (sel_no_cmd),
363 }/*-------------------------< COMMAND >--------------------------*/,{
364 	/*
365 	 *  ... and send the command
366 	 */
367 	SCR_MOVE_TBL ^ SCR_COMMAND,
368 		offsetof (struct sym_dsb, cmd),
369 }/*-------------------------< DISPATCH >-------------------------*/,{
370 	/*
371 	 *  MSG_IN is the only phase that shall be
372 	 *  entered at least once for each (re)selection.
373 	 *  So we test it first.
374 	 */
375 	SCR_JUMP ^ IFTRUE (WHEN (SCR_MSG_IN)),
376 		PADDR_A (msg_in),
377 	SCR_JUMP ^ IFTRUE (IF (SCR_DATA_OUT)),
378 		PADDR_A (datao_phase),
379 	SCR_JUMP ^ IFTRUE (IF (SCR_DATA_IN)),
380 		PADDR_A (datai_phase),
381 	SCR_JUMP ^ IFTRUE (IF (SCR_STATUS)),
382 		PADDR_A (status),
383 	SCR_JUMP ^ IFTRUE (IF (SCR_COMMAND)),
384 		PADDR_A (command),
385 	SCR_JUMP ^ IFTRUE (IF (SCR_MSG_OUT)),
386 		PADDR_B (msg_out),
387 	/*
388 	 *  Discard as many illegal phases as
389 	 *  required and tell the C code about.
390 	 */
391 	SCR_JUMPR ^ IFFALSE (WHEN (SCR_ILG_OUT)),
392 		16,
393 	SCR_MOVE_ABS (1) ^ SCR_ILG_OUT,
394 		HADDR_1 (scratch),
395 	SCR_JUMPR ^ IFTRUE (WHEN (SCR_ILG_OUT)),
396 		-16,
397 	SCR_JUMPR ^ IFFALSE (WHEN (SCR_ILG_IN)),
398 		16,
399 	SCR_MOVE_ABS (1) ^ SCR_ILG_IN,
400 		HADDR_1 (scratch),
401 	SCR_JUMPR ^ IFTRUE (WHEN (SCR_ILG_IN)),
402 		-16,
403 	SCR_INT,
404 		SIR_BAD_PHASE,
405 	SCR_JUMP,
406 		PADDR_A (dispatch),
407 }/*-------------------------< SEL_NO_CMD >-----------------------*/,{
408 	/*
409 	 *  The target does not switch to command
410 	 *  phase after IDENTIFY has been sent.
411 	 *
412 	 *  If it stays in MSG OUT phase send it
413 	 *  the IDENTIFY again.
414 	 */
415 	SCR_JUMP ^ IFTRUE (WHEN (SCR_MSG_OUT)),
416 		PADDR_B (resend_ident),
417 	/*
418 	 *  If target does not switch to MSG IN phase
419 	 *  and we sent a negotiation, assert the
420 	 *  failure immediately.
421 	 */
422 	SCR_JUMP ^ IFTRUE (WHEN (SCR_MSG_IN)),
423 		PADDR_A (dispatch),
424 	SCR_FROM_REG (HS_REG),
425 		0,
426 	SCR_INT ^ IFTRUE (DATA (HS_NEGOTIATE)),
427 		SIR_NEGO_FAILED,
428 	/*
429 	 *  Jump to dispatcher.
430 	 */
431 	SCR_JUMP,
432 		PADDR_A (dispatch),
433 }/*-------------------------< INIT >-----------------------------*/,{
434 	/*
435 	 *  Wait for the SCSI RESET signal to be
436 	 *  inactive before restarting operations,
437 	 *  since the chip may hang on SEL_ATN
438 	 *  if SCSI RESET is active.
439 	 */
440 	SCR_FROM_REG (sstat0),
441 		0,
442 	SCR_JUMPR ^ IFTRUE (MASK (IRST, IRST)),
443 		-16,
444 	SCR_JUMP,
445 		PADDR_A (start),
446 }/*-------------------------< CLRACK >---------------------------*/,{
447 	/*
448 	 *  Terminate possible pending message phase.
449 	 */
450 	SCR_CLR (SCR_ACK),
451 		0,
452 	SCR_JUMP,
453 		PADDR_A (dispatch),
454 }/*-------------------------< DISP_STATUS >----------------------*/,{
455 	/*
456 	 *  Anticipate STATUS phase.
457 	 *
458 	 *  Does spare 3 SCRIPTS instructions when we have
459 	 *  completed the INPUT of the data.
460 	 */
461 	SCR_JUMP ^ IFTRUE (WHEN (SCR_STATUS)),
462 		PADDR_A (status),
463 	SCR_JUMP,
464 		PADDR_A (dispatch),
465 }/*-------------------------< DATAI_DONE >-----------------------*/,{
466 	/*
467 	 *  If the device still wants to send us data,
468 	 *  we must count the extra bytes.
469 	 */
470 	SCR_JUMP ^ IFTRUE (WHEN (SCR_DATA_IN)),
471 		PADDR_B (data_ovrun),
472 	/*
473 	 *  If the SWIDE is not full, jump to dispatcher.
474 	 *  We anticipate a STATUS phase.
475 	 */
476 	SCR_FROM_REG (scntl2),
477 		0,
478 	SCR_JUMP ^ IFFALSE (MASK (WSR, WSR)),
479 		PADDR_A (disp_status),
480 	/*
481 	 *  The SWIDE is full.
482 	 *  Clear this condition.
483 	 */
484 	SCR_REG_REG (scntl2, SCR_OR, WSR),
485 		0,
486 	/*
487 	 *  We are expecting an IGNORE RESIDUE message
488 	 *  from the device, otherwise we are in data
489 	 *  overrun condition. Check against MSG_IN phase.
490 	 */
491 	SCR_INT ^ IFFALSE (WHEN (SCR_MSG_IN)),
492 		SIR_SWIDE_OVERRUN,
493 	SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_IN)),
494 		PADDR_A (disp_status),
495 	/*
496 	 *  We are in MSG_IN phase,
497 	 *  Read the first byte of the message.
498 	 *  If it is not an IGNORE RESIDUE message,
499 	 *  signal overrun and jump to message
500 	 *  processing.
501 	 */
502 	SCR_MOVE_ABS (1) ^ SCR_MSG_IN,
503 		HADDR_1 (msgin[0]),
504 	SCR_INT ^ IFFALSE (DATA (M_IGN_RESIDUE)),
505 		SIR_SWIDE_OVERRUN,
506 	SCR_JUMP ^ IFFALSE (DATA (M_IGN_RESIDUE)),
507 		PADDR_A (msg_in2),
508 	/*
509 	 *  We got the message we expected.
510 	 *  Read the 2nd byte, and jump to dispatcher.
511 	 */
512 	SCR_CLR (SCR_ACK),
513 		0,
514 	SCR_MOVE_ABS (1) ^ SCR_MSG_IN,
515 		HADDR_1 (msgin[1]),
516 	SCR_CLR (SCR_ACK),
517 		0,
518 	SCR_JUMP,
519 		PADDR_A (disp_status),
520 }/*-------------------------< DATAO_DONE >-----------------------*/,{
521 	/*
522 	 *  If the device wants us to send more data,
523 	 *  we must count the extra bytes.
524 	 */
525 	SCR_JUMP ^ IFTRUE (WHEN (SCR_DATA_OUT)),
526 		PADDR_B (data_ovrun),
527 	/*
528 	 *  If the SODL is not full jump to dispatcher.
529 	 *  We anticipate a STATUS phase.
530 	 */
531 	SCR_FROM_REG (scntl2),
532 		0,
533 	SCR_JUMP ^ IFFALSE (MASK (WSS, WSS)),
534 		PADDR_A (disp_status),
535 	/*
536 	 *  The SODL is full, clear this condition.
537 	 */
538 	SCR_REG_REG (scntl2, SCR_OR, WSS),
539 		0,
540 	/*
541 	 *  And signal a DATA UNDERRUN condition
542 	 *  to the C code.
543 	 */
544 	SCR_INT,
545 		SIR_SODL_UNDERRUN,
546 	SCR_JUMP,
547 		PADDR_A (dispatch),
548 }/*-------------------------< DATAI_PHASE >----------------------*/,{
549 	SCR_RETURN,
550 		0,
551 }/*-------------------------< DATAO_PHASE >----------------------*/,{
552 	/*
553 	 *  C1010-66 errata work-around.
554 	 *  Extra clocks of data hold must be inserted
555 	 *  in DATA OUT phase on 33 MHz PCI BUS.
556 	 *  Patched with a NOOP for other chips.
557 	 */
558 	SCR_REG_REG (scntl4, SCR_OR, (XCLKH_DT|XCLKH_ST)),
559 		0,
560 	SCR_RETURN,
561 		0,
562 }/*-------------------------< MSG_IN >---------------------------*/,{
563 	/*
564 	 *  Get the first byte of the message.
565 	 *
566 	 *  The script processor doesn't negate the
567 	 *  ACK signal after this transfer.
568 	 */
569 	SCR_MOVE_ABS (1) ^ SCR_MSG_IN,
570 		HADDR_1 (msgin[0]),
571 }/*-------------------------< MSG_IN2 >--------------------------*/,{
572 	/*
573 	 *  Check first against 1 byte messages
574 	 *  that we handle from SCRIPTS.
575 	 */
576 	SCR_JUMP ^ IFTRUE (DATA (M_COMPLETE)),
577 		PADDR_A (complete),
578 	SCR_JUMP ^ IFTRUE (DATA (M_DISCONNECT)),
579 		PADDR_A (disconnect),
580 	SCR_JUMP ^ IFTRUE (DATA (M_SAVE_DP)),
581 		PADDR_A (save_dp),
582 	SCR_JUMP ^ IFTRUE (DATA (M_RESTORE_DP)),
583 		PADDR_A (restore_dp),
584 	/*
585 	 *  We handle all other messages from the
586 	 *  C code, so no need to waste on-chip RAM
587 	 *  for those ones.
588 	 */
589 	SCR_JUMP,
590 		PADDR_B (msg_in_etc),
591 }/*-------------------------< STATUS >---------------------------*/,{
592 	/*
593 	 *  get the status
594 	 */
595 	SCR_MOVE_ABS (1) ^ SCR_STATUS,
596 		HADDR_1 (scratch),
597 #ifdef SYM_CONF_IARB_SUPPORT
598 	/*
599 	 *  If STATUS is not GOOD, clear IMMEDIATE ARBITRATION,
600 	 *  since we may have to tamper the start queue from
601 	 *  the C code.
602 	 */
603 	SCR_JUMPR ^ IFTRUE (DATA (S_GOOD)),
604 		8,
605 	SCR_REG_REG (scntl1, SCR_AND, ~IARB),
606 		0,
607 #endif
608 	/*
609 	 *  save status to scsi_status.
610 	 *  mark as complete.
611 	 */
612 	SCR_TO_REG (SS_REG),
613 		0,
614 	SCR_LOAD_REG (HS_REG, HS_COMPLETE),
615 		0,
616 	/*
617 	 *  Anticipate the MESSAGE PHASE for
618 	 *  the TASK COMPLETE message.
619 	 */
620 	SCR_JUMP ^ IFTRUE (WHEN (SCR_MSG_IN)),
621 		PADDR_A (msg_in),
622 	SCR_JUMP,
623 		PADDR_A (dispatch),
624 }/*-------------------------< COMPLETE >-------------------------*/,{
625 	/*
626 	 *  Complete message.
627 	 *
628 	 *  Copy the data pointer to LASTP.
629 	 */
630 	SCR_STORE_REL (temp, 4),
631 		offsetof (struct sym_ccb, phys.head.lastp),
632 	/*
633 	 *  When we terminate the cycle by clearing ACK,
634 	 *  the target may disconnect immediately.
635 	 *
636 	 *  We don't want to be told of an "unexpected disconnect",
637 	 *  so we disable this feature.
638 	 */
639 	SCR_REG_REG (scntl2, SCR_AND, 0x7f),
640 		0,
641 	/*
642 	 *  Terminate cycle ...
643 	 */
644 	SCR_CLR (SCR_ACK|SCR_ATN),
645 		0,
646 	/*
647 	 *  ... and wait for the disconnect.
648 	 */
649 	SCR_WAIT_DISC,
650 		0,
651 }/*-------------------------< COMPLETE2 >------------------------*/,{
652 	/*
653 	 *  Save host status.
654 	 */
655 	SCR_STORE_REL (scr0, 4),
656 		offsetof (struct sym_ccb, phys.head.status),
657 	/*
658 	 *  Some bridges may reorder DMA writes to memory.
659 	 *  We donnot want the CPU to deal with completions
660 	 *  without all the posted write having been flushed
661 	 *  to memory. This DUMMY READ should flush posted
662 	 *  buffers prior to the CPU having to deal with
663 	 *  completions.
664 	 */
665 	SCR_LOAD_REL (scr0, 4),	/* DUMMY READ */
666 		offsetof (struct sym_ccb, phys.head.status),
667 
668 	/*
669 	 *  If command resulted in not GOOD status,
670 	 *  call the C code if needed.
671 	 */
672 	SCR_FROM_REG (SS_REG),
673 		0,
674 	SCR_CALL ^ IFFALSE (DATA (S_GOOD)),
675 		PADDR_B (bad_status),
676 	/*
677 	 *  If we performed an auto-sense, call
678 	 *  the C code to synchronyze task aborts
679 	 *  with UNIT ATTENTION conditions.
680 	 */
681 	SCR_FROM_REG (HF_REG),
682 		0,
683 	SCR_JUMPR ^ IFTRUE (MASK (0 ,(HF_SENSE|HF_EXT_ERR))),
684 		16,
685 }/*-------------------------< COMPLETE_ERROR >-------------------*/,{
686 	SCR_LOAD_ABS (scratcha, 4),
687 		PADDR_B (startpos),
688 	SCR_INT,
689 		SIR_COMPLETE_ERROR,
690 }/*-------------------------< DONE >-----------------------------*/,{
691 	/*
692 	 *  Copy the DSA to the DONE QUEUE and
693 	 *  signal completion to the host.
694 	 *  If we are interrupted between DONE
695 	 *  and DONE_END, we must reset, otherwise
696 	 *  the completed CCB may be lost.
697 	 */
698 	SCR_STORE_ABS (dsa, 4),
699 		PADDR_B (saved_dsa),
700 	SCR_LOAD_ABS (dsa, 4),
701 		PADDR_B (done_pos),
702 	SCR_LOAD_ABS (scratcha, 4),
703 		PADDR_B (saved_dsa),
704 	SCR_STORE_REL (scratcha, 4),
705 		0,
706 	/*
707 	 *  The instruction below reads the DONE QUEUE next
708 	 *  free position from memory.
709 	 *  In addition it ensures that all PCI posted writes
710 	 *  are flushed and so the DSA value of the done
711 	 *  CCB is visible by the CPU before INTFLY is raised.
712 	 */
713 	SCR_LOAD_REL (temp, 4),
714 		4,
715 	SCR_INT_FLY,
716 		0,
717 	SCR_STORE_ABS (temp, 4),
718 		PADDR_B (done_pos),
719 }/*-------------------------< DONE_END >-------------------------*/,{
720 	SCR_JUMP,
721 		PADDR_A (start),
722 }/*-------------------------< SAVE_DP >--------------------------*/,{
723 	/*
724 	 *  Clear ACK immediately.
725 	 *  No need to delay it.
726 	 */
727 	SCR_CLR (SCR_ACK),
728 		0,
729 	/*
730 	 *  Keep track we received a SAVE DP, so
731 	 *  we will switch to the other PM context
732 	 *  on the next PM since the DP may point
733 	 *  to the current PM context.
734 	 */
735 	SCR_REG_REG (HF_REG, SCR_OR, HF_DP_SAVED),
736 		0,
737 	/*
738 	 *  SAVE_DP message:
739 	 *  Copy the data pointer to SAVEP.
740 	 */
741 	SCR_STORE_REL (temp, 4),
742 		offsetof (struct sym_ccb, phys.head.savep),
743 	SCR_JUMP,
744 		PADDR_A (dispatch),
745 }/*-------------------------< RESTORE_DP >-----------------------*/,{
746 	/*
747 	 *  RESTORE_DP message:
748 	 *  Copy SAVEP to actual data pointer.
749 	 */
750 	SCR_LOAD_REL  (temp, 4),
751 		offsetof (struct sym_ccb, phys.head.savep),
752 	SCR_JUMP,
753 		PADDR_A (clrack),
754 }/*-------------------------< DISCONNECT >-----------------------*/,{
755 	/*
756 	 *  DISCONNECTing  ...
757 	 *
758 	 *  disable the "unexpected disconnect" feature,
759 	 *  and remove the ACK signal.
760 	 */
761 	SCR_REG_REG (scntl2, SCR_AND, 0x7f),
762 		0,
763 	SCR_CLR (SCR_ACK|SCR_ATN),
764 		0,
765 	/*
766 	 *  Wait for the disconnect.
767 	 */
768 	SCR_WAIT_DISC,
769 		0,
770 	/*
771 	 *  Status is: DISCONNECTED.
772 	 */
773 	SCR_LOAD_REG (HS_REG, HS_DISCONNECT),
774 		0,
775 	/*
776 	 *  Save host status.
777 	 */
778 	SCR_STORE_REL (scr0, 4),
779 		offsetof (struct sym_ccb, phys.head.status),
780 	/*
781 	 *  If QUIRK_AUTOSAVE is set,
782 	 *  do a "save pointer" operation.
783 	 */
784 	SCR_FROM_REG (QU_REG),
785 		0,
786 	SCR_JUMP ^ IFFALSE (MASK (SYM_QUIRK_AUTOSAVE, SYM_QUIRK_AUTOSAVE)),
787 		PADDR_A (start),
788 	/*
789 	 *  like SAVE_DP message:
790 	 *  Remember we saved the data pointer.
791 	 *  Copy data pointer to SAVEP.
792 	 */
793 	SCR_REG_REG (HF_REG, SCR_OR, HF_DP_SAVED),
794 		0,
795 	SCR_STORE_REL (temp, 4),
796 		offsetof (struct sym_ccb, phys.head.savep),
797 	SCR_JUMP,
798 		PADDR_A (start),
799 }/*-------------------------< IDLE >-----------------------------*/,{
800 	/*
801 	 *  Nothing to do?
802 	 *  Switch the LED off and wait for reselect.
803 	 *  Will be patched with a NO_OP if LED
804 	 *  not needed or not desired.
805 	 */
806 	SCR_REG_REG (gpreg, SCR_OR, 0x01),
807 		0,
808 #ifdef SYM_CONF_IARB_SUPPORT
809 	SCR_JUMPR,
810 		8,
811 #endif
812 }/*-------------------------< UNGETJOB >-------------------------*/,{
813 #ifdef SYM_CONF_IARB_SUPPORT
814 	/*
815 	 *  Set IMMEDIATE ARBITRATION, for the next time.
816 	 *  This will give us better chance to win arbitration
817 	 *  for the job we just wanted to do.
818 	 */
819 	SCR_REG_REG (scntl1, SCR_OR, IARB),
820 		0,
821 #endif
822 	/*
823 	 *  We are not able to restart the SCRIPTS if we are
824 	 *  interrupted and these instruction haven't been
825 	 *  all executed. BTW, this is very unlikely to
826 	 *  happen, but we check that from the C code.
827 	 */
828 	SCR_LOAD_REG (dsa, 0xff),
829 		0,
830 	SCR_STORE_ABS (scratcha, 4),
831 		PADDR_B (startpos),
832 }/*-------------------------< RESELECT >-------------------------*/,{
833 	/*
834 	 *  Make sure we are in initiator mode.
835 	 */
836 	SCR_CLR (SCR_TRG),
837 		0,
838 	/*
839 	 *  Sleep waiting for a reselection.
840 	 */
841 	SCR_WAIT_RESEL,
842 		PADDR_A(start),
843 }/*-------------------------< RESELECTED >-----------------------*/,{
844 	/*
845 	 *  Switch the LED on.
846 	 *  Will be patched with a NO_OP if LED
847 	 *  not needed or not desired.
848 	 */
849 	SCR_REG_REG (gpreg, SCR_AND, 0xfe),
850 		0,
851 	/*
852 	 *  load the target id into the sdid
853 	 */
854 	SCR_REG_SFBR (ssid, SCR_AND, 0x8F),
855 		0,
856 	SCR_TO_REG (sdid),
857 		0,
858 	/*
859 	 *  Load the target control block address
860 	 */
861 	SCR_LOAD_ABS (dsa, 4),
862 		PADDR_B (targtbl),
863 	SCR_SFBR_REG (dsa, SCR_SHL, 0),
864 		0,
865 	SCR_REG_REG (dsa, SCR_SHL, 0),
866 		0,
867 	SCR_REG_REG (dsa, SCR_AND, 0x3c),
868 		0,
869 	SCR_LOAD_REL (dsa, 4),
870 		0,
871 	/*
872 	 *  We expect MESSAGE IN phase.
873 	 *  If not, get help from the C code.
874 	 */
875 	SCR_INT ^ IFFALSE (WHEN (SCR_MSG_IN)),
876 		SIR_RESEL_NO_MSG_IN,
877 	/*
878 	 *  Load the legacy synchronous transfer registers.
879 	 */
880 	SCR_LOAD_REL (scntl3, 1),
881 		offsetof(struct sym_tcb, head.wval),
882 	SCR_LOAD_REL (sxfer, 1),
883 		offsetof(struct sym_tcb, head.sval),
884 }/*-------------------------< RESEL_SCNTL4 >---------------------*/,{
885 	/*
886 	 *  The C1010 uses a new synchronous timing scheme.
887 	 *  Will be patched with a NO_OP if not a C1010.
888 	 */
889 	SCR_LOAD_REL (scntl4, 1),
890 		offsetof(struct sym_tcb, head.uval),
891 	/*
892 	 *  Get the IDENTIFY message.
893 	 */
894 	SCR_MOVE_ABS (1) ^ SCR_MSG_IN,
895 		HADDR_1 (msgin),
896 	/*
897 	 *  If IDENTIFY LUN #0, use a faster path
898 	 *  to find the LCB structure.
899 	 */
900 	SCR_JUMP ^ IFTRUE (MASK (0x80, 0xbf)),
901 		PADDR_A (resel_lun0),
902 	/*
903 	 *  If message isn't an IDENTIFY,
904 	 *  tell the C code about.
905 	 */
906 	SCR_INT ^ IFFALSE (MASK (0x80, 0x80)),
907 		SIR_RESEL_NO_IDENTIFY,
908 	/*
909 	 *  It is an IDENTIFY message,
910 	 *  Load the LUN control block address.
911 	 */
912 	SCR_LOAD_REL (dsa, 4),
913 		offsetof(struct sym_tcb, head.luntbl_sa),
914 	SCR_SFBR_REG (dsa, SCR_SHL, 0),
915 		0,
916 	SCR_REG_REG (dsa, SCR_SHL, 0),
917 		0,
918 	SCR_REG_REG (dsa, SCR_AND, 0xfc),
919 		0,
920 	SCR_LOAD_REL (dsa, 4),
921 		0,
922 	SCR_JUMPR,
923 		8,
924 }/*-------------------------< RESEL_LUN0 >-----------------------*/,{
925 	/*
926 	 *  LUN 0 special case (but usual one :))
927 	 */
928 	SCR_LOAD_REL (dsa, 4),
929 		offsetof(struct sym_tcb, head.lun0_sa),
930 	/*
931 	 *  Jump indirectly to the reselect action for this LUN.
932 	 */
933 	SCR_LOAD_REL (temp, 4),
934 		offsetof(struct sym_lcb, head.resel_sa),
935 	SCR_RETURN,
936 		0,
937 	/* In normal situations, we jump to RESEL_TAG or RESEL_NO_TAG */
938 }/*-------------------------< RESEL_TAG >------------------------*/,{
939 	/*
940 	 *  ACK the IDENTIFY previously received.
941 	 */
942 	SCR_CLR (SCR_ACK),
943 		0,
944 	/*
945 	 *  It shall be a tagged command.
946 	 *  Read SIMPLE+TAG.
947 	 *  The C code will deal with errors.
948 	 *  Aggressive optimization, isn't it? :)
949 	 */
950 	SCR_MOVE_ABS (2) ^ SCR_MSG_IN,
951 		HADDR_1 (msgin),
952 	/*
953 	 *  Load the pointer to the tagged task
954 	 *  table for this LUN.
955 	 */
956 	SCR_LOAD_REL (dsa, 4),
957 		offsetof(struct sym_lcb, head.itlq_tbl_sa),
958 	/*
959 	 *  The SIDL still contains the TAG value.
960 	 *  Aggressive optimization, isn't it? :):)
961 	 */
962 	SCR_REG_SFBR (sidl, SCR_SHL, 0),
963 		0,
964 #if SYM_CONF_MAX_TASK*4 > 512
965 	SCR_JUMPR ^ IFFALSE (CARRYSET),
966 		8,
967 	SCR_REG_REG (dsa1, SCR_OR, 2),
968 		0,
969 	SCR_REG_REG (sfbr, SCR_SHL, 0),
970 		0,
971 	SCR_JUMPR ^ IFFALSE (CARRYSET),
972 		8,
973 	SCR_REG_REG (dsa1, SCR_OR, 1),
974 		0,
975 #elif SYM_CONF_MAX_TASK*4 > 256
976 	SCR_JUMPR ^ IFFALSE (CARRYSET),
977 		8,
978 	SCR_REG_REG (dsa1, SCR_OR, 1),
979 		0,
980 #endif
981 	/*
982 	 *  Retrieve the DSA of this task.
983 	 *  JUMP indirectly to the restart point of the CCB.
984 	 */
985 	SCR_SFBR_REG (dsa, SCR_AND, 0xfc),
986 		0,
987 	SCR_LOAD_REL (dsa, 4),
988 		0,
989 	SCR_LOAD_REL (temp, 4),
990 		offsetof(struct sym_ccb, phys.head.go.restart),
991 	SCR_RETURN,
992 		0,
993 	/* In normal situations we branch to RESEL_DSA */
994 }/*-------------------------< RESEL_DSA >------------------------*/,{
995 	/*
996 	 *  ACK the IDENTIFY or TAG previously received.
997 	 */
998 	SCR_CLR (SCR_ACK),
999 		0,
1000 }/*-------------------------< RESEL_DSA1 >-----------------------*/,{
1001 	/*
1002 	 *      load the savep (saved pointer) into
1003 	 *      the actual data pointer.
1004 	 */
1005 	SCR_LOAD_REL (temp, 4),
1006 		offsetof (struct sym_ccb, phys.head.savep),
1007 	/*
1008 	 *      Initialize the status registers
1009 	 */
1010 	SCR_LOAD_REL (scr0, 4),
1011 		offsetof (struct sym_ccb, phys.head.status),
1012 	/*
1013 	 *  Jump to dispatcher.
1014 	 */
1015 	SCR_JUMP,
1016 		PADDR_A (dispatch),
1017 }/*-------------------------< RESEL_NO_TAG >---------------------*/,{
1018 	/*
1019 	 *  Load the DSA with the unique ITL task.
1020 	 */
1021 	SCR_LOAD_REL (dsa, 4),
1022 		offsetof(struct sym_lcb, head.itl_task_sa),
1023 	/*
1024 	 *  JUMP indirectly to the restart point of the CCB.
1025 	 */
1026 	SCR_LOAD_REL (temp, 4),
1027 		offsetof(struct sym_ccb, phys.head.go.restart),
1028 	SCR_RETURN,
1029 		0,
1030 	/* In normal situations we branch to RESEL_DSA */
1031 }/*-------------------------< DATA_IN >--------------------------*/,{
1032 /*
1033  *  Because the size depends on the
1034  *  #define SYM_CONF_MAX_SG parameter,
1035  *  it is filled in at runtime.
1036  *
1037  *  ##===========< i=0; i<SYM_CONF_MAX_SG >=========
1038  *  ||	SCR_CHMOV_TBL ^ SCR_DATA_IN,
1039  *  ||		offsetof (struct sym_dsb, data[ i]),
1040  *  ##==========================================
1041  */
1042 0
1043 }/*-------------------------< DATA_IN2 >-------------------------*/,{
1044 	SCR_CALL,
1045 		PADDR_A (datai_done),
1046 	SCR_JUMP,
1047 		PADDR_B (data_ovrun),
1048 }/*-------------------------< DATA_OUT >-------------------------*/,{
1049 /*
1050  *  Because the size depends on the
1051  *  #define SYM_CONF_MAX_SG parameter,
1052  *  it is filled in at runtime.
1053  *
1054  *  ##===========< i=0; i<SYM_CONF_MAX_SG >=========
1055  *  ||	SCR_CHMOV_TBL ^ SCR_DATA_OUT,
1056  *  ||		offsetof (struct sym_dsb, data[ i]),
1057  *  ##==========================================
1058  */
1059 0
1060 }/*-------------------------< DATA_OUT2 >------------------------*/,{
1061 	SCR_CALL,
1062 		PADDR_A (datao_done),
1063 	SCR_JUMP,
1064 		PADDR_B (data_ovrun),
1065 }/*-------------------------< PM0_DATA >-------------------------*/,{
1066 	/*
1067 	 *  Read our host flags to SFBR, so we will be able
1068 	 *  to check against the data direction we expect.
1069 	 */
1070 	SCR_FROM_REG (HF_REG),
1071 		0,
1072 	/*
1073 	 *  Check against actual DATA PHASE.
1074 	 */
1075 	SCR_JUMP ^ IFFALSE (WHEN (SCR_DATA_IN)),
1076 		PADDR_A (pm0_data_out),
1077 	/*
1078 	 *  Actual phase is DATA IN.
1079 	 *  Check against expected direction.
1080 	 */
1081 	SCR_JUMP ^ IFFALSE (MASK (HF_DATA_IN, HF_DATA_IN)),
1082 		PADDR_B (data_ovrun),
1083 	/*
1084 	 *  Keep track we are moving data from the
1085 	 *  PM0 DATA mini-script.
1086 	 */
1087 	SCR_REG_REG (HF_REG, SCR_OR, HF_IN_PM0),
1088 		0,
1089 	/*
1090 	 *  Move the data to memory.
1091 	 */
1092 	SCR_CHMOV_TBL ^ SCR_DATA_IN,
1093 		offsetof (struct sym_ccb, phys.pm0.sg),
1094 	SCR_JUMP,
1095 		PADDR_A (pm0_data_end),
1096 }/*-------------------------< PM0_DATA_OUT >---------------------*/,{
1097 	/*
1098 	 *  Actual phase is DATA OUT.
1099 	 *  Check against expected direction.
1100 	 */
1101 	SCR_JUMP ^ IFTRUE (MASK (HF_DATA_IN, HF_DATA_IN)),
1102 		PADDR_B (data_ovrun),
1103 	/*
1104 	 *  Keep track we are moving data from the
1105 	 *  PM0 DATA mini-script.
1106 	 */
1107 	SCR_REG_REG (HF_REG, SCR_OR, HF_IN_PM0),
1108 		0,
1109 	/*
1110 	 *  Move the data from memory.
1111 	 */
1112 	SCR_CHMOV_TBL ^ SCR_DATA_OUT,
1113 		offsetof (struct sym_ccb, phys.pm0.sg),
1114 }/*-------------------------< PM0_DATA_END >---------------------*/,{
1115 	/*
1116 	 *  Clear the flag that told we were moving
1117 	 *  data from the PM0 DATA mini-script.
1118 	 */
1119 	SCR_REG_REG (HF_REG, SCR_AND, (~HF_IN_PM0)),
1120 		0,
1121 	/*
1122 	 *  Return to the previous DATA script which
1123 	 *  is guaranteed by design (if no bug) to be
1124 	 *  the main DATA script for this transfer.
1125 	 */
1126 	SCR_LOAD_REL (temp, 4),
1127 		offsetof (struct sym_ccb, phys.pm0.ret),
1128 	SCR_RETURN,
1129 		0,
1130 }/*-------------------------< PM1_DATA >-------------------------*/,{
1131 	/*
1132 	 *  Read our host flags to SFBR, so we will be able
1133 	 *  to check against the data direction we expect.
1134 	 */
1135 	SCR_FROM_REG (HF_REG),
1136 		0,
1137 	/*
1138 	 *  Check against actual DATA PHASE.
1139 	 */
1140 	SCR_JUMP ^ IFFALSE (WHEN (SCR_DATA_IN)),
1141 		PADDR_A (pm1_data_out),
1142 	/*
1143 	 *  Actual phase is DATA IN.
1144 	 *  Check against expected direction.
1145 	 */
1146 	SCR_JUMP ^ IFFALSE (MASK (HF_DATA_IN, HF_DATA_IN)),
1147 		PADDR_B (data_ovrun),
1148 	/*
1149 	 *  Keep track we are moving data from the
1150 	 *  PM1 DATA mini-script.
1151 	 */
1152 	SCR_REG_REG (HF_REG, SCR_OR, HF_IN_PM1),
1153 		0,
1154 	/*
1155 	 *  Move the data to memory.
1156 	 */
1157 	SCR_CHMOV_TBL ^ SCR_DATA_IN,
1158 		offsetof (struct sym_ccb, phys.pm1.sg),
1159 	SCR_JUMP,
1160 		PADDR_A (pm1_data_end),
1161 }/*-------------------------< PM1_DATA_OUT >---------------------*/,{
1162 	/*
1163 	 *  Actual phase is DATA OUT.
1164 	 *  Check against expected direction.
1165 	 */
1166 	SCR_JUMP ^ IFTRUE (MASK (HF_DATA_IN, HF_DATA_IN)),
1167 		PADDR_B (data_ovrun),
1168 	/*
1169 	 *  Keep track we are moving data from the
1170 	 *  PM1 DATA mini-script.
1171 	 */
1172 	SCR_REG_REG (HF_REG, SCR_OR, HF_IN_PM1),
1173 		0,
1174 	/*
1175 	 *  Move the data from memory.
1176 	 */
1177 	SCR_CHMOV_TBL ^ SCR_DATA_OUT,
1178 		offsetof (struct sym_ccb, phys.pm1.sg),
1179 }/*-------------------------< PM1_DATA_END >---------------------*/,{
1180 	/*
1181 	 *  Clear the flag that told we were moving
1182 	 *  data from the PM1 DATA mini-script.
1183 	 */
1184 	SCR_REG_REG (HF_REG, SCR_AND, (~HF_IN_PM1)),
1185 		0,
1186 	/*
1187 	 *  Return to the previous DATA script which
1188 	 *  is guaranteed by design (if no bug) to be
1189 	 *  the main DATA script for this transfer.
1190 	 */
1191 	SCR_LOAD_REL (temp, 4),
1192 		offsetof (struct sym_ccb, phys.pm1.ret),
1193 	SCR_RETURN,
1194 		0,
1195 }/*-------------------------<>-----------------------------------*/
1196 };
1197 
1198 static const struct SYM_FWB_SCR SYM_FWB_SCR = {
1199 /*--------------------------< START64 >--------------------------*/ {
1200 	/*
1201 	 *  SCRIPT entry point for the 895A, 896 and 1010.
1202 	 *  For now, there is no specific stuff for those
1203 	 *  chips at this point, but this may come.
1204 	 */
1205 	SCR_JUMP,
1206 		PADDR_A (init),
1207 }/*-------------------------< NO_DATA >--------------------------*/,{
1208 	SCR_JUMP,
1209 		PADDR_B (data_ovrun),
1210 }/*-------------------------< SEL_FOR_ABORT >--------------------*/,{
1211 	/*
1212 	 *  We are jumped here by the C code, if we have
1213 	 *  some target to reset or some disconnected
1214 	 *  job to abort. Since error recovery is a serious
1215 	 *  busyness, we will really reset the SCSI BUS, if
1216 	 *  case of a SCSI interrupt occurring in this path.
1217 	 */
1218 
1219 	/*
1220 	 *  Set initiator mode.
1221 	 */
1222 	SCR_CLR (SCR_TRG),
1223 		0,
1224 	/*
1225 	 *      And try to select this target.
1226 	 */
1227 	SCR_SEL_TBL_ATN ^ offsetof (struct sym_hcb, abrt_sel),
1228 		PADDR_A (reselect),
1229 	/*
1230 	 *  Wait for the selection to complete or
1231 	 *  the selection to time out.
1232 	 */
1233 	SCR_JUMPR ^ IFFALSE (WHEN (SCR_MSG_OUT)),
1234 		-8,
1235 	/*
1236 	 *  Call the C code.
1237 	 */
1238 	SCR_INT,
1239 		SIR_TARGET_SELECTED,
1240 	/*
1241 	 *  The C code should let us continue here.
1242 	 *  Send the 'kiss of death' message.
1243 	 *  We expect an immediate disconnect once
1244 	 *  the target has eaten the message.
1245 	 */
1246 	SCR_REG_REG (scntl2, SCR_AND, 0x7f),
1247 		0,
1248 	SCR_MOVE_TBL ^ SCR_MSG_OUT,
1249 		offsetof (struct sym_hcb, abrt_tbl),
1250 	SCR_CLR (SCR_ACK|SCR_ATN),
1251 		0,
1252 	SCR_WAIT_DISC,
1253 		0,
1254 	/*
1255 	 *  Tell the C code that we are done.
1256 	 */
1257 	SCR_INT,
1258 		SIR_ABORT_SENT,
1259 }/*-------------------------< SEL_FOR_ABORT_1 >------------------*/,{
1260 	/*
1261 	 *  Jump at scheduler.
1262 	 */
1263 	SCR_JUMP,
1264 		PADDR_A (start),
1265 }/*-------------------------< MSG_IN_ETC >-----------------------*/,{
1266 	/*
1267 	 *  If it is an EXTENDED (variable size message)
1268 	 *  Handle it.
1269 	 */
1270 	SCR_JUMP ^ IFTRUE (DATA (M_EXTENDED)),
1271 		PADDR_B (msg_extended),
1272 	/*
1273 	 *  Let the C code handle any other
1274 	 *  1 byte message.
1275 	 */
1276 	SCR_JUMP ^ IFTRUE (MASK (0x00, 0xf0)),
1277 		PADDR_B (msg_received),
1278 	SCR_JUMP ^ IFTRUE (MASK (0x10, 0xf0)),
1279 		PADDR_B (msg_received),
1280 	/*
1281 	 *  We donnot handle 2 bytes messages from SCRIPTS.
1282 	 *  So, let the C code deal with these ones too.
1283 	 */
1284 	SCR_JUMP ^ IFFALSE (MASK (0x20, 0xf0)),
1285 		PADDR_B (msg_weird_seen),
1286 	SCR_CLR (SCR_ACK),
1287 		0,
1288 	SCR_MOVE_ABS (1) ^ SCR_MSG_IN,
1289 		HADDR_1 (msgin[1]),
1290 }/*-------------------------< MSG_RECEIVED >---------------------*/,{
1291 	SCR_LOAD_REL (scratcha, 4),	/* DUMMY READ */
1292 		0,
1293 	SCR_INT,
1294 		SIR_MSG_RECEIVED,
1295 }/*-------------------------< MSG_WEIRD_SEEN >-------------------*/,{
1296 	SCR_LOAD_REL (scratcha, 4),	/* DUMMY READ */
1297 		0,
1298 	SCR_INT,
1299 		SIR_MSG_WEIRD,
1300 }/*-------------------------< MSG_EXTENDED >---------------------*/,{
1301 	/*
1302 	 *  Clear ACK and get the next byte
1303 	 *  assumed to be the message length.
1304 	 */
1305 	SCR_CLR (SCR_ACK),
1306 		0,
1307 	SCR_MOVE_ABS (1) ^ SCR_MSG_IN,
1308 		HADDR_1 (msgin[1]),
1309 	/*
1310 	 *  Try to catch some unlikely situations as 0 length
1311 	 *  or too large the length.
1312 	 */
1313 	SCR_JUMP ^ IFTRUE (DATA (0)),
1314 		PADDR_B (msg_weird_seen),
1315 	SCR_TO_REG (scratcha),
1316 		0,
1317 	SCR_REG_REG (sfbr, SCR_ADD, (256-8)),
1318 		0,
1319 	SCR_JUMP ^ IFTRUE (CARRYSET),
1320 		PADDR_B (msg_weird_seen),
1321 	/*
1322 	 *  We donnot handle extended messages from SCRIPTS.
1323 	 *  Read the amount of data corresponding to the
1324 	 *  message length and call the C code.
1325 	 */
1326 	SCR_STORE_REL (scratcha, 1),
1327 		offsetof (struct sym_dsb, smsg_ext.size),
1328 	SCR_CLR (SCR_ACK),
1329 		0,
1330 	SCR_MOVE_TBL ^ SCR_MSG_IN,
1331 		offsetof (struct sym_dsb, smsg_ext),
1332 	SCR_JUMP,
1333 		PADDR_B (msg_received),
1334 }/*-------------------------< MSG_BAD >--------------------------*/,{
1335 	/*
1336 	 *  unimplemented message - reject it.
1337 	 */
1338 	SCR_INT,
1339 		SIR_REJECT_TO_SEND,
1340 	SCR_SET (SCR_ATN),
1341 		0,
1342 	SCR_JUMP,
1343 		PADDR_A (clrack),
1344 }/*-------------------------< MSG_WEIRD >------------------------*/,{
1345 	/*
1346 	 *  weird message received
1347 	 *  ignore all MSG IN phases and reject it.
1348 	 */
1349 	SCR_INT,
1350 		SIR_REJECT_TO_SEND,
1351 	SCR_SET (SCR_ATN),
1352 		0,
1353 }/*-------------------------< MSG_WEIRD1 >-----------------------*/,{
1354 	SCR_CLR (SCR_ACK),
1355 		0,
1356 	SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_IN)),
1357 		PADDR_A (dispatch),
1358 	SCR_MOVE_ABS (1) ^ SCR_MSG_IN,
1359 		HADDR_1 (scratch),
1360 	SCR_JUMP,
1361 		PADDR_B (msg_weird1),
1362 }/*-------------------------< WDTR_RESP >------------------------*/,{
1363 	/*
1364 	 *  let the target fetch our answer.
1365 	 */
1366 	SCR_SET (SCR_ATN),
1367 		0,
1368 	SCR_CLR (SCR_ACK),
1369 		0,
1370 	SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_OUT)),
1371 		PADDR_B (nego_bad_phase),
1372 }/*-------------------------< SEND_WDTR >------------------------*/,{
1373 	/*
1374 	 *  Send the M_X_WIDE_REQ
1375 	 */
1376 	SCR_MOVE_ABS (4) ^ SCR_MSG_OUT,
1377 		HADDR_1 (msgout),
1378 	SCR_JUMP,
1379 		PADDR_B (msg_out_done),
1380 }/*-------------------------< SDTR_RESP >------------------------*/,{
1381 	/*
1382 	 *  let the target fetch our answer.
1383 	 */
1384 	SCR_SET (SCR_ATN),
1385 		0,
1386 	SCR_CLR (SCR_ACK),
1387 		0,
1388 	SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_OUT)),
1389 		PADDR_B (nego_bad_phase),
1390 }/*-------------------------< SEND_SDTR >------------------------*/,{
1391 	/*
1392 	 *  Send the M_X_SYNC_REQ
1393 	 */
1394 	SCR_MOVE_ABS (5) ^ SCR_MSG_OUT,
1395 		HADDR_1 (msgout),
1396 	SCR_JUMP,
1397 		PADDR_B (msg_out_done),
1398 }/*-------------------------< PPR_RESP >-------------------------*/,{
1399 	/*
1400 	 *  let the target fetch our answer.
1401 	 */
1402 	SCR_SET (SCR_ATN),
1403 		0,
1404 	SCR_CLR (SCR_ACK),
1405 		0,
1406 	SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_OUT)),
1407 		PADDR_B (nego_bad_phase),
1408 }/*-------------------------< SEND_PPR >-------------------------*/,{
1409 	/*
1410 	 *  Send the M_X_PPR_REQ
1411 	 */
1412 	SCR_MOVE_ABS (8) ^ SCR_MSG_OUT,
1413 		HADDR_1 (msgout),
1414 	SCR_JUMP,
1415 		PADDR_B (msg_out_done),
1416 }/*-------------------------< NEGO_BAD_PHASE >-------------------*/,{
1417 	SCR_INT,
1418 		SIR_NEGO_PROTO,
1419 	SCR_JUMP,
1420 		PADDR_A (dispatch),
1421 }/*-------------------------< MSG_OUT >--------------------------*/,{
1422 	/*
1423 	 *  The target requests a message.
1424 	 *  We donnot send messages that may
1425 	 *  require the device to go to bus free.
1426 	 */
1427 	SCR_MOVE_ABS (1) ^ SCR_MSG_OUT,
1428 		HADDR_1 (msgout),
1429 	/*
1430 	 *  ... wait for the next phase
1431 	 *  if it's a message out, send it again, ...
1432 	 */
1433 	SCR_JUMP ^ IFTRUE (WHEN (SCR_MSG_OUT)),
1434 		PADDR_B (msg_out),
1435 }/*-------------------------< MSG_OUT_DONE >---------------------*/,{
1436 	/*
1437 	 *  Let the C code be aware of the
1438 	 *  sent message and clear the message.
1439 	 */
1440 	SCR_INT,
1441 		SIR_MSG_OUT_DONE,
1442 	/*
1443 	 *  ... and process the next phase
1444 	 */
1445 	SCR_JUMP,
1446 		PADDR_A (dispatch),
1447 }/*-------------------------< DATA_OVRUN >-----------------------*/,{
1448 	/*
1449 	 *  Use scratcha to count the extra bytes.
1450 	 */
1451 	SCR_LOAD_ABS (scratcha, 4),
1452 		PADDR_B (zero),
1453 }/*-------------------------< DATA_OVRUN1 >----------------------*/,{
1454 	/*
1455 	 *  The target may want to transfer too much data.
1456 	 *
1457 	 *  If phase is DATA OUT write 1 byte and count it.
1458 	 */
1459 	SCR_JUMPR ^ IFFALSE (WHEN (SCR_DATA_OUT)),
1460 		16,
1461 	SCR_CHMOV_ABS (1) ^ SCR_DATA_OUT,
1462 		HADDR_1 (scratch),
1463 	SCR_JUMP,
1464 		PADDR_B (data_ovrun2),
1465 	/*
1466 	 *  If WSR is set, clear this condition, and
1467 	 *  count this byte.
1468 	 */
1469 	SCR_FROM_REG (scntl2),
1470 		0,
1471 	SCR_JUMPR ^ IFFALSE (MASK (WSR, WSR)),
1472 		16,
1473 	SCR_REG_REG (scntl2, SCR_OR, WSR),
1474 		0,
1475 	SCR_JUMP,
1476 		PADDR_B (data_ovrun2),
1477 	/*
1478 	 *  Finally check against DATA IN phase.
1479 	 *  Signal data overrun to the C code
1480 	 *  and jump to dispatcher if not so.
1481 	 *  Read 1 byte otherwise and count it.
1482 	 */
1483 	SCR_JUMPR ^ IFTRUE (WHEN (SCR_DATA_IN)),
1484 		16,
1485 	SCR_INT,
1486 		SIR_DATA_OVERRUN,
1487 	SCR_JUMP,
1488 		PADDR_A (dispatch),
1489 	SCR_CHMOV_ABS (1) ^ SCR_DATA_IN,
1490 		HADDR_1 (scratch),
1491 }/*-------------------------< DATA_OVRUN2 >----------------------*/,{
1492 	/*
1493 	 *  Count this byte.
1494 	 *  This will allow to return a negative
1495 	 *  residual to user.
1496 	 */
1497 	SCR_REG_REG (scratcha,  SCR_ADD,  0x01),
1498 		0,
1499 	SCR_REG_REG (scratcha1, SCR_ADDC, 0),
1500 		0,
1501 	SCR_REG_REG (scratcha2, SCR_ADDC, 0),
1502 		0,
1503 	/*
1504 	 *  .. and repeat as required.
1505 	 */
1506 	SCR_JUMP,
1507 		PADDR_B (data_ovrun1),
1508 }/*-------------------------< ABORT_RESEL >----------------------*/,{
1509 	SCR_SET (SCR_ATN),
1510 		0,
1511 	SCR_CLR (SCR_ACK),
1512 		0,
1513 	/*
1514 	 *  send the abort/abortag/reset message
1515 	 *  we expect an immediate disconnect
1516 	 */
1517 	SCR_REG_REG (scntl2, SCR_AND, 0x7f),
1518 		0,
1519 	SCR_MOVE_ABS (1) ^ SCR_MSG_OUT,
1520 		HADDR_1 (msgout),
1521 	SCR_CLR (SCR_ACK|SCR_ATN),
1522 		0,
1523 	SCR_WAIT_DISC,
1524 		0,
1525 	SCR_INT,
1526 		SIR_RESEL_ABORTED,
1527 	SCR_JUMP,
1528 		PADDR_A (start),
1529 }/*-------------------------< RESEND_IDENT >---------------------*/,{
1530 	/*
1531 	 *  The target stays in MSG OUT phase after having acked
1532 	 *  Identify [+ Tag [+ Extended message ]]. Targets shall
1533 	 *  behave this way on parity error.
1534 	 *  We must send it again all the messages.
1535 	 */
1536 	SCR_SET (SCR_ATN), /* Shall be asserted 2 deskew delays before the  */
1537 		0,         /* 1rst ACK = 90 ns. Hope the chip isn't too fast */
1538 	SCR_JUMP,
1539 		PADDR_A (send_ident),
1540 }/*-------------------------< IDENT_BREAK >----------------------*/,{
1541 	SCR_CLR (SCR_ATN),
1542 		0,
1543 	SCR_JUMP,
1544 		PADDR_A (select2),
1545 }/*-------------------------< IDENT_BREAK_ATN >------------------*/,{
1546 	SCR_SET (SCR_ATN),
1547 		0,
1548 	SCR_JUMP,
1549 		PADDR_A (select2),
1550 }/*-------------------------< SDATA_IN >-------------------------*/,{
1551 	SCR_CHMOV_TBL ^ SCR_DATA_IN,
1552 		offsetof (struct sym_dsb, sense),
1553 	SCR_CALL,
1554 		PADDR_A (datai_done),
1555 	SCR_JUMP,
1556 		PADDR_B (data_ovrun),
1557 }/*-------------------------< RESEL_BAD_LUN >--------------------*/,{
1558 	/*
1559 	 *  Message is an IDENTIFY, but lun is unknown.
1560 	 *  Signal problem to C code for logging the event.
1561 	 *  Send a M_ABORT to clear all pending tasks.
1562 	 */
1563 	SCR_INT,
1564 		SIR_RESEL_BAD_LUN,
1565 	SCR_JUMP,
1566 		PADDR_B (abort_resel),
1567 }/*-------------------------< BAD_I_T_L >------------------------*/,{
1568 	/*
1569 	 *  We donnot have a task for that I_T_L.
1570 	 *  Signal problem to C code for logging the event.
1571 	 *  Send a M_ABORT message.
1572 	 */
1573 	SCR_INT,
1574 		SIR_RESEL_BAD_I_T_L,
1575 	SCR_JUMP,
1576 		PADDR_B (abort_resel),
1577 }/*-------------------------< BAD_I_T_L_Q >----------------------*/,{
1578 	/*
1579 	 *  We donnot have a task that matches the tag.
1580 	 *  Signal problem to C code for logging the event.
1581 	 *  Send a M_ABORTTAG message.
1582 	 */
1583 	SCR_INT,
1584 		SIR_RESEL_BAD_I_T_L_Q,
1585 	SCR_JUMP,
1586 		PADDR_B (abort_resel),
1587 }/*-------------------------< BAD_STATUS >-----------------------*/,{
1588 	/*
1589 	 *  Anything different from INTERMEDIATE
1590 	 *  CONDITION MET should be a bad SCSI status,
1591 	 *  given that GOOD status has already been tested.
1592 	 *  Call the C code.
1593 	 */
1594 	SCR_LOAD_ABS (scratcha, 4),
1595 		PADDR_B (startpos),
1596 	SCR_INT ^ IFFALSE (DATA (S_COND_MET)),
1597 		SIR_BAD_SCSI_STATUS,
1598 	SCR_RETURN,
1599 		0,
1600 }/*-------------------------< PM_HANDLE >------------------------*/,{
1601 	/*
1602 	 *  Phase mismatch handling.
1603 	 *
1604 	 *  Since we have to deal with 2 SCSI data pointers
1605 	 *  (current and saved), we need at least 2 contexts.
1606 	 *  Each context (pm0 and pm1) has a saved area, a
1607 	 *  SAVE mini-script and a DATA phase mini-script.
1608 	 */
1609 	/*
1610 	 *  Get the PM handling flags.
1611 	 */
1612 	SCR_FROM_REG (HF_REG),
1613 		0,
1614 	/*
1615 	 *  If no flags (1rst PM for example), avoid
1616 	 *  all the below heavy flags testing.
1617 	 *  This makes the normal case a bit faster.
1618 	 */
1619 	SCR_JUMP ^ IFTRUE (MASK (0, (HF_IN_PM0 | HF_IN_PM1 | HF_DP_SAVED))),
1620 		PADDR_B (pm_handle1),
1621 	/*
1622 	 *  If we received a SAVE DP, switch to the
1623 	 *  other PM context since the savep may point
1624 	 *  to the current PM context.
1625 	 */
1626 	SCR_JUMPR ^ IFFALSE (MASK (HF_DP_SAVED, HF_DP_SAVED)),
1627 		8,
1628 	SCR_REG_REG (sfbr, SCR_XOR, HF_ACT_PM),
1629 		0,
1630 	/*
1631 	 *  If we have been interrupt in a PM DATA mini-script,
1632 	 *  we take the return address from the corresponding
1633 	 *  saved area.
1634 	 *  This ensure the return address always points to the
1635 	 *  main DATA script for this transfer.
1636 	 */
1637 	SCR_JUMP ^ IFTRUE (MASK (0, (HF_IN_PM0 | HF_IN_PM1))),
1638 		PADDR_B (pm_handle1),
1639 	SCR_JUMPR ^ IFFALSE (MASK (HF_IN_PM0, HF_IN_PM0)),
1640 		16,
1641 	SCR_LOAD_REL (ia, 4),
1642 		offsetof(struct sym_ccb, phys.pm0.ret),
1643 	SCR_JUMP,
1644 		PADDR_B (pm_save),
1645 	SCR_LOAD_REL (ia, 4),
1646 		offsetof(struct sym_ccb, phys.pm1.ret),
1647 	SCR_JUMP,
1648 		PADDR_B (pm_save),
1649 }/*-------------------------< PM_HANDLE1 >-----------------------*/,{
1650 	/*
1651 	 *  Normal case.
1652 	 *  Update the return address so that it
1653 	 *  will point after the interrupted MOVE.
1654 	 */
1655 	SCR_REG_REG (ia, SCR_ADD, 8),
1656 		0,
1657 	SCR_REG_REG (ia1, SCR_ADDC, 0),
1658 		0,
1659 }/*-------------------------< PM_SAVE >--------------------------*/,{
1660 	/*
1661 	 *  Clear all the flags that told us if we were
1662 	 *  interrupted in a PM DATA mini-script and/or
1663 	 *  we received a SAVE DP.
1664 	 */
1665 	SCR_SFBR_REG (HF_REG, SCR_AND, (~(HF_IN_PM0|HF_IN_PM1|HF_DP_SAVED))),
1666 		0,
1667 	/*
1668 	 *  Choose the current PM context.
1669 	 */
1670 	SCR_JUMP ^ IFTRUE (MASK (HF_ACT_PM, HF_ACT_PM)),
1671 		PADDR_B (pm1_save),
1672 }/*-------------------------< PM0_SAVE >-------------------------*/,{
1673 	SCR_STORE_REL (ia, 4),
1674 		offsetof(struct sym_ccb, phys.pm0.ret),
1675 	/*
1676 	 *  If WSR bit is set, either UA and RBC may
1677 	 *  have to be changed whether the device wants
1678 	 *  to ignore this residue or not.
1679 	 */
1680 	SCR_FROM_REG (scntl2),
1681 		0,
1682 	SCR_CALL ^ IFTRUE (MASK (WSR, WSR)),
1683 		PADDR_B (pm_wsr_handle),
1684 	/*
1685 	 *  Save the remaining byte count, the updated
1686 	 *  address and the return address.
1687 	 */
1688 	SCR_STORE_REL (rbc, 4),
1689 		offsetof(struct sym_ccb, phys.pm0.sg.size),
1690 	SCR_STORE_REL (ua, 4),
1691 		offsetof(struct sym_ccb, phys.pm0.sg.addr),
1692 	/*
1693 	 *  Set the current pointer at the PM0 DATA mini-script.
1694 	 */
1695 	SCR_LOAD_ABS (temp, 4),
1696 		PADDR_B (pm0_data_addr),
1697 	SCR_JUMP,
1698 		PADDR_A (dispatch),
1699 }/*-------------------------< PM1_SAVE >-------------------------*/,{
1700 	SCR_STORE_REL (ia, 4),
1701 		offsetof(struct sym_ccb, phys.pm1.ret),
1702 	/*
1703 	 *  If WSR bit is set, either UA and RBC may
1704 	 *  have to be changed whether the device wants
1705 	 *  to ignore this residue or not.
1706 	 */
1707 	SCR_FROM_REG (scntl2),
1708 		0,
1709 	SCR_CALL ^ IFTRUE (MASK (WSR, WSR)),
1710 		PADDR_B (pm_wsr_handle),
1711 	/*
1712 	 *  Save the remaining byte count, the updated
1713 	 *  address and the return address.
1714 	 */
1715 	SCR_STORE_REL (rbc, 4),
1716 		offsetof(struct sym_ccb, phys.pm1.sg.size),
1717 	SCR_STORE_REL (ua, 4),
1718 		offsetof(struct sym_ccb, phys.pm1.sg.addr),
1719 	/*
1720 	 *  Set the current pointer at the PM1 DATA mini-script.
1721 	 */
1722 	SCR_LOAD_ABS (temp, 4),
1723 		PADDR_B (pm1_data_addr),
1724 	SCR_JUMP,
1725 		PADDR_A (dispatch),
1726 }/*-------------------------< PM_WSR_HANDLE >--------------------*/,{
1727 	/*
1728 	 *  Phase mismatch handling from SCRIPT with WSR set.
1729 	 *  Such a condition can occur if the chip wants to
1730 	 *  execute a CHMOV(size > 1) when the WSR bit is
1731 	 *  set and the target changes PHASE.
1732 	 *
1733 	 *  We must move the residual byte to memory.
1734 	 *
1735 	 *  UA contains bit 0..31 of the address to
1736 	 *  move the residual byte.
1737 	 *  Move it to the table indirect.
1738 	 */
1739 	SCR_STORE_REL (ua, 4),
1740 		offsetof (struct sym_ccb, phys.wresid.addr),
1741 	/*
1742 	 *  Increment UA (move address to next position).
1743 	 */
1744 	SCR_REG_REG (ua, SCR_ADD, 1),
1745 		0,
1746 	SCR_REG_REG (ua1, SCR_ADDC, 0),
1747 		0,
1748 	SCR_REG_REG (ua2, SCR_ADDC, 0),
1749 		0,
1750 	SCR_REG_REG (ua3, SCR_ADDC, 0),
1751 		0,
1752 	/*
1753 	 *  Compute SCRATCHA as:
1754 	 *  - size to transfer = 1 byte.
1755 	 *  - bit 24..31 = high address bit [32...39].
1756 	 */
1757 	SCR_LOAD_ABS (scratcha, 4),
1758 		PADDR_B (zero),
1759 	SCR_REG_REG (scratcha, SCR_OR, 1),
1760 		0,
1761 	SCR_FROM_REG (rbc3),
1762 		0,
1763 	SCR_TO_REG (scratcha3),
1764 		0,
1765 	/*
1766 	 *  Move this value to the table indirect.
1767 	 */
1768 	SCR_STORE_REL (scratcha, 4),
1769 		offsetof (struct sym_ccb, phys.wresid.size),
1770 	/*
1771 	 *  Wait for a valid phase.
1772 	 *  While testing with bogus QUANTUM drives, the C1010
1773 	 *  sometimes raised a spurious phase mismatch with
1774 	 *  WSR and the CHMOV(1) triggered another PM.
1775 	 *  Waiting explicitely for the PHASE seemed to avoid
1776 	 *  the nested phase mismatch. Btw, this didn't happen
1777 	 *  using my IBM drives.
1778 	 */
1779 	SCR_JUMPR ^ IFFALSE (WHEN (SCR_DATA_IN)),
1780 		0,
1781 	/*
1782 	 *  Perform the move of the residual byte.
1783 	 */
1784 	SCR_CHMOV_TBL ^ SCR_DATA_IN,
1785 		offsetof (struct sym_ccb, phys.wresid),
1786 	/*
1787 	 *  We can now handle the phase mismatch with UA fixed.
1788 	 *  RBC[0..23]=0 is a special case that does not require
1789 	 *  a PM context. The C code also checks against this.
1790 	 */
1791 	SCR_FROM_REG (rbc),
1792 		0,
1793 	SCR_RETURN ^ IFFALSE (DATA (0)),
1794 		0,
1795 	SCR_FROM_REG (rbc1),
1796 		0,
1797 	SCR_RETURN ^ IFFALSE (DATA (0)),
1798 		0,
1799 	SCR_FROM_REG (rbc2),
1800 		0,
1801 	SCR_RETURN ^ IFFALSE (DATA (0)),
1802 		0,
1803 	/*
1804 	 *  RBC[0..23]=0.
1805 	 *  Not only we donnot need a PM context, but this would
1806 	 *  lead to a bogus CHMOV(0). This condition means that
1807 	 *  the residual was the last byte to move from this CHMOV.
1808 	 *  So, we just have to move the current data script pointer
1809 	 *  (i.e. TEMP) to the SCRIPTS address following the
1810 	 *  interrupted CHMOV and jump to dispatcher.
1811 	 */
1812 	SCR_STORE_ABS (ia, 4),
1813 		PADDR_B (scratch),
1814 	SCR_LOAD_ABS (temp, 4),
1815 		PADDR_B (scratch),
1816 	SCR_JUMP,
1817 		PADDR_A (dispatch),
1818 }/*-------------------------< WSR_MA_HELPER >--------------------*/,{
1819 	/*
1820 	 *  Helper for the C code when WSR bit is set.
1821 	 *  Perform the move of the residual byte.
1822 	 */
1823 	SCR_CHMOV_TBL ^ SCR_DATA_IN,
1824 		offsetof (struct sym_ccb, phys.wresid),
1825 	SCR_JUMP,
1826 		PADDR_A (dispatch),
1827 }/*-------------------------< ZERO >-----------------------------*/,{
1828 	SCR_DATA_ZERO,
1829 }/*-------------------------< SCRATCH >--------------------------*/,{
1830 	SCR_DATA_ZERO,
1831 }/*-------------------------< PM0_DATA_ADDR >--------------------*/,{
1832 	SCR_DATA_ZERO,
1833 }/*-------------------------< PM1_DATA_ADDR >--------------------*/,{
1834 	SCR_DATA_ZERO,
1835 }/*-------------------------< SAVED_DSA >------------------------*/,{
1836 	SCR_DATA_ZERO,
1837 }/*-------------------------< SAVED_DRS >------------------------*/,{
1838 	SCR_DATA_ZERO,
1839 }/*-------------------------< DONE_POS >-------------------------*/,{
1840 	SCR_DATA_ZERO,
1841 }/*-------------------------< STARTPOS >-------------------------*/,{
1842 	SCR_DATA_ZERO,
1843 }/*-------------------------< TARGTBL >--------------------------*/,{
1844 	SCR_DATA_ZERO,
1845 
1846 }/*-------------------------< SNOOPTEST >------------------------*/,{
1847 	/*
1848 	 *  Read the variable from memory.
1849 	 */
1850 	SCR_LOAD_REL (scratcha, 4),
1851 		offsetof(struct sym_hcb, cache),
1852 	/*
1853 	 *  Write the variable to memory.
1854 	 */
1855 	SCR_STORE_REL (temp, 4),
1856 		offsetof(struct sym_hcb, cache),
1857 	/*
1858 	 *  Read back the variable from memory.
1859 	 */
1860 	SCR_LOAD_REL (temp, 4),
1861 		offsetof(struct sym_hcb, cache),
1862 }/*-------------------------< SNOOPEND >-------------------------*/,{
1863 	/*
1864 	 *  And stop.
1865 	 */
1866 	SCR_INT,
1867 		99,
1868 }/*-------------------------<>-----------------------------------*/
1869 };
1870