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