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