18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Device driver for the SYMBIOS/LSILOGIC 53C8XX and 53C1010 family
48c2ecf20Sopenharmony_ci * of PCI-SCSI IO processors.
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci * Copyright (C) 1999-2001  Gerard Roudier <groudier@free.fr>
78c2ecf20Sopenharmony_ci *
88c2ecf20Sopenharmony_ci * This driver is derived from the Linux sym53c8xx driver.
98c2ecf20Sopenharmony_ci * Copyright (C) 1998-2000  Gerard Roudier
108c2ecf20Sopenharmony_ci *
118c2ecf20Sopenharmony_ci * The sym53c8xx driver is derived from the ncr53c8xx driver that had been
128c2ecf20Sopenharmony_ci * a port of the FreeBSD ncr driver to Linux-1.2.13.
138c2ecf20Sopenharmony_ci *
148c2ecf20Sopenharmony_ci * The original ncr driver has been written for 386bsd and FreeBSD by
158c2ecf20Sopenharmony_ci *         Wolfgang Stanglmeier        <wolf@cologne.de>
168c2ecf20Sopenharmony_ci *         Stefan Esser                <se@mi.Uni-Koeln.de>
178c2ecf20Sopenharmony_ci * Copyright (C) 1994  Wolfgang Stanglmeier
188c2ecf20Sopenharmony_ci *
198c2ecf20Sopenharmony_ci * Other major contributions:
208c2ecf20Sopenharmony_ci *
218c2ecf20Sopenharmony_ci * NVRAM detection and reading.
228c2ecf20Sopenharmony_ci * Copyright (C) 1997 Richard Waltham <dormouse@farsrobt.demon.co.uk>
238c2ecf20Sopenharmony_ci *
248c2ecf20Sopenharmony_ci *-----------------------------------------------------------------------------
258c2ecf20Sopenharmony_ci */
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci/*
288c2ecf20Sopenharmony_ci *  Scripts for SYMBIOS-Processor
298c2ecf20Sopenharmony_ci *
308c2ecf20Sopenharmony_ci *  We have to know the offsets of all labels before we reach
318c2ecf20Sopenharmony_ci *  them (for forward jumps). Therefore we declare a struct
328c2ecf20Sopenharmony_ci *  here. If you make changes inside the script,
338c2ecf20Sopenharmony_ci *
348c2ecf20Sopenharmony_ci *  DONT FORGET TO CHANGE THE LENGTHS HERE!
358c2ecf20Sopenharmony_ci */
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci/*
388c2ecf20Sopenharmony_ci *  Script fragments which are loaded into the on-chip RAM
398c2ecf20Sopenharmony_ci *  of 825A, 875, 876, 895, 895A, 896 and 1010 chips.
408c2ecf20Sopenharmony_ci *  Must not exceed 4K bytes.
418c2ecf20Sopenharmony_ci */
428c2ecf20Sopenharmony_cistruct SYM_FWA_SCR {
438c2ecf20Sopenharmony_ci	u32 start		[ 11];
448c2ecf20Sopenharmony_ci	u32 getjob_begin	[  4];
458c2ecf20Sopenharmony_ci	u32 _sms_a10		[  5];
468c2ecf20Sopenharmony_ci	u32 getjob_end		[  4];
478c2ecf20Sopenharmony_ci	u32 _sms_a20		[  4];
488c2ecf20Sopenharmony_ci#ifdef SYM_CONF_TARGET_ROLE_SUPPORT
498c2ecf20Sopenharmony_ci	u32 select		[  8];
508c2ecf20Sopenharmony_ci#else
518c2ecf20Sopenharmony_ci	u32 select		[  6];
528c2ecf20Sopenharmony_ci#endif
538c2ecf20Sopenharmony_ci	u32 _sms_a30		[  5];
548c2ecf20Sopenharmony_ci	u32 wf_sel_done		[  2];
558c2ecf20Sopenharmony_ci	u32 send_ident		[  2];
568c2ecf20Sopenharmony_ci#ifdef SYM_CONF_IARB_SUPPORT
578c2ecf20Sopenharmony_ci	u32 select2		[  8];
588c2ecf20Sopenharmony_ci#else
598c2ecf20Sopenharmony_ci	u32 select2		[  2];
608c2ecf20Sopenharmony_ci#endif
618c2ecf20Sopenharmony_ci	u32 command		[  2];
628c2ecf20Sopenharmony_ci	u32 dispatch		[ 28];
638c2ecf20Sopenharmony_ci	u32 sel_no_cmd		[ 10];
648c2ecf20Sopenharmony_ci	u32 init		[  6];
658c2ecf20Sopenharmony_ci	u32 clrack		[  4];
668c2ecf20Sopenharmony_ci	u32 datai_done		[ 11];
678c2ecf20Sopenharmony_ci	u32 datai_done_wsr	[ 20];
688c2ecf20Sopenharmony_ci	u32 datao_done		[ 11];
698c2ecf20Sopenharmony_ci	u32 datao_done_wss	[  6];
708c2ecf20Sopenharmony_ci	u32 datai_phase		[  5];
718c2ecf20Sopenharmony_ci	u32 datao_phase		[  5];
728c2ecf20Sopenharmony_ci	u32 msg_in		[  2];
738c2ecf20Sopenharmony_ci	u32 msg_in2		[ 10];
748c2ecf20Sopenharmony_ci#ifdef SYM_CONF_IARB_SUPPORT
758c2ecf20Sopenharmony_ci	u32 status		[ 14];
768c2ecf20Sopenharmony_ci#else
778c2ecf20Sopenharmony_ci	u32 status		[ 10];
788c2ecf20Sopenharmony_ci#endif
798c2ecf20Sopenharmony_ci	u32 complete		[  6];
808c2ecf20Sopenharmony_ci	u32 complete2		[  8];
818c2ecf20Sopenharmony_ci	u32 _sms_a40		[ 12];
828c2ecf20Sopenharmony_ci	u32 done		[  5];
838c2ecf20Sopenharmony_ci	u32 _sms_a50		[  5];
848c2ecf20Sopenharmony_ci	u32 _sms_a60		[  2];
858c2ecf20Sopenharmony_ci	u32 done_end		[  4];
868c2ecf20Sopenharmony_ci	u32 complete_error	[  5];
878c2ecf20Sopenharmony_ci	u32 save_dp		[ 11];
888c2ecf20Sopenharmony_ci	u32 restore_dp		[  7];
898c2ecf20Sopenharmony_ci	u32 disconnect		[ 11];
908c2ecf20Sopenharmony_ci	u32 disconnect2		[  5];
918c2ecf20Sopenharmony_ci	u32 _sms_a65		[  3];
928c2ecf20Sopenharmony_ci#ifdef SYM_CONF_IARB_SUPPORT
938c2ecf20Sopenharmony_ci	u32 idle		[  4];
948c2ecf20Sopenharmony_ci#else
958c2ecf20Sopenharmony_ci	u32 idle		[  2];
968c2ecf20Sopenharmony_ci#endif
978c2ecf20Sopenharmony_ci#ifdef SYM_CONF_IARB_SUPPORT
988c2ecf20Sopenharmony_ci	u32 ungetjob		[  7];
998c2ecf20Sopenharmony_ci#else
1008c2ecf20Sopenharmony_ci	u32 ungetjob		[  5];
1018c2ecf20Sopenharmony_ci#endif
1028c2ecf20Sopenharmony_ci#ifdef SYM_CONF_TARGET_ROLE_SUPPORT
1038c2ecf20Sopenharmony_ci	u32 reselect		[  4];
1048c2ecf20Sopenharmony_ci#else
1058c2ecf20Sopenharmony_ci	u32 reselect		[  2];
1068c2ecf20Sopenharmony_ci#endif
1078c2ecf20Sopenharmony_ci	u32 reselected		[ 19];
1088c2ecf20Sopenharmony_ci	u32 _sms_a70		[  6];
1098c2ecf20Sopenharmony_ci	u32 _sms_a80		[  4];
1108c2ecf20Sopenharmony_ci	u32 reselected1		[ 25];
1118c2ecf20Sopenharmony_ci	u32 _sms_a90		[  4];
1128c2ecf20Sopenharmony_ci	u32 resel_lun0		[  7];
1138c2ecf20Sopenharmony_ci	u32 _sms_a100		[  4];
1148c2ecf20Sopenharmony_ci	u32 resel_tag		[  8];
1158c2ecf20Sopenharmony_ci#if   SYM_CONF_MAX_TASK*4 > 512
1168c2ecf20Sopenharmony_ci	u32 _sms_a110		[ 23];
1178c2ecf20Sopenharmony_ci#elif SYM_CONF_MAX_TASK*4 > 256
1188c2ecf20Sopenharmony_ci	u32 _sms_a110		[ 17];
1198c2ecf20Sopenharmony_ci#else
1208c2ecf20Sopenharmony_ci	u32 _sms_a110		[ 13];
1218c2ecf20Sopenharmony_ci#endif
1228c2ecf20Sopenharmony_ci	u32 _sms_a120		[  2];
1238c2ecf20Sopenharmony_ci	u32 resel_go		[  4];
1248c2ecf20Sopenharmony_ci	u32 _sms_a130		[  7];
1258c2ecf20Sopenharmony_ci	u32 resel_dsa		[  2];
1268c2ecf20Sopenharmony_ci	u32 resel_dsa1		[  4];
1278c2ecf20Sopenharmony_ci	u32 _sms_a140		[  7];
1288c2ecf20Sopenharmony_ci	u32 resel_no_tag	[  4];
1298c2ecf20Sopenharmony_ci	u32 _sms_a145		[  7];
1308c2ecf20Sopenharmony_ci	u32 data_in		[SYM_CONF_MAX_SG * 2];
1318c2ecf20Sopenharmony_ci	u32 data_in2		[  4];
1328c2ecf20Sopenharmony_ci	u32 data_out		[SYM_CONF_MAX_SG * 2];
1338c2ecf20Sopenharmony_ci	u32 data_out2		[  4];
1348c2ecf20Sopenharmony_ci	u32 pm0_data		[ 12];
1358c2ecf20Sopenharmony_ci	u32 pm0_data_out	[  6];
1368c2ecf20Sopenharmony_ci	u32 pm0_data_end	[  7];
1378c2ecf20Sopenharmony_ci	u32 pm_data_end		[  4];
1388c2ecf20Sopenharmony_ci	u32 _sms_a150		[  4];
1398c2ecf20Sopenharmony_ci	u32 pm1_data		[ 12];
1408c2ecf20Sopenharmony_ci	u32 pm1_data_out	[  6];
1418c2ecf20Sopenharmony_ci	u32 pm1_data_end	[  9];
1428c2ecf20Sopenharmony_ci};
1438c2ecf20Sopenharmony_ci
1448c2ecf20Sopenharmony_ci/*
1458c2ecf20Sopenharmony_ci *  Script fragments which stay in main memory for all chips
1468c2ecf20Sopenharmony_ci *  except for chips that support 8K on-chip RAM.
1478c2ecf20Sopenharmony_ci */
1488c2ecf20Sopenharmony_cistruct SYM_FWB_SCR {
1498c2ecf20Sopenharmony_ci	u32 no_data		[  2];
1508c2ecf20Sopenharmony_ci#ifdef SYM_CONF_TARGET_ROLE_SUPPORT
1518c2ecf20Sopenharmony_ci	u32 sel_for_abort	[ 18];
1528c2ecf20Sopenharmony_ci#else
1538c2ecf20Sopenharmony_ci	u32 sel_for_abort	[ 16];
1548c2ecf20Sopenharmony_ci#endif
1558c2ecf20Sopenharmony_ci	u32 sel_for_abort_1	[  2];
1568c2ecf20Sopenharmony_ci	u32 msg_in_etc		[ 12];
1578c2ecf20Sopenharmony_ci	u32 msg_received	[  5];
1588c2ecf20Sopenharmony_ci	u32 msg_weird_seen	[  5];
1598c2ecf20Sopenharmony_ci	u32 msg_extended	[ 17];
1608c2ecf20Sopenharmony_ci	u32 _sms_b10		[  4];
1618c2ecf20Sopenharmony_ci	u32 msg_bad		[  6];
1628c2ecf20Sopenharmony_ci	u32 msg_weird		[  4];
1638c2ecf20Sopenharmony_ci	u32 msg_weird1		[  8];
1648c2ecf20Sopenharmony_ci	u32 wdtr_resp		[  6];
1658c2ecf20Sopenharmony_ci	u32 send_wdtr		[  4];
1668c2ecf20Sopenharmony_ci	u32 sdtr_resp		[  6];
1678c2ecf20Sopenharmony_ci	u32 send_sdtr		[  4];
1688c2ecf20Sopenharmony_ci	u32 ppr_resp		[  6];
1698c2ecf20Sopenharmony_ci	u32 send_ppr		[  4];
1708c2ecf20Sopenharmony_ci	u32 nego_bad_phase	[  4];
1718c2ecf20Sopenharmony_ci	u32 msg_out		[  4];
1728c2ecf20Sopenharmony_ci	u32 msg_out_done	[  4];
1738c2ecf20Sopenharmony_ci	u32 data_ovrun		[  3];
1748c2ecf20Sopenharmony_ci	u32 data_ovrun1		[ 22];
1758c2ecf20Sopenharmony_ci	u32 data_ovrun2		[  8];
1768c2ecf20Sopenharmony_ci	u32 abort_resel		[ 16];
1778c2ecf20Sopenharmony_ci	u32 resend_ident	[  4];
1788c2ecf20Sopenharmony_ci	u32 ident_break		[  4];
1798c2ecf20Sopenharmony_ci	u32 ident_break_atn	[  4];
1808c2ecf20Sopenharmony_ci	u32 sdata_in		[  6];
1818c2ecf20Sopenharmony_ci	u32 resel_bad_lun	[  4];
1828c2ecf20Sopenharmony_ci	u32 bad_i_t_l		[  4];
1838c2ecf20Sopenharmony_ci	u32 bad_i_t_l_q		[  4];
1848c2ecf20Sopenharmony_ci	u32 bad_status		[  7];
1858c2ecf20Sopenharmony_ci	u32 wsr_ma_helper	[  4];
1868c2ecf20Sopenharmony_ci
1878c2ecf20Sopenharmony_ci	/* Data area */
1888c2ecf20Sopenharmony_ci	u32 zero		[  1];
1898c2ecf20Sopenharmony_ci	u32 scratch		[  1];
1908c2ecf20Sopenharmony_ci	u32 scratch1		[  1];
1918c2ecf20Sopenharmony_ci	u32 prev_done		[  1];
1928c2ecf20Sopenharmony_ci	u32 done_pos		[  1];
1938c2ecf20Sopenharmony_ci	u32 nextjob		[  1];
1948c2ecf20Sopenharmony_ci	u32 startpos		[  1];
1958c2ecf20Sopenharmony_ci	u32 targtbl		[  1];
1968c2ecf20Sopenharmony_ci};
1978c2ecf20Sopenharmony_ci
1988c2ecf20Sopenharmony_ci/*
1998c2ecf20Sopenharmony_ci *  Script fragments used at initialisations.
2008c2ecf20Sopenharmony_ci *  Only runs out of main memory.
2018c2ecf20Sopenharmony_ci */
2028c2ecf20Sopenharmony_cistruct SYM_FWZ_SCR {
2038c2ecf20Sopenharmony_ci	u32 snooptest		[  9];
2048c2ecf20Sopenharmony_ci	u32 snoopend		[  2];
2058c2ecf20Sopenharmony_ci};
2068c2ecf20Sopenharmony_ci
2078c2ecf20Sopenharmony_cistatic struct SYM_FWA_SCR SYM_FWA_SCR = {
2088c2ecf20Sopenharmony_ci/*--------------------------< START >----------------------------*/ {
2098c2ecf20Sopenharmony_ci	/*
2108c2ecf20Sopenharmony_ci	 *  Switch the LED on.
2118c2ecf20Sopenharmony_ci	 *  Will be patched with a NO_OP if LED
2128c2ecf20Sopenharmony_ci	 *  not needed or not desired.
2138c2ecf20Sopenharmony_ci	 */
2148c2ecf20Sopenharmony_ci	SCR_REG_REG (gpreg, SCR_AND, 0xfe),
2158c2ecf20Sopenharmony_ci		0,
2168c2ecf20Sopenharmony_ci	/*
2178c2ecf20Sopenharmony_ci	 *      Clear SIGP.
2188c2ecf20Sopenharmony_ci	 */
2198c2ecf20Sopenharmony_ci	SCR_FROM_REG (ctest2),
2208c2ecf20Sopenharmony_ci		0,
2218c2ecf20Sopenharmony_ci	/*
2228c2ecf20Sopenharmony_ci	 *  Stop here if the C code wants to perform
2238c2ecf20Sopenharmony_ci	 *  some error recovery procedure manually.
2248c2ecf20Sopenharmony_ci	 *  (Indicate this by setting SEM in ISTAT)
2258c2ecf20Sopenharmony_ci	 */
2268c2ecf20Sopenharmony_ci	SCR_FROM_REG (istat),
2278c2ecf20Sopenharmony_ci		0,
2288c2ecf20Sopenharmony_ci	/*
2298c2ecf20Sopenharmony_ci	 *  Report to the C code the next position in
2308c2ecf20Sopenharmony_ci	 *  the start queue the SCRIPTS will schedule.
2318c2ecf20Sopenharmony_ci	 *  The C code must not change SCRATCHA.
2328c2ecf20Sopenharmony_ci	 */
2338c2ecf20Sopenharmony_ci	SCR_COPY (4),
2348c2ecf20Sopenharmony_ci		PADDR_B (startpos),
2358c2ecf20Sopenharmony_ci		RADDR_1 (scratcha),
2368c2ecf20Sopenharmony_ci	SCR_INT ^ IFTRUE (MASK (SEM, SEM)),
2378c2ecf20Sopenharmony_ci		SIR_SCRIPT_STOPPED,
2388c2ecf20Sopenharmony_ci	/*
2398c2ecf20Sopenharmony_ci	 *  Start the next job.
2408c2ecf20Sopenharmony_ci	 *
2418c2ecf20Sopenharmony_ci	 *  @DSA     = start point for this job.
2428c2ecf20Sopenharmony_ci	 *  SCRATCHA = address of this job in the start queue.
2438c2ecf20Sopenharmony_ci	 *
2448c2ecf20Sopenharmony_ci	 *  We will restore startpos with SCRATCHA if we fails the
2458c2ecf20Sopenharmony_ci	 *  arbitration or if it is the idle job.
2468c2ecf20Sopenharmony_ci	 *
2478c2ecf20Sopenharmony_ci	 *  The below GETJOB_BEGIN to GETJOB_END section of SCRIPTS
2488c2ecf20Sopenharmony_ci	 *  is a critical path. If it is partially executed, it then
2498c2ecf20Sopenharmony_ci	 *  may happen that the job address is not yet in the DSA
2508c2ecf20Sopenharmony_ci	 *  and the next queue position points to the next JOB.
2518c2ecf20Sopenharmony_ci	 */
2528c2ecf20Sopenharmony_ci}/*-------------------------< GETJOB_BEGIN >---------------------*/,{
2538c2ecf20Sopenharmony_ci	/*
2548c2ecf20Sopenharmony_ci	 *  Copy to a fixed location both the next STARTPOS
2558c2ecf20Sopenharmony_ci	 *  and the current JOB address, using self modifying
2568c2ecf20Sopenharmony_ci	 *  SCRIPTS.
2578c2ecf20Sopenharmony_ci	 */
2588c2ecf20Sopenharmony_ci	SCR_COPY (4),
2598c2ecf20Sopenharmony_ci		RADDR_1 (scratcha),
2608c2ecf20Sopenharmony_ci		PADDR_A (_sms_a10),
2618c2ecf20Sopenharmony_ci	SCR_COPY (8),
2628c2ecf20Sopenharmony_ci}/*-------------------------< _SMS_A10 >-------------------------*/,{
2638c2ecf20Sopenharmony_ci		0,
2648c2ecf20Sopenharmony_ci		PADDR_B (nextjob),
2658c2ecf20Sopenharmony_ci	/*
2668c2ecf20Sopenharmony_ci	 *  Move the start address to TEMP using self-
2678c2ecf20Sopenharmony_ci	 *  modifying SCRIPTS and jump indirectly to
2688c2ecf20Sopenharmony_ci	 *  that address.
2698c2ecf20Sopenharmony_ci	 */
2708c2ecf20Sopenharmony_ci	SCR_COPY (4),
2718c2ecf20Sopenharmony_ci		PADDR_B (nextjob),
2728c2ecf20Sopenharmony_ci		RADDR_1 (dsa),
2738c2ecf20Sopenharmony_ci}/*-------------------------< GETJOB_END >-----------------------*/,{
2748c2ecf20Sopenharmony_ci	SCR_COPY (4),
2758c2ecf20Sopenharmony_ci		RADDR_1 (dsa),
2768c2ecf20Sopenharmony_ci		PADDR_A (_sms_a20),
2778c2ecf20Sopenharmony_ci	SCR_COPY (4),
2788c2ecf20Sopenharmony_ci}/*-------------------------< _SMS_A20 >-------------------------*/,{
2798c2ecf20Sopenharmony_ci		0,
2808c2ecf20Sopenharmony_ci		RADDR_1 (temp),
2818c2ecf20Sopenharmony_ci	SCR_RETURN,
2828c2ecf20Sopenharmony_ci		0,
2838c2ecf20Sopenharmony_ci}/*-------------------------< SELECT >---------------------------*/,{
2848c2ecf20Sopenharmony_ci	/*
2858c2ecf20Sopenharmony_ci	 *  DSA	contains the address of a scheduled
2868c2ecf20Sopenharmony_ci	 *  	data structure.
2878c2ecf20Sopenharmony_ci	 *
2888c2ecf20Sopenharmony_ci	 *  SCRATCHA contains the address of the start queue
2898c2ecf20Sopenharmony_ci	 *  	entry which points to the next job.
2908c2ecf20Sopenharmony_ci	 *
2918c2ecf20Sopenharmony_ci	 *  Set Initiator mode.
2928c2ecf20Sopenharmony_ci	 *
2938c2ecf20Sopenharmony_ci	 *  (Target mode is left as an exercise for the reader)
2948c2ecf20Sopenharmony_ci	 */
2958c2ecf20Sopenharmony_ci#ifdef SYM_CONF_TARGET_ROLE_SUPPORT
2968c2ecf20Sopenharmony_ci	SCR_CLR (SCR_TRG),
2978c2ecf20Sopenharmony_ci		0,
2988c2ecf20Sopenharmony_ci#endif
2998c2ecf20Sopenharmony_ci	/*
3008c2ecf20Sopenharmony_ci	 *      And try to select this target.
3018c2ecf20Sopenharmony_ci	 */
3028c2ecf20Sopenharmony_ci	SCR_SEL_TBL_ATN ^ offsetof (struct sym_dsb, select),
3038c2ecf20Sopenharmony_ci		PADDR_A (ungetjob),
3048c2ecf20Sopenharmony_ci	/*
3058c2ecf20Sopenharmony_ci	 *  Now there are 4 possibilities:
3068c2ecf20Sopenharmony_ci	 *
3078c2ecf20Sopenharmony_ci	 *  (1) The chip loses arbitration.
3088c2ecf20Sopenharmony_ci	 *  This is ok, because it will try again,
3098c2ecf20Sopenharmony_ci	 *  when the bus becomes idle.
3108c2ecf20Sopenharmony_ci	 *  (But beware of the timeout function!)
3118c2ecf20Sopenharmony_ci	 *
3128c2ecf20Sopenharmony_ci	 *  (2) The chip is reselected.
3138c2ecf20Sopenharmony_ci	 *  Then the script processor takes the jump
3148c2ecf20Sopenharmony_ci	 *  to the RESELECT label.
3158c2ecf20Sopenharmony_ci	 *
3168c2ecf20Sopenharmony_ci	 *  (3) The chip wins arbitration.
3178c2ecf20Sopenharmony_ci	 *  Then it will execute SCRIPTS instruction until
3188c2ecf20Sopenharmony_ci	 *  the next instruction that checks SCSI phase.
3198c2ecf20Sopenharmony_ci	 *  Then will stop and wait for selection to be
3208c2ecf20Sopenharmony_ci	 *  complete or selection time-out to occur.
3218c2ecf20Sopenharmony_ci	 *
3228c2ecf20Sopenharmony_ci	 *  After having won arbitration, the SCRIPTS
3238c2ecf20Sopenharmony_ci	 *  processor is able to execute instructions while
3248c2ecf20Sopenharmony_ci	 *  the SCSI core is performing SCSI selection.
3258c2ecf20Sopenharmony_ci	 */
3268c2ecf20Sopenharmony_ci
3278c2ecf20Sopenharmony_ci	/*
3288c2ecf20Sopenharmony_ci	 *  Copy the CCB header to a fixed location
3298c2ecf20Sopenharmony_ci	 *  in the HCB using self-modifying SCRIPTS.
3308c2ecf20Sopenharmony_ci	 */
3318c2ecf20Sopenharmony_ci	SCR_COPY (4),
3328c2ecf20Sopenharmony_ci		RADDR_1 (dsa),
3338c2ecf20Sopenharmony_ci		PADDR_A (_sms_a30),
3348c2ecf20Sopenharmony_ci	SCR_COPY (sizeof(struct sym_ccbh)),
3358c2ecf20Sopenharmony_ci}/*-------------------------< _SMS_A30 >-------------------------*/,{
3368c2ecf20Sopenharmony_ci		0,
3378c2ecf20Sopenharmony_ci		HADDR_1 (ccb_head),
3388c2ecf20Sopenharmony_ci	/*
3398c2ecf20Sopenharmony_ci	 *  Initialize the status register
3408c2ecf20Sopenharmony_ci	 */
3418c2ecf20Sopenharmony_ci	SCR_COPY (4),
3428c2ecf20Sopenharmony_ci		HADDR_1 (ccb_head.status),
3438c2ecf20Sopenharmony_ci		RADDR_1 (scr0),
3448c2ecf20Sopenharmony_ci}/*-------------------------< WF_SEL_DONE >----------------------*/,{
3458c2ecf20Sopenharmony_ci	SCR_INT ^ IFFALSE (WHEN (SCR_MSG_OUT)),
3468c2ecf20Sopenharmony_ci		SIR_SEL_ATN_NO_MSG_OUT,
3478c2ecf20Sopenharmony_ci}/*-------------------------< SEND_IDENT >-----------------------*/,{
3488c2ecf20Sopenharmony_ci	/*
3498c2ecf20Sopenharmony_ci	 *  Selection complete.
3508c2ecf20Sopenharmony_ci	 *  Send the IDENTIFY and possibly the TAG message
3518c2ecf20Sopenharmony_ci	 *  and negotiation message if present.
3528c2ecf20Sopenharmony_ci	 */
3538c2ecf20Sopenharmony_ci	SCR_MOVE_TBL ^ SCR_MSG_OUT,
3548c2ecf20Sopenharmony_ci		offsetof (struct sym_dsb, smsg),
3558c2ecf20Sopenharmony_ci}/*-------------------------< SELECT2 >--------------------------*/,{
3568c2ecf20Sopenharmony_ci#ifdef SYM_CONF_IARB_SUPPORT
3578c2ecf20Sopenharmony_ci	/*
3588c2ecf20Sopenharmony_ci	 *  Set IMMEDIATE ARBITRATION if we have been given
3598c2ecf20Sopenharmony_ci	 *  a hint to do so. (Some job to do after this one).
3608c2ecf20Sopenharmony_ci	 */
3618c2ecf20Sopenharmony_ci	SCR_FROM_REG (HF_REG),
3628c2ecf20Sopenharmony_ci		0,
3638c2ecf20Sopenharmony_ci	SCR_JUMPR ^ IFFALSE (MASK (HF_HINT_IARB, HF_HINT_IARB)),
3648c2ecf20Sopenharmony_ci		8,
3658c2ecf20Sopenharmony_ci	SCR_REG_REG (scntl1, SCR_OR, IARB),
3668c2ecf20Sopenharmony_ci		0,
3678c2ecf20Sopenharmony_ci#endif
3688c2ecf20Sopenharmony_ci	/*
3698c2ecf20Sopenharmony_ci	 *  Anticipate the COMMAND phase.
3708c2ecf20Sopenharmony_ci	 *  This is the PHASE we expect at this point.
3718c2ecf20Sopenharmony_ci	 */
3728c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFFALSE (WHEN (SCR_COMMAND)),
3738c2ecf20Sopenharmony_ci		PADDR_A (sel_no_cmd),
3748c2ecf20Sopenharmony_ci}/*-------------------------< COMMAND >--------------------------*/,{
3758c2ecf20Sopenharmony_ci	/*
3768c2ecf20Sopenharmony_ci	 *  ... and send the command
3778c2ecf20Sopenharmony_ci	 */
3788c2ecf20Sopenharmony_ci	SCR_MOVE_TBL ^ SCR_COMMAND,
3798c2ecf20Sopenharmony_ci		offsetof (struct sym_dsb, cmd),
3808c2ecf20Sopenharmony_ci}/*-------------------------< DISPATCH >-------------------------*/,{
3818c2ecf20Sopenharmony_ci	/*
3828c2ecf20Sopenharmony_ci	 *  MSG_IN is the only phase that shall be
3838c2ecf20Sopenharmony_ci	 *  entered at least once for each (re)selection.
3848c2ecf20Sopenharmony_ci	 *  So we test it first.
3858c2ecf20Sopenharmony_ci	 */
3868c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFTRUE (WHEN (SCR_MSG_IN)),
3878c2ecf20Sopenharmony_ci		PADDR_A (msg_in),
3888c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFTRUE (IF (SCR_DATA_OUT)),
3898c2ecf20Sopenharmony_ci		PADDR_A (datao_phase),
3908c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFTRUE (IF (SCR_DATA_IN)),
3918c2ecf20Sopenharmony_ci		PADDR_A (datai_phase),
3928c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFTRUE (IF (SCR_STATUS)),
3938c2ecf20Sopenharmony_ci		PADDR_A (status),
3948c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFTRUE (IF (SCR_COMMAND)),
3958c2ecf20Sopenharmony_ci		PADDR_A (command),
3968c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFTRUE (IF (SCR_MSG_OUT)),
3978c2ecf20Sopenharmony_ci		PADDR_B (msg_out),
3988c2ecf20Sopenharmony_ci	/*
3998c2ecf20Sopenharmony_ci	 *  Discard as many illegal phases as
4008c2ecf20Sopenharmony_ci	 *  required and tell the C code about.
4018c2ecf20Sopenharmony_ci	 */
4028c2ecf20Sopenharmony_ci	SCR_JUMPR ^ IFFALSE (WHEN (SCR_ILG_OUT)),
4038c2ecf20Sopenharmony_ci		16,
4048c2ecf20Sopenharmony_ci	SCR_MOVE_ABS (1) ^ SCR_ILG_OUT,
4058c2ecf20Sopenharmony_ci		HADDR_1 (scratch),
4068c2ecf20Sopenharmony_ci	SCR_JUMPR ^ IFTRUE (WHEN (SCR_ILG_OUT)),
4078c2ecf20Sopenharmony_ci		-16,
4088c2ecf20Sopenharmony_ci	SCR_JUMPR ^ IFFALSE (WHEN (SCR_ILG_IN)),
4098c2ecf20Sopenharmony_ci		16,
4108c2ecf20Sopenharmony_ci	SCR_MOVE_ABS (1) ^ SCR_ILG_IN,
4118c2ecf20Sopenharmony_ci		HADDR_1 (scratch),
4128c2ecf20Sopenharmony_ci	SCR_JUMPR ^ IFTRUE (WHEN (SCR_ILG_IN)),
4138c2ecf20Sopenharmony_ci		-16,
4148c2ecf20Sopenharmony_ci	SCR_INT,
4158c2ecf20Sopenharmony_ci		SIR_BAD_PHASE,
4168c2ecf20Sopenharmony_ci	SCR_JUMP,
4178c2ecf20Sopenharmony_ci		PADDR_A (dispatch),
4188c2ecf20Sopenharmony_ci}/*-------------------------< SEL_NO_CMD >-----------------------*/,{
4198c2ecf20Sopenharmony_ci	/*
4208c2ecf20Sopenharmony_ci	 *  The target does not switch to command
4218c2ecf20Sopenharmony_ci	 *  phase after IDENTIFY has been sent.
4228c2ecf20Sopenharmony_ci	 *
4238c2ecf20Sopenharmony_ci	 *  If it stays in MSG OUT phase send it
4248c2ecf20Sopenharmony_ci	 *  the IDENTIFY again.
4258c2ecf20Sopenharmony_ci	 */
4268c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFTRUE (WHEN (SCR_MSG_OUT)),
4278c2ecf20Sopenharmony_ci		PADDR_B (resend_ident),
4288c2ecf20Sopenharmony_ci	/*
4298c2ecf20Sopenharmony_ci	 *  If target does not switch to MSG IN phase
4308c2ecf20Sopenharmony_ci	 *  and we sent a negotiation, assert the
4318c2ecf20Sopenharmony_ci	 *  failure immediately.
4328c2ecf20Sopenharmony_ci	 */
4338c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFTRUE (WHEN (SCR_MSG_IN)),
4348c2ecf20Sopenharmony_ci		PADDR_A (dispatch),
4358c2ecf20Sopenharmony_ci	SCR_FROM_REG (HS_REG),
4368c2ecf20Sopenharmony_ci		0,
4378c2ecf20Sopenharmony_ci	SCR_INT ^ IFTRUE (DATA (HS_NEGOTIATE)),
4388c2ecf20Sopenharmony_ci		SIR_NEGO_FAILED,
4398c2ecf20Sopenharmony_ci	/*
4408c2ecf20Sopenharmony_ci	 *  Jump to dispatcher.
4418c2ecf20Sopenharmony_ci	 */
4428c2ecf20Sopenharmony_ci	SCR_JUMP,
4438c2ecf20Sopenharmony_ci		PADDR_A (dispatch),
4448c2ecf20Sopenharmony_ci}/*-------------------------< INIT >-----------------------------*/,{
4458c2ecf20Sopenharmony_ci	/*
4468c2ecf20Sopenharmony_ci	 *  Wait for the SCSI RESET signal to be
4478c2ecf20Sopenharmony_ci	 *  inactive before restarting operations,
4488c2ecf20Sopenharmony_ci	 *  since the chip may hang on SEL_ATN
4498c2ecf20Sopenharmony_ci	 *  if SCSI RESET is active.
4508c2ecf20Sopenharmony_ci	 */
4518c2ecf20Sopenharmony_ci	SCR_FROM_REG (sstat0),
4528c2ecf20Sopenharmony_ci		0,
4538c2ecf20Sopenharmony_ci	SCR_JUMPR ^ IFTRUE (MASK (IRST, IRST)),
4548c2ecf20Sopenharmony_ci		-16,
4558c2ecf20Sopenharmony_ci	SCR_JUMP,
4568c2ecf20Sopenharmony_ci		PADDR_A (start),
4578c2ecf20Sopenharmony_ci}/*-------------------------< CLRACK >---------------------------*/,{
4588c2ecf20Sopenharmony_ci	/*
4598c2ecf20Sopenharmony_ci	 *  Terminate possible pending message phase.
4608c2ecf20Sopenharmony_ci	 */
4618c2ecf20Sopenharmony_ci	SCR_CLR (SCR_ACK),
4628c2ecf20Sopenharmony_ci		0,
4638c2ecf20Sopenharmony_ci	SCR_JUMP,
4648c2ecf20Sopenharmony_ci		PADDR_A (dispatch),
4658c2ecf20Sopenharmony_ci}/*-------------------------< DATAI_DONE >-----------------------*/,{
4668c2ecf20Sopenharmony_ci	/*
4678c2ecf20Sopenharmony_ci	 *  Save current pointer to LASTP.
4688c2ecf20Sopenharmony_ci	 */
4698c2ecf20Sopenharmony_ci	SCR_COPY (4),
4708c2ecf20Sopenharmony_ci		RADDR_1 (temp),
4718c2ecf20Sopenharmony_ci		HADDR_1 (ccb_head.lastp),
4728c2ecf20Sopenharmony_ci	/*
4738c2ecf20Sopenharmony_ci	 *  If the SWIDE is not full, jump to dispatcher.
4748c2ecf20Sopenharmony_ci	 *  We anticipate a STATUS phase.
4758c2ecf20Sopenharmony_ci	 */
4768c2ecf20Sopenharmony_ci	SCR_FROM_REG (scntl2),
4778c2ecf20Sopenharmony_ci		0,
4788c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFTRUE (MASK (WSR, WSR)),
4798c2ecf20Sopenharmony_ci		PADDR_A (datai_done_wsr),
4808c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFTRUE (WHEN (SCR_STATUS)),
4818c2ecf20Sopenharmony_ci		PADDR_A (status),
4828c2ecf20Sopenharmony_ci	SCR_JUMP,
4838c2ecf20Sopenharmony_ci		PADDR_A (dispatch),
4848c2ecf20Sopenharmony_ci}/*-------------------------< DATAI_DONE_WSR >-------------------*/,{
4858c2ecf20Sopenharmony_ci	/*
4868c2ecf20Sopenharmony_ci	 *  The SWIDE is full.
4878c2ecf20Sopenharmony_ci	 *  Clear this condition.
4888c2ecf20Sopenharmony_ci	 */
4898c2ecf20Sopenharmony_ci	SCR_REG_REG (scntl2, SCR_OR, WSR),
4908c2ecf20Sopenharmony_ci		0,
4918c2ecf20Sopenharmony_ci	/*
4928c2ecf20Sopenharmony_ci	 *  We are expecting an IGNORE RESIDUE message
4938c2ecf20Sopenharmony_ci	 *  from the device, otherwise we are in data
4948c2ecf20Sopenharmony_ci	 *  overrun condition. Check against MSG_IN phase.
4958c2ecf20Sopenharmony_ci	 */
4968c2ecf20Sopenharmony_ci	SCR_INT ^ IFFALSE (WHEN (SCR_MSG_IN)),
4978c2ecf20Sopenharmony_ci		SIR_SWIDE_OVERRUN,
4988c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_IN)),
4998c2ecf20Sopenharmony_ci		PADDR_A (dispatch),
5008c2ecf20Sopenharmony_ci	/*
5018c2ecf20Sopenharmony_ci	 *  We are in MSG_IN phase,
5028c2ecf20Sopenharmony_ci	 *  Read the first byte of the message.
5038c2ecf20Sopenharmony_ci	 *  If it is not an IGNORE RESIDUE message,
5048c2ecf20Sopenharmony_ci	 *  signal overrun and jump to message
5058c2ecf20Sopenharmony_ci	 *  processing.
5068c2ecf20Sopenharmony_ci	 */
5078c2ecf20Sopenharmony_ci	SCR_MOVE_ABS (1) ^ SCR_MSG_IN,
5088c2ecf20Sopenharmony_ci		HADDR_1 (msgin[0]),
5098c2ecf20Sopenharmony_ci	SCR_INT ^ IFFALSE (DATA (M_IGN_RESIDUE)),
5108c2ecf20Sopenharmony_ci		SIR_SWIDE_OVERRUN,
5118c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFFALSE (DATA (M_IGN_RESIDUE)),
5128c2ecf20Sopenharmony_ci		PADDR_A (msg_in2),
5138c2ecf20Sopenharmony_ci	/*
5148c2ecf20Sopenharmony_ci	 *  We got the message we expected.
5158c2ecf20Sopenharmony_ci	 *  Read the 2nd byte, and jump to dispatcher.
5168c2ecf20Sopenharmony_ci	 */
5178c2ecf20Sopenharmony_ci	SCR_CLR (SCR_ACK),
5188c2ecf20Sopenharmony_ci		0,
5198c2ecf20Sopenharmony_ci	SCR_MOVE_ABS (1) ^ SCR_MSG_IN,
5208c2ecf20Sopenharmony_ci		HADDR_1 (msgin[1]),
5218c2ecf20Sopenharmony_ci	SCR_CLR (SCR_ACK),
5228c2ecf20Sopenharmony_ci		0,
5238c2ecf20Sopenharmony_ci	SCR_JUMP,
5248c2ecf20Sopenharmony_ci		PADDR_A (dispatch),
5258c2ecf20Sopenharmony_ci}/*-------------------------< DATAO_DONE >-----------------------*/,{
5268c2ecf20Sopenharmony_ci	/*
5278c2ecf20Sopenharmony_ci	 *  Save current pointer to LASTP.
5288c2ecf20Sopenharmony_ci	 */
5298c2ecf20Sopenharmony_ci	SCR_COPY (4),
5308c2ecf20Sopenharmony_ci		RADDR_1 (temp),
5318c2ecf20Sopenharmony_ci		HADDR_1 (ccb_head.lastp),
5328c2ecf20Sopenharmony_ci	/*
5338c2ecf20Sopenharmony_ci	 *  If the SODL is not full jump to dispatcher.
5348c2ecf20Sopenharmony_ci	 *  We anticipate a STATUS phase.
5358c2ecf20Sopenharmony_ci	 */
5368c2ecf20Sopenharmony_ci	SCR_FROM_REG (scntl2),
5378c2ecf20Sopenharmony_ci		0,
5388c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFTRUE (MASK (WSS, WSS)),
5398c2ecf20Sopenharmony_ci		PADDR_A (datao_done_wss),
5408c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFTRUE (WHEN (SCR_STATUS)),
5418c2ecf20Sopenharmony_ci		PADDR_A (status),
5428c2ecf20Sopenharmony_ci	SCR_JUMP,
5438c2ecf20Sopenharmony_ci		PADDR_A (dispatch),
5448c2ecf20Sopenharmony_ci}/*-------------------------< DATAO_DONE_WSS >-------------------*/,{
5458c2ecf20Sopenharmony_ci	/*
5468c2ecf20Sopenharmony_ci	 *  The SODL is full, clear this condition.
5478c2ecf20Sopenharmony_ci	 */
5488c2ecf20Sopenharmony_ci	SCR_REG_REG (scntl2, SCR_OR, WSS),
5498c2ecf20Sopenharmony_ci		0,
5508c2ecf20Sopenharmony_ci	/*
5518c2ecf20Sopenharmony_ci	 *  And signal a DATA UNDERRUN condition
5528c2ecf20Sopenharmony_ci	 *  to the C code.
5538c2ecf20Sopenharmony_ci	 */
5548c2ecf20Sopenharmony_ci	SCR_INT,
5558c2ecf20Sopenharmony_ci		SIR_SODL_UNDERRUN,
5568c2ecf20Sopenharmony_ci	SCR_JUMP,
5578c2ecf20Sopenharmony_ci		PADDR_A (dispatch),
5588c2ecf20Sopenharmony_ci}/*-------------------------< DATAI_PHASE >----------------------*/,{
5598c2ecf20Sopenharmony_ci	/*
5608c2ecf20Sopenharmony_ci	 *  Jump to current pointer.
5618c2ecf20Sopenharmony_ci	 */
5628c2ecf20Sopenharmony_ci	SCR_COPY (4),
5638c2ecf20Sopenharmony_ci		HADDR_1 (ccb_head.lastp),
5648c2ecf20Sopenharmony_ci		RADDR_1 (temp),
5658c2ecf20Sopenharmony_ci	SCR_RETURN,
5668c2ecf20Sopenharmony_ci		0,
5678c2ecf20Sopenharmony_ci}/*-------------------------< DATAO_PHASE >----------------------*/,{
5688c2ecf20Sopenharmony_ci	/*
5698c2ecf20Sopenharmony_ci	 *  Jump to current pointer.
5708c2ecf20Sopenharmony_ci	 */
5718c2ecf20Sopenharmony_ci	SCR_COPY (4),
5728c2ecf20Sopenharmony_ci		HADDR_1 (ccb_head.lastp),
5738c2ecf20Sopenharmony_ci		RADDR_1 (temp),
5748c2ecf20Sopenharmony_ci	SCR_RETURN,
5758c2ecf20Sopenharmony_ci		0,
5768c2ecf20Sopenharmony_ci}/*-------------------------< MSG_IN >---------------------------*/,{
5778c2ecf20Sopenharmony_ci	/*
5788c2ecf20Sopenharmony_ci	 *  Get the first byte of the message.
5798c2ecf20Sopenharmony_ci	 *
5808c2ecf20Sopenharmony_ci	 *  The script processor doesn't negate the
5818c2ecf20Sopenharmony_ci	 *  ACK signal after this transfer.
5828c2ecf20Sopenharmony_ci	 */
5838c2ecf20Sopenharmony_ci	SCR_MOVE_ABS (1) ^ SCR_MSG_IN,
5848c2ecf20Sopenharmony_ci		HADDR_1 (msgin[0]),
5858c2ecf20Sopenharmony_ci}/*-------------------------< MSG_IN2 >--------------------------*/,{
5868c2ecf20Sopenharmony_ci	/*
5878c2ecf20Sopenharmony_ci	 *  Check first against 1 byte messages
5888c2ecf20Sopenharmony_ci	 *  that we handle from SCRIPTS.
5898c2ecf20Sopenharmony_ci	 */
5908c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFTRUE (DATA (M_COMPLETE)),
5918c2ecf20Sopenharmony_ci		PADDR_A (complete),
5928c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFTRUE (DATA (M_DISCONNECT)),
5938c2ecf20Sopenharmony_ci		PADDR_A (disconnect),
5948c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFTRUE (DATA (M_SAVE_DP)),
5958c2ecf20Sopenharmony_ci		PADDR_A (save_dp),
5968c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFTRUE (DATA (M_RESTORE_DP)),
5978c2ecf20Sopenharmony_ci		PADDR_A (restore_dp),
5988c2ecf20Sopenharmony_ci	/*
5998c2ecf20Sopenharmony_ci	 *  We handle all other messages from the
6008c2ecf20Sopenharmony_ci	 *  C code, so no need to waste on-chip RAM
6018c2ecf20Sopenharmony_ci	 *  for those ones.
6028c2ecf20Sopenharmony_ci	 */
6038c2ecf20Sopenharmony_ci	SCR_JUMP,
6048c2ecf20Sopenharmony_ci		PADDR_B (msg_in_etc),
6058c2ecf20Sopenharmony_ci}/*-------------------------< STATUS >---------------------------*/,{
6068c2ecf20Sopenharmony_ci	/*
6078c2ecf20Sopenharmony_ci	 *  get the status
6088c2ecf20Sopenharmony_ci	 */
6098c2ecf20Sopenharmony_ci	SCR_MOVE_ABS (1) ^ SCR_STATUS,
6108c2ecf20Sopenharmony_ci		HADDR_1 (scratch),
6118c2ecf20Sopenharmony_ci#ifdef SYM_CONF_IARB_SUPPORT
6128c2ecf20Sopenharmony_ci	/*
6138c2ecf20Sopenharmony_ci	 *  If STATUS is not GOOD, clear IMMEDIATE ARBITRATION,
6148c2ecf20Sopenharmony_ci	 *  since we may have to tamper the start queue from
6158c2ecf20Sopenharmony_ci	 *  the C code.
6168c2ecf20Sopenharmony_ci	 */
6178c2ecf20Sopenharmony_ci	SCR_JUMPR ^ IFTRUE (DATA (S_GOOD)),
6188c2ecf20Sopenharmony_ci		8,
6198c2ecf20Sopenharmony_ci	SCR_REG_REG (scntl1, SCR_AND, ~IARB),
6208c2ecf20Sopenharmony_ci		0,
6218c2ecf20Sopenharmony_ci#endif
6228c2ecf20Sopenharmony_ci	/*
6238c2ecf20Sopenharmony_ci	 *  save status to scsi_status.
6248c2ecf20Sopenharmony_ci	 *  mark as complete.
6258c2ecf20Sopenharmony_ci	 */
6268c2ecf20Sopenharmony_ci	SCR_TO_REG (SS_REG),
6278c2ecf20Sopenharmony_ci		0,
6288c2ecf20Sopenharmony_ci	SCR_LOAD_REG (HS_REG, HS_COMPLETE),
6298c2ecf20Sopenharmony_ci		0,
6308c2ecf20Sopenharmony_ci	/*
6318c2ecf20Sopenharmony_ci	 *  Anticipate the MESSAGE PHASE for
6328c2ecf20Sopenharmony_ci	 *  the TASK COMPLETE message.
6338c2ecf20Sopenharmony_ci	 */
6348c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFTRUE (WHEN (SCR_MSG_IN)),
6358c2ecf20Sopenharmony_ci		PADDR_A (msg_in),
6368c2ecf20Sopenharmony_ci	SCR_JUMP,
6378c2ecf20Sopenharmony_ci		PADDR_A (dispatch),
6388c2ecf20Sopenharmony_ci}/*-------------------------< COMPLETE >-------------------------*/,{
6398c2ecf20Sopenharmony_ci	/*
6408c2ecf20Sopenharmony_ci	 *  Complete message.
6418c2ecf20Sopenharmony_ci	 *
6428c2ecf20Sopenharmony_ci	 *  When we terminate the cycle by clearing ACK,
6438c2ecf20Sopenharmony_ci	 *  the target may disconnect immediately.
6448c2ecf20Sopenharmony_ci	 *
6458c2ecf20Sopenharmony_ci	 *  We don't want to be told of an "unexpected disconnect",
6468c2ecf20Sopenharmony_ci	 *  so we disable this feature.
6478c2ecf20Sopenharmony_ci	 */
6488c2ecf20Sopenharmony_ci	SCR_REG_REG (scntl2, SCR_AND, 0x7f),
6498c2ecf20Sopenharmony_ci		0,
6508c2ecf20Sopenharmony_ci	/*
6518c2ecf20Sopenharmony_ci	 *  Terminate cycle ...
6528c2ecf20Sopenharmony_ci	 */
6538c2ecf20Sopenharmony_ci	SCR_CLR (SCR_ACK|SCR_ATN),
6548c2ecf20Sopenharmony_ci		0,
6558c2ecf20Sopenharmony_ci	/*
6568c2ecf20Sopenharmony_ci	 *  ... and wait for the disconnect.
6578c2ecf20Sopenharmony_ci	 */
6588c2ecf20Sopenharmony_ci	SCR_WAIT_DISC,
6598c2ecf20Sopenharmony_ci		0,
6608c2ecf20Sopenharmony_ci}/*-------------------------< COMPLETE2 >------------------------*/,{
6618c2ecf20Sopenharmony_ci	/*
6628c2ecf20Sopenharmony_ci	 *  Save host status.
6638c2ecf20Sopenharmony_ci	 */
6648c2ecf20Sopenharmony_ci	SCR_COPY (4),
6658c2ecf20Sopenharmony_ci		RADDR_1 (scr0),
6668c2ecf20Sopenharmony_ci		HADDR_1 (ccb_head.status),
6678c2ecf20Sopenharmony_ci	/*
6688c2ecf20Sopenharmony_ci	 *  Move back the CCB header using self-modifying
6698c2ecf20Sopenharmony_ci	 *  SCRIPTS.
6708c2ecf20Sopenharmony_ci	 */
6718c2ecf20Sopenharmony_ci	SCR_COPY (4),
6728c2ecf20Sopenharmony_ci		RADDR_1 (dsa),
6738c2ecf20Sopenharmony_ci		PADDR_A (_sms_a40),
6748c2ecf20Sopenharmony_ci	SCR_COPY (sizeof(struct sym_ccbh)),
6758c2ecf20Sopenharmony_ci		HADDR_1 (ccb_head),
6768c2ecf20Sopenharmony_ci}/*-------------------------< _SMS_A40 >-------------------------*/,{
6778c2ecf20Sopenharmony_ci		0,
6788c2ecf20Sopenharmony_ci	/*
6798c2ecf20Sopenharmony_ci	 *  Some bridges may reorder DMA writes to memory.
6808c2ecf20Sopenharmony_ci	 *  We donnot want the CPU to deal with completions
6818c2ecf20Sopenharmony_ci	 *  without all the posted write having been flushed
6828c2ecf20Sopenharmony_ci	 *  to memory. This DUMMY READ should flush posted
6838c2ecf20Sopenharmony_ci	 *  buffers prior to the CPU having to deal with
6848c2ecf20Sopenharmony_ci	 *  completions.
6858c2ecf20Sopenharmony_ci	 */
6868c2ecf20Sopenharmony_ci	SCR_COPY (4),			/* DUMMY READ */
6878c2ecf20Sopenharmony_ci		HADDR_1 (ccb_head.status),
6888c2ecf20Sopenharmony_ci		RADDR_1 (scr0),
6898c2ecf20Sopenharmony_ci	/*
6908c2ecf20Sopenharmony_ci	 *  If command resulted in not GOOD status,
6918c2ecf20Sopenharmony_ci	 *  call the C code if needed.
6928c2ecf20Sopenharmony_ci	 */
6938c2ecf20Sopenharmony_ci	SCR_FROM_REG (SS_REG),
6948c2ecf20Sopenharmony_ci		0,
6958c2ecf20Sopenharmony_ci	SCR_CALL ^ IFFALSE (DATA (S_GOOD)),
6968c2ecf20Sopenharmony_ci		PADDR_B (bad_status),
6978c2ecf20Sopenharmony_ci	/*
6988c2ecf20Sopenharmony_ci	 *  If we performed an auto-sense, call
6998c2ecf20Sopenharmony_ci	 *  the C code to synchronyze task aborts
7008c2ecf20Sopenharmony_ci	 *  with UNIT ATTENTION conditions.
7018c2ecf20Sopenharmony_ci	 */
7028c2ecf20Sopenharmony_ci	SCR_FROM_REG (HF_REG),
7038c2ecf20Sopenharmony_ci		0,
7048c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFFALSE (MASK (0 ,(HF_SENSE|HF_EXT_ERR))),
7058c2ecf20Sopenharmony_ci		PADDR_A (complete_error),
7068c2ecf20Sopenharmony_ci}/*-------------------------< DONE >-----------------------------*/,{
7078c2ecf20Sopenharmony_ci	/*
7088c2ecf20Sopenharmony_ci	 *  Copy the DSA to the DONE QUEUE and
7098c2ecf20Sopenharmony_ci	 *  signal completion to the host.
7108c2ecf20Sopenharmony_ci	 *  If we are interrupted between DONE
7118c2ecf20Sopenharmony_ci	 *  and DONE_END, we must reset, otherwise
7128c2ecf20Sopenharmony_ci	 *  the completed CCB may be lost.
7138c2ecf20Sopenharmony_ci	 */
7148c2ecf20Sopenharmony_ci	SCR_COPY (4),
7158c2ecf20Sopenharmony_ci		PADDR_B (done_pos),
7168c2ecf20Sopenharmony_ci		PADDR_A (_sms_a50),
7178c2ecf20Sopenharmony_ci	SCR_COPY (4),
7188c2ecf20Sopenharmony_ci		RADDR_1 (dsa),
7198c2ecf20Sopenharmony_ci}/*-------------------------< _SMS_A50 >-------------------------*/,{
7208c2ecf20Sopenharmony_ci		0,
7218c2ecf20Sopenharmony_ci	SCR_COPY (4),
7228c2ecf20Sopenharmony_ci		PADDR_B (done_pos),
7238c2ecf20Sopenharmony_ci		PADDR_A (_sms_a60),
7248c2ecf20Sopenharmony_ci	/*
7258c2ecf20Sopenharmony_ci	 *  The instruction below reads the DONE QUEUE next
7268c2ecf20Sopenharmony_ci	 *  free position from memory.
7278c2ecf20Sopenharmony_ci	 *  In addition it ensures that all PCI posted writes
7288c2ecf20Sopenharmony_ci	 *  are flushed and so the DSA value of the done
7298c2ecf20Sopenharmony_ci	 *  CCB is visible by the CPU before INTFLY is raised.
7308c2ecf20Sopenharmony_ci	 */
7318c2ecf20Sopenharmony_ci	SCR_COPY (8),
7328c2ecf20Sopenharmony_ci}/*-------------------------< _SMS_A60 >-------------------------*/,{
7338c2ecf20Sopenharmony_ci		0,
7348c2ecf20Sopenharmony_ci		PADDR_B (prev_done),
7358c2ecf20Sopenharmony_ci}/*-------------------------< DONE_END >-------------------------*/,{
7368c2ecf20Sopenharmony_ci	SCR_INT_FLY,
7378c2ecf20Sopenharmony_ci		0,
7388c2ecf20Sopenharmony_ci	SCR_JUMP,
7398c2ecf20Sopenharmony_ci		PADDR_A (start),
7408c2ecf20Sopenharmony_ci}/*-------------------------< COMPLETE_ERROR >-------------------*/,{
7418c2ecf20Sopenharmony_ci	SCR_COPY (4),
7428c2ecf20Sopenharmony_ci		PADDR_B (startpos),
7438c2ecf20Sopenharmony_ci		RADDR_1 (scratcha),
7448c2ecf20Sopenharmony_ci	SCR_INT,
7458c2ecf20Sopenharmony_ci		SIR_COMPLETE_ERROR,
7468c2ecf20Sopenharmony_ci}/*-------------------------< SAVE_DP >--------------------------*/,{
7478c2ecf20Sopenharmony_ci	/*
7488c2ecf20Sopenharmony_ci	 *  Clear ACK immediately.
7498c2ecf20Sopenharmony_ci	 *  No need to delay it.
7508c2ecf20Sopenharmony_ci	 */
7518c2ecf20Sopenharmony_ci	SCR_CLR (SCR_ACK),
7528c2ecf20Sopenharmony_ci		0,
7538c2ecf20Sopenharmony_ci	/*
7548c2ecf20Sopenharmony_ci	 *  Keep track we received a SAVE DP, so
7558c2ecf20Sopenharmony_ci	 *  we will switch to the other PM context
7568c2ecf20Sopenharmony_ci	 *  on the next PM since the DP may point
7578c2ecf20Sopenharmony_ci	 *  to the current PM context.
7588c2ecf20Sopenharmony_ci	 */
7598c2ecf20Sopenharmony_ci	SCR_REG_REG (HF_REG, SCR_OR, HF_DP_SAVED),
7608c2ecf20Sopenharmony_ci		0,
7618c2ecf20Sopenharmony_ci	/*
7628c2ecf20Sopenharmony_ci	 *  SAVE_DP message:
7638c2ecf20Sopenharmony_ci	 *  Copy LASTP to SAVEP.
7648c2ecf20Sopenharmony_ci	 */
7658c2ecf20Sopenharmony_ci	SCR_COPY (4),
7668c2ecf20Sopenharmony_ci		HADDR_1 (ccb_head.lastp),
7678c2ecf20Sopenharmony_ci		HADDR_1 (ccb_head.savep),
7688c2ecf20Sopenharmony_ci	/*
7698c2ecf20Sopenharmony_ci	 *  Anticipate the MESSAGE PHASE for
7708c2ecf20Sopenharmony_ci	 *  the DISCONNECT message.
7718c2ecf20Sopenharmony_ci	 */
7728c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFTRUE (WHEN (SCR_MSG_IN)),
7738c2ecf20Sopenharmony_ci		PADDR_A (msg_in),
7748c2ecf20Sopenharmony_ci	SCR_JUMP,
7758c2ecf20Sopenharmony_ci		PADDR_A (dispatch),
7768c2ecf20Sopenharmony_ci}/*-------------------------< RESTORE_DP >-----------------------*/,{
7778c2ecf20Sopenharmony_ci	/*
7788c2ecf20Sopenharmony_ci	 *  Clear ACK immediately.
7798c2ecf20Sopenharmony_ci	 *  No need to delay it.
7808c2ecf20Sopenharmony_ci	 */
7818c2ecf20Sopenharmony_ci	SCR_CLR (SCR_ACK),
7828c2ecf20Sopenharmony_ci		0,
7838c2ecf20Sopenharmony_ci	/*
7848c2ecf20Sopenharmony_ci	 *  Copy SAVEP to LASTP.
7858c2ecf20Sopenharmony_ci	 */
7868c2ecf20Sopenharmony_ci	SCR_COPY (4),
7878c2ecf20Sopenharmony_ci		HADDR_1 (ccb_head.savep),
7888c2ecf20Sopenharmony_ci		HADDR_1 (ccb_head.lastp),
7898c2ecf20Sopenharmony_ci	SCR_JUMP,
7908c2ecf20Sopenharmony_ci		PADDR_A (dispatch),
7918c2ecf20Sopenharmony_ci}/*-------------------------< DISCONNECT >-----------------------*/,{
7928c2ecf20Sopenharmony_ci	/*
7938c2ecf20Sopenharmony_ci	 *  DISCONNECTing  ...
7948c2ecf20Sopenharmony_ci	 *
7958c2ecf20Sopenharmony_ci	 *  disable the "unexpected disconnect" feature,
7968c2ecf20Sopenharmony_ci	 *  and remove the ACK signal.
7978c2ecf20Sopenharmony_ci	 */
7988c2ecf20Sopenharmony_ci	SCR_REG_REG (scntl2, SCR_AND, 0x7f),
7998c2ecf20Sopenharmony_ci		0,
8008c2ecf20Sopenharmony_ci	SCR_CLR (SCR_ACK|SCR_ATN),
8018c2ecf20Sopenharmony_ci		0,
8028c2ecf20Sopenharmony_ci	/*
8038c2ecf20Sopenharmony_ci	 *  Wait for the disconnect.
8048c2ecf20Sopenharmony_ci	 */
8058c2ecf20Sopenharmony_ci	SCR_WAIT_DISC,
8068c2ecf20Sopenharmony_ci		0,
8078c2ecf20Sopenharmony_ci	/*
8088c2ecf20Sopenharmony_ci	 *  Status is: DISCONNECTED.
8098c2ecf20Sopenharmony_ci	 */
8108c2ecf20Sopenharmony_ci	SCR_LOAD_REG (HS_REG, HS_DISCONNECT),
8118c2ecf20Sopenharmony_ci		0,
8128c2ecf20Sopenharmony_ci	/*
8138c2ecf20Sopenharmony_ci	 *  Save host status.
8148c2ecf20Sopenharmony_ci	 */
8158c2ecf20Sopenharmony_ci	SCR_COPY (4),
8168c2ecf20Sopenharmony_ci		RADDR_1 (scr0),
8178c2ecf20Sopenharmony_ci		HADDR_1 (ccb_head.status),
8188c2ecf20Sopenharmony_ci}/*-------------------------< DISCONNECT2 >----------------------*/,{
8198c2ecf20Sopenharmony_ci	/*
8208c2ecf20Sopenharmony_ci	 *  Move back the CCB header using self-modifying
8218c2ecf20Sopenharmony_ci	 *  SCRIPTS.
8228c2ecf20Sopenharmony_ci	 */
8238c2ecf20Sopenharmony_ci	SCR_COPY (4),
8248c2ecf20Sopenharmony_ci		RADDR_1 (dsa),
8258c2ecf20Sopenharmony_ci		PADDR_A (_sms_a65),
8268c2ecf20Sopenharmony_ci	SCR_COPY (sizeof(struct sym_ccbh)),
8278c2ecf20Sopenharmony_ci		HADDR_1 (ccb_head),
8288c2ecf20Sopenharmony_ci}/*-------------------------< _SMS_A65 >-------------------------*/,{
8298c2ecf20Sopenharmony_ci		0,
8308c2ecf20Sopenharmony_ci	SCR_JUMP,
8318c2ecf20Sopenharmony_ci		PADDR_A (start),
8328c2ecf20Sopenharmony_ci}/*-------------------------< IDLE >-----------------------------*/,{
8338c2ecf20Sopenharmony_ci	/*
8348c2ecf20Sopenharmony_ci	 *  Nothing to do?
8358c2ecf20Sopenharmony_ci	 *  Switch the LED off and wait for reselect.
8368c2ecf20Sopenharmony_ci	 *  Will be patched with a NO_OP if LED
8378c2ecf20Sopenharmony_ci	 *  not needed or not desired.
8388c2ecf20Sopenharmony_ci	 */
8398c2ecf20Sopenharmony_ci	SCR_REG_REG (gpreg, SCR_OR, 0x01),
8408c2ecf20Sopenharmony_ci		0,
8418c2ecf20Sopenharmony_ci#ifdef SYM_CONF_IARB_SUPPORT
8428c2ecf20Sopenharmony_ci	SCR_JUMPR,
8438c2ecf20Sopenharmony_ci		8,
8448c2ecf20Sopenharmony_ci#endif
8458c2ecf20Sopenharmony_ci}/*-------------------------< UNGETJOB >-------------------------*/,{
8468c2ecf20Sopenharmony_ci#ifdef SYM_CONF_IARB_SUPPORT
8478c2ecf20Sopenharmony_ci	/*
8488c2ecf20Sopenharmony_ci	 *  Set IMMEDIATE ARBITRATION, for the next time.
8498c2ecf20Sopenharmony_ci	 *  This will give us better chance to win arbitration
8508c2ecf20Sopenharmony_ci	 *  for the job we just wanted to do.
8518c2ecf20Sopenharmony_ci	 */
8528c2ecf20Sopenharmony_ci	SCR_REG_REG (scntl1, SCR_OR, IARB),
8538c2ecf20Sopenharmony_ci		0,
8548c2ecf20Sopenharmony_ci#endif
8558c2ecf20Sopenharmony_ci	/*
8568c2ecf20Sopenharmony_ci	 *  We are not able to restart the SCRIPTS if we are
8578c2ecf20Sopenharmony_ci	 *  interrupted and these instruction haven't been
8588c2ecf20Sopenharmony_ci	 *  all executed. BTW, this is very unlikely to
8598c2ecf20Sopenharmony_ci	 *  happen, but we check that from the C code.
8608c2ecf20Sopenharmony_ci	 */
8618c2ecf20Sopenharmony_ci	SCR_LOAD_REG (dsa, 0xff),
8628c2ecf20Sopenharmony_ci		0,
8638c2ecf20Sopenharmony_ci	SCR_COPY (4),
8648c2ecf20Sopenharmony_ci		RADDR_1 (scratcha),
8658c2ecf20Sopenharmony_ci		PADDR_B (startpos),
8668c2ecf20Sopenharmony_ci}/*-------------------------< RESELECT >-------------------------*/,{
8678c2ecf20Sopenharmony_ci#ifdef SYM_CONF_TARGET_ROLE_SUPPORT
8688c2ecf20Sopenharmony_ci	/*
8698c2ecf20Sopenharmony_ci	 *  Make sure we are in initiator mode.
8708c2ecf20Sopenharmony_ci	 */
8718c2ecf20Sopenharmony_ci	SCR_CLR (SCR_TRG),
8728c2ecf20Sopenharmony_ci		0,
8738c2ecf20Sopenharmony_ci#endif
8748c2ecf20Sopenharmony_ci	/*
8758c2ecf20Sopenharmony_ci	 *  Sleep waiting for a reselection.
8768c2ecf20Sopenharmony_ci	 */
8778c2ecf20Sopenharmony_ci	SCR_WAIT_RESEL,
8788c2ecf20Sopenharmony_ci		PADDR_A(start),
8798c2ecf20Sopenharmony_ci}/*-------------------------< RESELECTED >-----------------------*/,{
8808c2ecf20Sopenharmony_ci	/*
8818c2ecf20Sopenharmony_ci	 *  Switch the LED on.
8828c2ecf20Sopenharmony_ci	 *  Will be patched with a NO_OP if LED
8838c2ecf20Sopenharmony_ci	 *  not needed or not desired.
8848c2ecf20Sopenharmony_ci	 */
8858c2ecf20Sopenharmony_ci	SCR_REG_REG (gpreg, SCR_AND, 0xfe),
8868c2ecf20Sopenharmony_ci		0,
8878c2ecf20Sopenharmony_ci	/*
8888c2ecf20Sopenharmony_ci	 *  load the target id into the sdid
8898c2ecf20Sopenharmony_ci	 */
8908c2ecf20Sopenharmony_ci	SCR_REG_SFBR (ssid, SCR_AND, 0x8F),
8918c2ecf20Sopenharmony_ci		0,
8928c2ecf20Sopenharmony_ci	SCR_TO_REG (sdid),
8938c2ecf20Sopenharmony_ci		0,
8948c2ecf20Sopenharmony_ci	/*
8958c2ecf20Sopenharmony_ci	 *  Load the target control block address
8968c2ecf20Sopenharmony_ci	 */
8978c2ecf20Sopenharmony_ci	SCR_COPY (4),
8988c2ecf20Sopenharmony_ci		PADDR_B (targtbl),
8998c2ecf20Sopenharmony_ci		RADDR_1 (dsa),
9008c2ecf20Sopenharmony_ci	SCR_SFBR_REG (dsa, SCR_SHL, 0),
9018c2ecf20Sopenharmony_ci		0,
9028c2ecf20Sopenharmony_ci	SCR_REG_REG (dsa, SCR_SHL, 0),
9038c2ecf20Sopenharmony_ci		0,
9048c2ecf20Sopenharmony_ci	SCR_REG_REG (dsa, SCR_AND, 0x3c),
9058c2ecf20Sopenharmony_ci		0,
9068c2ecf20Sopenharmony_ci	SCR_COPY (4),
9078c2ecf20Sopenharmony_ci		RADDR_1 (dsa),
9088c2ecf20Sopenharmony_ci		PADDR_A (_sms_a70),
9098c2ecf20Sopenharmony_ci	SCR_COPY (4),
9108c2ecf20Sopenharmony_ci}/*-------------------------< _SMS_A70 >-------------------------*/,{
9118c2ecf20Sopenharmony_ci		0,
9128c2ecf20Sopenharmony_ci		RADDR_1 (dsa),
9138c2ecf20Sopenharmony_ci	/*
9148c2ecf20Sopenharmony_ci	 *  Copy the TCB header to a fixed place in
9158c2ecf20Sopenharmony_ci	 *  the HCB.
9168c2ecf20Sopenharmony_ci	 */
9178c2ecf20Sopenharmony_ci	SCR_COPY (4),
9188c2ecf20Sopenharmony_ci		RADDR_1 (dsa),
9198c2ecf20Sopenharmony_ci		PADDR_A (_sms_a80),
9208c2ecf20Sopenharmony_ci	SCR_COPY (sizeof(struct sym_tcbh)),
9218c2ecf20Sopenharmony_ci}/*-------------------------< _SMS_A80 >-------------------------*/,{
9228c2ecf20Sopenharmony_ci		0,
9238c2ecf20Sopenharmony_ci		HADDR_1 (tcb_head),
9248c2ecf20Sopenharmony_ci	/*
9258c2ecf20Sopenharmony_ci	 *  We expect MESSAGE IN phase.
9268c2ecf20Sopenharmony_ci	 *  If not, get help from the C code.
9278c2ecf20Sopenharmony_ci	 */
9288c2ecf20Sopenharmony_ci	SCR_INT ^ IFFALSE (WHEN (SCR_MSG_IN)),
9298c2ecf20Sopenharmony_ci		SIR_RESEL_NO_MSG_IN,
9308c2ecf20Sopenharmony_ci}/*-------------------------< RESELECTED1 >----------------------*/,{
9318c2ecf20Sopenharmony_ci	/*
9328c2ecf20Sopenharmony_ci	 *  Load the synchronous transfer registers.
9338c2ecf20Sopenharmony_ci	 */
9348c2ecf20Sopenharmony_ci	SCR_COPY (1),
9358c2ecf20Sopenharmony_ci		HADDR_1 (tcb_head.wval),
9368c2ecf20Sopenharmony_ci		RADDR_1 (scntl3),
9378c2ecf20Sopenharmony_ci	SCR_COPY (1),
9388c2ecf20Sopenharmony_ci		HADDR_1 (tcb_head.sval),
9398c2ecf20Sopenharmony_ci		RADDR_1 (sxfer),
9408c2ecf20Sopenharmony_ci	/*
9418c2ecf20Sopenharmony_ci	 *  Get the IDENTIFY message.
9428c2ecf20Sopenharmony_ci	 */
9438c2ecf20Sopenharmony_ci	SCR_MOVE_ABS (1) ^ SCR_MSG_IN,
9448c2ecf20Sopenharmony_ci		HADDR_1 (msgin),
9458c2ecf20Sopenharmony_ci	/*
9468c2ecf20Sopenharmony_ci	 *  If IDENTIFY LUN #0, use a faster path
9478c2ecf20Sopenharmony_ci	 *  to find the LCB structure.
9488c2ecf20Sopenharmony_ci	 */
9498c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFTRUE (MASK (0x80, 0xbf)),
9508c2ecf20Sopenharmony_ci		PADDR_A (resel_lun0),
9518c2ecf20Sopenharmony_ci	/*
9528c2ecf20Sopenharmony_ci	 *  If message isn't an IDENTIFY,
9538c2ecf20Sopenharmony_ci	 *  tell the C code about.
9548c2ecf20Sopenharmony_ci	 */
9558c2ecf20Sopenharmony_ci	SCR_INT ^ IFFALSE (MASK (0x80, 0x80)),
9568c2ecf20Sopenharmony_ci		SIR_RESEL_NO_IDENTIFY,
9578c2ecf20Sopenharmony_ci	/*
9588c2ecf20Sopenharmony_ci	 *  It is an IDENTIFY message,
9598c2ecf20Sopenharmony_ci	 *  Load the LUN control block address.
9608c2ecf20Sopenharmony_ci	 */
9618c2ecf20Sopenharmony_ci	SCR_COPY (4),
9628c2ecf20Sopenharmony_ci		HADDR_1 (tcb_head.luntbl_sa),
9638c2ecf20Sopenharmony_ci		RADDR_1 (dsa),
9648c2ecf20Sopenharmony_ci	SCR_SFBR_REG (dsa, SCR_SHL, 0),
9658c2ecf20Sopenharmony_ci		0,
9668c2ecf20Sopenharmony_ci	SCR_REG_REG (dsa, SCR_SHL, 0),
9678c2ecf20Sopenharmony_ci		0,
9688c2ecf20Sopenharmony_ci	SCR_REG_REG (dsa, SCR_AND, 0xfc),
9698c2ecf20Sopenharmony_ci		0,
9708c2ecf20Sopenharmony_ci	SCR_COPY (4),
9718c2ecf20Sopenharmony_ci		RADDR_1 (dsa),
9728c2ecf20Sopenharmony_ci		PADDR_A (_sms_a90),
9738c2ecf20Sopenharmony_ci	SCR_COPY (4),
9748c2ecf20Sopenharmony_ci}/*-------------------------< _SMS_A90 >-------------------------*/,{
9758c2ecf20Sopenharmony_ci		0,
9768c2ecf20Sopenharmony_ci		RADDR_1 (dsa),
9778c2ecf20Sopenharmony_ci	SCR_JUMPR,
9788c2ecf20Sopenharmony_ci		12,
9798c2ecf20Sopenharmony_ci}/*-------------------------< RESEL_LUN0 >-----------------------*/,{
9808c2ecf20Sopenharmony_ci	/*
9818c2ecf20Sopenharmony_ci	 *  LUN 0 special case (but usual one :))
9828c2ecf20Sopenharmony_ci	 */
9838c2ecf20Sopenharmony_ci	SCR_COPY (4),
9848c2ecf20Sopenharmony_ci		HADDR_1 (tcb_head.lun0_sa),
9858c2ecf20Sopenharmony_ci		RADDR_1 (dsa),
9868c2ecf20Sopenharmony_ci	/*
9878c2ecf20Sopenharmony_ci	 *  Jump indirectly to the reselect action for this LUN.
9888c2ecf20Sopenharmony_ci	 *  (lcb.head.resel_sa assumed at offset zero of lcb).
9898c2ecf20Sopenharmony_ci	 */
9908c2ecf20Sopenharmony_ci	SCR_COPY (4),
9918c2ecf20Sopenharmony_ci		RADDR_1 (dsa),
9928c2ecf20Sopenharmony_ci		PADDR_A (_sms_a100),
9938c2ecf20Sopenharmony_ci	SCR_COPY (4),
9948c2ecf20Sopenharmony_ci}/*-------------------------< _SMS_A100 >------------------------*/,{
9958c2ecf20Sopenharmony_ci		0,
9968c2ecf20Sopenharmony_ci		RADDR_1 (temp),
9978c2ecf20Sopenharmony_ci	SCR_RETURN,
9988c2ecf20Sopenharmony_ci		0,
9998c2ecf20Sopenharmony_ci	/* In normal situations, we jump to RESEL_TAG or RESEL_NO_TAG */
10008c2ecf20Sopenharmony_ci}/*-------------------------< RESEL_TAG >------------------------*/,{
10018c2ecf20Sopenharmony_ci	/*
10028c2ecf20Sopenharmony_ci	 *  ACK the IDENTIFY previously received.
10038c2ecf20Sopenharmony_ci	 */
10048c2ecf20Sopenharmony_ci	SCR_CLR (SCR_ACK),
10058c2ecf20Sopenharmony_ci		0,
10068c2ecf20Sopenharmony_ci	/*
10078c2ecf20Sopenharmony_ci	 *  It shall be a tagged command.
10088c2ecf20Sopenharmony_ci	 *  Read SIMPLE+TAG.
10098c2ecf20Sopenharmony_ci	 *  The C code will deal with errors.
10108c2ecf20Sopenharmony_ci	 *  Aggressive optimization, isn't it? :)
10118c2ecf20Sopenharmony_ci	 */
10128c2ecf20Sopenharmony_ci	SCR_MOVE_ABS (2) ^ SCR_MSG_IN,
10138c2ecf20Sopenharmony_ci		HADDR_1 (msgin),
10148c2ecf20Sopenharmony_ci	/*
10158c2ecf20Sopenharmony_ci	 *  Copy the LCB header to a fixed place in
10168c2ecf20Sopenharmony_ci	 *  the HCB using self-modifying SCRIPTS.
10178c2ecf20Sopenharmony_ci	 */
10188c2ecf20Sopenharmony_ci	SCR_COPY (4),
10198c2ecf20Sopenharmony_ci		RADDR_1 (dsa),
10208c2ecf20Sopenharmony_ci		PADDR_A (_sms_a110),
10218c2ecf20Sopenharmony_ci	SCR_COPY (sizeof(struct sym_lcbh)),
10228c2ecf20Sopenharmony_ci}/*-------------------------< _SMS_A110 >------------------------*/,{
10238c2ecf20Sopenharmony_ci		0,
10248c2ecf20Sopenharmony_ci		HADDR_1 (lcb_head),
10258c2ecf20Sopenharmony_ci	/*
10268c2ecf20Sopenharmony_ci	 *  Load the pointer to the tagged task
10278c2ecf20Sopenharmony_ci	 *  table for this LUN.
10288c2ecf20Sopenharmony_ci	 */
10298c2ecf20Sopenharmony_ci	SCR_COPY (4),
10308c2ecf20Sopenharmony_ci		HADDR_1 (lcb_head.itlq_tbl_sa),
10318c2ecf20Sopenharmony_ci		RADDR_1 (dsa),
10328c2ecf20Sopenharmony_ci	/*
10338c2ecf20Sopenharmony_ci	 *  The SIDL still contains the TAG value.
10348c2ecf20Sopenharmony_ci	 *  Aggressive optimization, isn't it? :):)
10358c2ecf20Sopenharmony_ci	 */
10368c2ecf20Sopenharmony_ci	SCR_REG_SFBR (sidl, SCR_SHL, 0),
10378c2ecf20Sopenharmony_ci		0,
10388c2ecf20Sopenharmony_ci#if SYM_CONF_MAX_TASK*4 > 512
10398c2ecf20Sopenharmony_ci	SCR_JUMPR ^ IFFALSE (CARRYSET),
10408c2ecf20Sopenharmony_ci		8,
10418c2ecf20Sopenharmony_ci	SCR_REG_REG (dsa1, SCR_OR, 2),
10428c2ecf20Sopenharmony_ci		0,
10438c2ecf20Sopenharmony_ci	SCR_REG_REG (sfbr, SCR_SHL, 0),
10448c2ecf20Sopenharmony_ci		0,
10458c2ecf20Sopenharmony_ci	SCR_JUMPR ^ IFFALSE (CARRYSET),
10468c2ecf20Sopenharmony_ci		8,
10478c2ecf20Sopenharmony_ci	SCR_REG_REG (dsa1, SCR_OR, 1),
10488c2ecf20Sopenharmony_ci		0,
10498c2ecf20Sopenharmony_ci#elif SYM_CONF_MAX_TASK*4 > 256
10508c2ecf20Sopenharmony_ci	SCR_JUMPR ^ IFFALSE (CARRYSET),
10518c2ecf20Sopenharmony_ci		8,
10528c2ecf20Sopenharmony_ci	SCR_REG_REG (dsa1, SCR_OR, 1),
10538c2ecf20Sopenharmony_ci		0,
10548c2ecf20Sopenharmony_ci#endif
10558c2ecf20Sopenharmony_ci	/*
10568c2ecf20Sopenharmony_ci	 *  Retrieve the DSA of this task.
10578c2ecf20Sopenharmony_ci	 *  JUMP indirectly to the restart point of the CCB.
10588c2ecf20Sopenharmony_ci	 */
10598c2ecf20Sopenharmony_ci	SCR_SFBR_REG (dsa, SCR_AND, 0xfc),
10608c2ecf20Sopenharmony_ci		0,
10618c2ecf20Sopenharmony_ci	SCR_COPY (4),
10628c2ecf20Sopenharmony_ci		RADDR_1 (dsa),
10638c2ecf20Sopenharmony_ci		PADDR_A (_sms_a120),
10648c2ecf20Sopenharmony_ci	SCR_COPY (4),
10658c2ecf20Sopenharmony_ci}/*-------------------------< _SMS_A120 >------------------------*/,{
10668c2ecf20Sopenharmony_ci		0,
10678c2ecf20Sopenharmony_ci		RADDR_1 (dsa),
10688c2ecf20Sopenharmony_ci}/*-------------------------< RESEL_GO >-------------------------*/,{
10698c2ecf20Sopenharmony_ci	SCR_COPY (4),
10708c2ecf20Sopenharmony_ci		RADDR_1 (dsa),
10718c2ecf20Sopenharmony_ci		PADDR_A (_sms_a130),
10728c2ecf20Sopenharmony_ci	/*
10738c2ecf20Sopenharmony_ci	 *  Move 'ccb.phys.head.go' action to
10748c2ecf20Sopenharmony_ci	 *  scratch/scratch1. So scratch1 will
10758c2ecf20Sopenharmony_ci	 *  contain the 'restart' field of the
10768c2ecf20Sopenharmony_ci	 *  'go' structure.
10778c2ecf20Sopenharmony_ci	 */
10788c2ecf20Sopenharmony_ci	SCR_COPY (8),
10798c2ecf20Sopenharmony_ci}/*-------------------------< _SMS_A130 >------------------------*/,{
10808c2ecf20Sopenharmony_ci		0,
10818c2ecf20Sopenharmony_ci		PADDR_B (scratch),
10828c2ecf20Sopenharmony_ci	SCR_COPY (4),
10838c2ecf20Sopenharmony_ci		PADDR_B (scratch1), /* phys.head.go.restart */
10848c2ecf20Sopenharmony_ci		RADDR_1 (temp),
10858c2ecf20Sopenharmony_ci	SCR_RETURN,
10868c2ecf20Sopenharmony_ci		0,
10878c2ecf20Sopenharmony_ci	/* In normal situations we branch to RESEL_DSA */
10888c2ecf20Sopenharmony_ci}/*-------------------------< RESEL_DSA >------------------------*/,{
10898c2ecf20Sopenharmony_ci	/*
10908c2ecf20Sopenharmony_ci	 *  ACK the IDENTIFY or TAG previously received.
10918c2ecf20Sopenharmony_ci	 */
10928c2ecf20Sopenharmony_ci	SCR_CLR (SCR_ACK),
10938c2ecf20Sopenharmony_ci		0,
10948c2ecf20Sopenharmony_ci}/*-------------------------< RESEL_DSA1 >-----------------------*/,{
10958c2ecf20Sopenharmony_ci	/*
10968c2ecf20Sopenharmony_ci	 *  Copy the CCB header to a fixed location
10978c2ecf20Sopenharmony_ci	 *  in the HCB using self-modifying SCRIPTS.
10988c2ecf20Sopenharmony_ci	 */
10998c2ecf20Sopenharmony_ci	SCR_COPY (4),
11008c2ecf20Sopenharmony_ci		RADDR_1 (dsa),
11018c2ecf20Sopenharmony_ci		PADDR_A (_sms_a140),
11028c2ecf20Sopenharmony_ci	SCR_COPY (sizeof(struct sym_ccbh)),
11038c2ecf20Sopenharmony_ci}/*-------------------------< _SMS_A140 >------------------------*/,{
11048c2ecf20Sopenharmony_ci		0,
11058c2ecf20Sopenharmony_ci		HADDR_1 (ccb_head),
11068c2ecf20Sopenharmony_ci	/*
11078c2ecf20Sopenharmony_ci	 *  Initialize the status register
11088c2ecf20Sopenharmony_ci	 */
11098c2ecf20Sopenharmony_ci	SCR_COPY (4),
11108c2ecf20Sopenharmony_ci		HADDR_1 (ccb_head.status),
11118c2ecf20Sopenharmony_ci		RADDR_1 (scr0),
11128c2ecf20Sopenharmony_ci	/*
11138c2ecf20Sopenharmony_ci	 *  Jump to dispatcher.
11148c2ecf20Sopenharmony_ci	 */
11158c2ecf20Sopenharmony_ci	SCR_JUMP,
11168c2ecf20Sopenharmony_ci		PADDR_A (dispatch),
11178c2ecf20Sopenharmony_ci}/*-------------------------< RESEL_NO_TAG >---------------------*/,{
11188c2ecf20Sopenharmony_ci	/*
11198c2ecf20Sopenharmony_ci	 *  Copy the LCB header to a fixed place in
11208c2ecf20Sopenharmony_ci	 *  the HCB using self-modifying SCRIPTS.
11218c2ecf20Sopenharmony_ci	 */
11228c2ecf20Sopenharmony_ci	SCR_COPY (4),
11238c2ecf20Sopenharmony_ci		RADDR_1 (dsa),
11248c2ecf20Sopenharmony_ci		PADDR_A (_sms_a145),
11258c2ecf20Sopenharmony_ci	SCR_COPY (sizeof(struct sym_lcbh)),
11268c2ecf20Sopenharmony_ci}/*-------------------------< _SMS_A145 >------------------------*/,{
11278c2ecf20Sopenharmony_ci		0,
11288c2ecf20Sopenharmony_ci		HADDR_1 (lcb_head),
11298c2ecf20Sopenharmony_ci	/*
11308c2ecf20Sopenharmony_ci	 *  Load the DSA with the unique ITL task.
11318c2ecf20Sopenharmony_ci	 */
11328c2ecf20Sopenharmony_ci	SCR_COPY (4),
11338c2ecf20Sopenharmony_ci		HADDR_1 (lcb_head.itl_task_sa),
11348c2ecf20Sopenharmony_ci		RADDR_1 (dsa),
11358c2ecf20Sopenharmony_ci	SCR_JUMP,
11368c2ecf20Sopenharmony_ci		PADDR_A (resel_go),
11378c2ecf20Sopenharmony_ci}/*-------------------------< DATA_IN >--------------------------*/,{
11388c2ecf20Sopenharmony_ci/*
11398c2ecf20Sopenharmony_ci *  Because the size depends on the
11408c2ecf20Sopenharmony_ci *  #define SYM_CONF_MAX_SG parameter,
11418c2ecf20Sopenharmony_ci *  it is filled in at runtime.
11428c2ecf20Sopenharmony_ci *
11438c2ecf20Sopenharmony_ci *  ##===========< i=0; i<SYM_CONF_MAX_SG >=========
11448c2ecf20Sopenharmony_ci *  ||	SCR_CHMOV_TBL ^ SCR_DATA_IN,
11458c2ecf20Sopenharmony_ci *  ||		offsetof (struct sym_dsb, data[ i]),
11468c2ecf20Sopenharmony_ci *  ##==========================================
11478c2ecf20Sopenharmony_ci */
11488c2ecf20Sopenharmony_ci0
11498c2ecf20Sopenharmony_ci}/*-------------------------< DATA_IN2 >-------------------------*/,{
11508c2ecf20Sopenharmony_ci	SCR_CALL,
11518c2ecf20Sopenharmony_ci		PADDR_A (datai_done),
11528c2ecf20Sopenharmony_ci	SCR_JUMP,
11538c2ecf20Sopenharmony_ci		PADDR_B (data_ovrun),
11548c2ecf20Sopenharmony_ci}/*-------------------------< DATA_OUT >-------------------------*/,{
11558c2ecf20Sopenharmony_ci/*
11568c2ecf20Sopenharmony_ci *  Because the size depends on the
11578c2ecf20Sopenharmony_ci *  #define SYM_CONF_MAX_SG parameter,
11588c2ecf20Sopenharmony_ci *  it is filled in at runtime.
11598c2ecf20Sopenharmony_ci *
11608c2ecf20Sopenharmony_ci *  ##===========< i=0; i<SYM_CONF_MAX_SG >=========
11618c2ecf20Sopenharmony_ci *  ||	SCR_CHMOV_TBL ^ SCR_DATA_OUT,
11628c2ecf20Sopenharmony_ci *  ||		offsetof (struct sym_dsb, data[ i]),
11638c2ecf20Sopenharmony_ci *  ##==========================================
11648c2ecf20Sopenharmony_ci */
11658c2ecf20Sopenharmony_ci0
11668c2ecf20Sopenharmony_ci}/*-------------------------< DATA_OUT2 >------------------------*/,{
11678c2ecf20Sopenharmony_ci	SCR_CALL,
11688c2ecf20Sopenharmony_ci		PADDR_A (datao_done),
11698c2ecf20Sopenharmony_ci	SCR_JUMP,
11708c2ecf20Sopenharmony_ci		PADDR_B (data_ovrun),
11718c2ecf20Sopenharmony_ci}/*-------------------------< PM0_DATA >-------------------------*/,{
11728c2ecf20Sopenharmony_ci	/*
11738c2ecf20Sopenharmony_ci	 *  Read our host flags to SFBR, so we will be able
11748c2ecf20Sopenharmony_ci	 *  to check against the data direction we expect.
11758c2ecf20Sopenharmony_ci	 */
11768c2ecf20Sopenharmony_ci	SCR_FROM_REG (HF_REG),
11778c2ecf20Sopenharmony_ci		0,
11788c2ecf20Sopenharmony_ci	/*
11798c2ecf20Sopenharmony_ci	 *  Check against actual DATA PHASE.
11808c2ecf20Sopenharmony_ci	 */
11818c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFFALSE (WHEN (SCR_DATA_IN)),
11828c2ecf20Sopenharmony_ci		PADDR_A (pm0_data_out),
11838c2ecf20Sopenharmony_ci	/*
11848c2ecf20Sopenharmony_ci	 *  Actual phase is DATA IN.
11858c2ecf20Sopenharmony_ci	 *  Check against expected direction.
11868c2ecf20Sopenharmony_ci	 */
11878c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFFALSE (MASK (HF_DATA_IN, HF_DATA_IN)),
11888c2ecf20Sopenharmony_ci		PADDR_B (data_ovrun),
11898c2ecf20Sopenharmony_ci	/*
11908c2ecf20Sopenharmony_ci	 *  Keep track we are moving data from the
11918c2ecf20Sopenharmony_ci	 *  PM0 DATA mini-script.
11928c2ecf20Sopenharmony_ci	 */
11938c2ecf20Sopenharmony_ci	SCR_REG_REG (HF_REG, SCR_OR, HF_IN_PM0),
11948c2ecf20Sopenharmony_ci		0,
11958c2ecf20Sopenharmony_ci	/*
11968c2ecf20Sopenharmony_ci	 *  Move the data to memory.
11978c2ecf20Sopenharmony_ci	 */
11988c2ecf20Sopenharmony_ci	SCR_CHMOV_TBL ^ SCR_DATA_IN,
11998c2ecf20Sopenharmony_ci		offsetof (struct sym_ccb, phys.pm0.sg),
12008c2ecf20Sopenharmony_ci	SCR_JUMP,
12018c2ecf20Sopenharmony_ci		PADDR_A (pm0_data_end),
12028c2ecf20Sopenharmony_ci}/*-------------------------< PM0_DATA_OUT >---------------------*/,{
12038c2ecf20Sopenharmony_ci	/*
12048c2ecf20Sopenharmony_ci	 *  Actual phase is DATA OUT.
12058c2ecf20Sopenharmony_ci	 *  Check against expected direction.
12068c2ecf20Sopenharmony_ci	 */
12078c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFTRUE (MASK (HF_DATA_IN, HF_DATA_IN)),
12088c2ecf20Sopenharmony_ci		PADDR_B (data_ovrun),
12098c2ecf20Sopenharmony_ci	/*
12108c2ecf20Sopenharmony_ci	 *  Keep track we are moving data from the
12118c2ecf20Sopenharmony_ci	 *  PM0 DATA mini-script.
12128c2ecf20Sopenharmony_ci	 */
12138c2ecf20Sopenharmony_ci	SCR_REG_REG (HF_REG, SCR_OR, HF_IN_PM0),
12148c2ecf20Sopenharmony_ci		0,
12158c2ecf20Sopenharmony_ci	/*
12168c2ecf20Sopenharmony_ci	 *  Move the data from memory.
12178c2ecf20Sopenharmony_ci	 */
12188c2ecf20Sopenharmony_ci	SCR_CHMOV_TBL ^ SCR_DATA_OUT,
12198c2ecf20Sopenharmony_ci		offsetof (struct sym_ccb, phys.pm0.sg),
12208c2ecf20Sopenharmony_ci}/*-------------------------< PM0_DATA_END >---------------------*/,{
12218c2ecf20Sopenharmony_ci	/*
12228c2ecf20Sopenharmony_ci	 *  Clear the flag that told we were moving
12238c2ecf20Sopenharmony_ci	 *  data from the PM0 DATA mini-script.
12248c2ecf20Sopenharmony_ci	 */
12258c2ecf20Sopenharmony_ci	SCR_REG_REG (HF_REG, SCR_AND, (~HF_IN_PM0)),
12268c2ecf20Sopenharmony_ci		0,
12278c2ecf20Sopenharmony_ci	/*
12288c2ecf20Sopenharmony_ci	 *  Return to the previous DATA script which
12298c2ecf20Sopenharmony_ci	 *  is guaranteed by design (if no bug) to be
12308c2ecf20Sopenharmony_ci	 *  the main DATA script for this transfer.
12318c2ecf20Sopenharmony_ci	 */
12328c2ecf20Sopenharmony_ci	SCR_COPY (4),
12338c2ecf20Sopenharmony_ci		RADDR_1 (dsa),
12348c2ecf20Sopenharmony_ci		RADDR_1 (scratcha),
12358c2ecf20Sopenharmony_ci	SCR_REG_REG (scratcha, SCR_ADD, offsetof (struct sym_ccb,phys.pm0.ret)),
12368c2ecf20Sopenharmony_ci		0,
12378c2ecf20Sopenharmony_ci}/*-------------------------< PM_DATA_END >----------------------*/,{
12388c2ecf20Sopenharmony_ci	SCR_COPY (4),
12398c2ecf20Sopenharmony_ci		RADDR_1 (scratcha),
12408c2ecf20Sopenharmony_ci		PADDR_A (_sms_a150),
12418c2ecf20Sopenharmony_ci	SCR_COPY (4),
12428c2ecf20Sopenharmony_ci}/*-------------------------< _SMS_A150 >------------------------*/,{
12438c2ecf20Sopenharmony_ci		0,
12448c2ecf20Sopenharmony_ci		RADDR_1 (temp),
12458c2ecf20Sopenharmony_ci	SCR_RETURN,
12468c2ecf20Sopenharmony_ci		0,
12478c2ecf20Sopenharmony_ci}/*-------------------------< PM1_DATA >-------------------------*/,{
12488c2ecf20Sopenharmony_ci	/*
12498c2ecf20Sopenharmony_ci	 *  Read our host flags to SFBR, so we will be able
12508c2ecf20Sopenharmony_ci	 *  to check against the data direction we expect.
12518c2ecf20Sopenharmony_ci	 */
12528c2ecf20Sopenharmony_ci	SCR_FROM_REG (HF_REG),
12538c2ecf20Sopenharmony_ci		0,
12548c2ecf20Sopenharmony_ci	/*
12558c2ecf20Sopenharmony_ci	 *  Check against actual DATA PHASE.
12568c2ecf20Sopenharmony_ci	 */
12578c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFFALSE (WHEN (SCR_DATA_IN)),
12588c2ecf20Sopenharmony_ci		PADDR_A (pm1_data_out),
12598c2ecf20Sopenharmony_ci	/*
12608c2ecf20Sopenharmony_ci	 *  Actual phase is DATA IN.
12618c2ecf20Sopenharmony_ci	 *  Check against expected direction.
12628c2ecf20Sopenharmony_ci	 */
12638c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFFALSE (MASK (HF_DATA_IN, HF_DATA_IN)),
12648c2ecf20Sopenharmony_ci		PADDR_B (data_ovrun),
12658c2ecf20Sopenharmony_ci	/*
12668c2ecf20Sopenharmony_ci	 *  Keep track we are moving data from the
12678c2ecf20Sopenharmony_ci	 *  PM1 DATA mini-script.
12688c2ecf20Sopenharmony_ci	 */
12698c2ecf20Sopenharmony_ci	SCR_REG_REG (HF_REG, SCR_OR, HF_IN_PM1),
12708c2ecf20Sopenharmony_ci		0,
12718c2ecf20Sopenharmony_ci	/*
12728c2ecf20Sopenharmony_ci	 *  Move the data to memory.
12738c2ecf20Sopenharmony_ci	 */
12748c2ecf20Sopenharmony_ci	SCR_CHMOV_TBL ^ SCR_DATA_IN,
12758c2ecf20Sopenharmony_ci		offsetof (struct sym_ccb, phys.pm1.sg),
12768c2ecf20Sopenharmony_ci	SCR_JUMP,
12778c2ecf20Sopenharmony_ci		PADDR_A (pm1_data_end),
12788c2ecf20Sopenharmony_ci}/*-------------------------< PM1_DATA_OUT >---------------------*/,{
12798c2ecf20Sopenharmony_ci	/*
12808c2ecf20Sopenharmony_ci	 *  Actual phase is DATA OUT.
12818c2ecf20Sopenharmony_ci	 *  Check against expected direction.
12828c2ecf20Sopenharmony_ci	 */
12838c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFTRUE (MASK (HF_DATA_IN, HF_DATA_IN)),
12848c2ecf20Sopenharmony_ci		PADDR_B (data_ovrun),
12858c2ecf20Sopenharmony_ci	/*
12868c2ecf20Sopenharmony_ci	 *  Keep track we are moving data from the
12878c2ecf20Sopenharmony_ci	 *  PM1 DATA mini-script.
12888c2ecf20Sopenharmony_ci	 */
12898c2ecf20Sopenharmony_ci	SCR_REG_REG (HF_REG, SCR_OR, HF_IN_PM1),
12908c2ecf20Sopenharmony_ci		0,
12918c2ecf20Sopenharmony_ci	/*
12928c2ecf20Sopenharmony_ci	 *  Move the data from memory.
12938c2ecf20Sopenharmony_ci	 */
12948c2ecf20Sopenharmony_ci	SCR_CHMOV_TBL ^ SCR_DATA_OUT,
12958c2ecf20Sopenharmony_ci		offsetof (struct sym_ccb, phys.pm1.sg),
12968c2ecf20Sopenharmony_ci}/*-------------------------< PM1_DATA_END >---------------------*/,{
12978c2ecf20Sopenharmony_ci	/*
12988c2ecf20Sopenharmony_ci	 *  Clear the flag that told we were moving
12998c2ecf20Sopenharmony_ci	 *  data from the PM1 DATA mini-script.
13008c2ecf20Sopenharmony_ci	 */
13018c2ecf20Sopenharmony_ci	SCR_REG_REG (HF_REG, SCR_AND, (~HF_IN_PM1)),
13028c2ecf20Sopenharmony_ci		0,
13038c2ecf20Sopenharmony_ci	/*
13048c2ecf20Sopenharmony_ci	 *  Return to the previous DATA script which
13058c2ecf20Sopenharmony_ci	 *  is guaranteed by design (if no bug) to be
13068c2ecf20Sopenharmony_ci	 *  the main DATA script for this transfer.
13078c2ecf20Sopenharmony_ci	 */
13088c2ecf20Sopenharmony_ci	SCR_COPY (4),
13098c2ecf20Sopenharmony_ci		RADDR_1 (dsa),
13108c2ecf20Sopenharmony_ci		RADDR_1 (scratcha),
13118c2ecf20Sopenharmony_ci	SCR_REG_REG (scratcha, SCR_ADD, offsetof (struct sym_ccb,phys.pm1.ret)),
13128c2ecf20Sopenharmony_ci		0,
13138c2ecf20Sopenharmony_ci	SCR_JUMP,
13148c2ecf20Sopenharmony_ci		PADDR_A (pm_data_end),
13158c2ecf20Sopenharmony_ci}/*--------------------------<>----------------------------------*/
13168c2ecf20Sopenharmony_ci};
13178c2ecf20Sopenharmony_ci
13188c2ecf20Sopenharmony_cistatic struct SYM_FWB_SCR SYM_FWB_SCR = {
13198c2ecf20Sopenharmony_ci/*-------------------------< NO_DATA >--------------------------*/ {
13208c2ecf20Sopenharmony_ci	SCR_JUMP,
13218c2ecf20Sopenharmony_ci		PADDR_B (data_ovrun),
13228c2ecf20Sopenharmony_ci}/*-------------------------< SEL_FOR_ABORT >--------------------*/,{
13238c2ecf20Sopenharmony_ci	/*
13248c2ecf20Sopenharmony_ci	 *  We are jumped here by the C code, if we have
13258c2ecf20Sopenharmony_ci	 *  some target to reset or some disconnected
13268c2ecf20Sopenharmony_ci	 *  job to abort. Since error recovery is a serious
13278c2ecf20Sopenharmony_ci	 *  busyness, we will really reset the SCSI BUS, if
13288c2ecf20Sopenharmony_ci	 *  case of a SCSI interrupt occurring in this path.
13298c2ecf20Sopenharmony_ci	 */
13308c2ecf20Sopenharmony_ci
13318c2ecf20Sopenharmony_ci#ifdef SYM_CONF_TARGET_ROLE_SUPPORT
13328c2ecf20Sopenharmony_ci	/*
13338c2ecf20Sopenharmony_ci	 *  Set initiator mode.
13348c2ecf20Sopenharmony_ci	 */
13358c2ecf20Sopenharmony_ci	SCR_CLR (SCR_TRG),
13368c2ecf20Sopenharmony_ci		0,
13378c2ecf20Sopenharmony_ci#endif
13388c2ecf20Sopenharmony_ci	/*
13398c2ecf20Sopenharmony_ci	 *      And try to select this target.
13408c2ecf20Sopenharmony_ci	 */
13418c2ecf20Sopenharmony_ci	SCR_SEL_TBL_ATN ^ offsetof (struct sym_hcb, abrt_sel),
13428c2ecf20Sopenharmony_ci		PADDR_A (reselect),
13438c2ecf20Sopenharmony_ci	/*
13448c2ecf20Sopenharmony_ci	 *  Wait for the selection to complete or
13458c2ecf20Sopenharmony_ci	 *  the selection to time out.
13468c2ecf20Sopenharmony_ci	 */
13478c2ecf20Sopenharmony_ci	SCR_JUMPR ^ IFFALSE (WHEN (SCR_MSG_OUT)),
13488c2ecf20Sopenharmony_ci		-8,
13498c2ecf20Sopenharmony_ci	/*
13508c2ecf20Sopenharmony_ci	 *  Call the C code.
13518c2ecf20Sopenharmony_ci	 */
13528c2ecf20Sopenharmony_ci	SCR_INT,
13538c2ecf20Sopenharmony_ci		SIR_TARGET_SELECTED,
13548c2ecf20Sopenharmony_ci	/*
13558c2ecf20Sopenharmony_ci	 *  The C code should let us continue here.
13568c2ecf20Sopenharmony_ci	 *  Send the 'kiss of death' message.
13578c2ecf20Sopenharmony_ci	 *  We expect an immediate disconnect once
13588c2ecf20Sopenharmony_ci	 *  the target has eaten the message.
13598c2ecf20Sopenharmony_ci	 */
13608c2ecf20Sopenharmony_ci	SCR_REG_REG (scntl2, SCR_AND, 0x7f),
13618c2ecf20Sopenharmony_ci		0,
13628c2ecf20Sopenharmony_ci	SCR_MOVE_TBL ^ SCR_MSG_OUT,
13638c2ecf20Sopenharmony_ci		offsetof (struct sym_hcb, abrt_tbl),
13648c2ecf20Sopenharmony_ci	SCR_CLR (SCR_ACK|SCR_ATN),
13658c2ecf20Sopenharmony_ci		0,
13668c2ecf20Sopenharmony_ci	SCR_WAIT_DISC,
13678c2ecf20Sopenharmony_ci		0,
13688c2ecf20Sopenharmony_ci	/*
13698c2ecf20Sopenharmony_ci	 *  Tell the C code that we are done.
13708c2ecf20Sopenharmony_ci	 */
13718c2ecf20Sopenharmony_ci	SCR_INT,
13728c2ecf20Sopenharmony_ci		SIR_ABORT_SENT,
13738c2ecf20Sopenharmony_ci}/*-------------------------< SEL_FOR_ABORT_1 >------------------*/,{
13748c2ecf20Sopenharmony_ci	/*
13758c2ecf20Sopenharmony_ci	 *  Jump at scheduler.
13768c2ecf20Sopenharmony_ci	 */
13778c2ecf20Sopenharmony_ci	SCR_JUMP,
13788c2ecf20Sopenharmony_ci		PADDR_A (start),
13798c2ecf20Sopenharmony_ci}/*-------------------------< MSG_IN_ETC >-----------------------*/,{
13808c2ecf20Sopenharmony_ci	/*
13818c2ecf20Sopenharmony_ci	 *  If it is an EXTENDED (variable size message)
13828c2ecf20Sopenharmony_ci	 *  Handle it.
13838c2ecf20Sopenharmony_ci	 */
13848c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFTRUE (DATA (M_EXTENDED)),
13858c2ecf20Sopenharmony_ci		PADDR_B (msg_extended),
13868c2ecf20Sopenharmony_ci	/*
13878c2ecf20Sopenharmony_ci	 *  Let the C code handle any other
13888c2ecf20Sopenharmony_ci	 *  1 byte message.
13898c2ecf20Sopenharmony_ci	 */
13908c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFTRUE (MASK (0x00, 0xf0)),
13918c2ecf20Sopenharmony_ci		PADDR_B (msg_received),
13928c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFTRUE (MASK (0x10, 0xf0)),
13938c2ecf20Sopenharmony_ci		PADDR_B (msg_received),
13948c2ecf20Sopenharmony_ci	/*
13958c2ecf20Sopenharmony_ci	 *  We donnot handle 2 bytes messages from SCRIPTS.
13968c2ecf20Sopenharmony_ci	 *  So, let the C code deal with these ones too.
13978c2ecf20Sopenharmony_ci	 */
13988c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFFALSE (MASK (0x20, 0xf0)),
13998c2ecf20Sopenharmony_ci		PADDR_B (msg_weird_seen),
14008c2ecf20Sopenharmony_ci	SCR_CLR (SCR_ACK),
14018c2ecf20Sopenharmony_ci		0,
14028c2ecf20Sopenharmony_ci	SCR_MOVE_ABS (1) ^ SCR_MSG_IN,
14038c2ecf20Sopenharmony_ci		HADDR_1 (msgin[1]),
14048c2ecf20Sopenharmony_ci}/*-------------------------< MSG_RECEIVED >---------------------*/,{
14058c2ecf20Sopenharmony_ci	SCR_COPY (4),			/* DUMMY READ */
14068c2ecf20Sopenharmony_ci		HADDR_1 (scratch),
14078c2ecf20Sopenharmony_ci		RADDR_1 (scratcha),
14088c2ecf20Sopenharmony_ci	SCR_INT,
14098c2ecf20Sopenharmony_ci		SIR_MSG_RECEIVED,
14108c2ecf20Sopenharmony_ci}/*-------------------------< MSG_WEIRD_SEEN >-------------------*/,{
14118c2ecf20Sopenharmony_ci	SCR_COPY (4),			/* DUMMY READ */
14128c2ecf20Sopenharmony_ci		HADDR_1 (scratch),
14138c2ecf20Sopenharmony_ci		RADDR_1 (scratcha),
14148c2ecf20Sopenharmony_ci	SCR_INT,
14158c2ecf20Sopenharmony_ci		SIR_MSG_WEIRD,
14168c2ecf20Sopenharmony_ci}/*-------------------------< MSG_EXTENDED >---------------------*/,{
14178c2ecf20Sopenharmony_ci	/*
14188c2ecf20Sopenharmony_ci	 *  Clear ACK and get the next byte
14198c2ecf20Sopenharmony_ci	 *  assumed to be the message length.
14208c2ecf20Sopenharmony_ci	 */
14218c2ecf20Sopenharmony_ci	SCR_CLR (SCR_ACK),
14228c2ecf20Sopenharmony_ci		0,
14238c2ecf20Sopenharmony_ci	SCR_MOVE_ABS (1) ^ SCR_MSG_IN,
14248c2ecf20Sopenharmony_ci		HADDR_1 (msgin[1]),
14258c2ecf20Sopenharmony_ci	/*
14268c2ecf20Sopenharmony_ci	 *  Try to catch some unlikely situations as 0 length
14278c2ecf20Sopenharmony_ci	 *  or too large the length.
14288c2ecf20Sopenharmony_ci	 */
14298c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFTRUE (DATA (0)),
14308c2ecf20Sopenharmony_ci		PADDR_B (msg_weird_seen),
14318c2ecf20Sopenharmony_ci	SCR_TO_REG (scratcha),
14328c2ecf20Sopenharmony_ci		0,
14338c2ecf20Sopenharmony_ci	SCR_REG_REG (sfbr, SCR_ADD, (256-8)),
14348c2ecf20Sopenharmony_ci		0,
14358c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFTRUE (CARRYSET),
14368c2ecf20Sopenharmony_ci		PADDR_B (msg_weird_seen),
14378c2ecf20Sopenharmony_ci	/*
14388c2ecf20Sopenharmony_ci	 *  We donnot handle extended messages from SCRIPTS.
14398c2ecf20Sopenharmony_ci	 *  Read the amount of data corresponding to the
14408c2ecf20Sopenharmony_ci	 *  message length and call the C code.
14418c2ecf20Sopenharmony_ci	 */
14428c2ecf20Sopenharmony_ci	SCR_COPY (1),
14438c2ecf20Sopenharmony_ci		RADDR_1 (scratcha),
14448c2ecf20Sopenharmony_ci		PADDR_B (_sms_b10),
14458c2ecf20Sopenharmony_ci	SCR_CLR (SCR_ACK),
14468c2ecf20Sopenharmony_ci		0,
14478c2ecf20Sopenharmony_ci}/*-------------------------< _SMS_B10 >-------------------------*/,{
14488c2ecf20Sopenharmony_ci	SCR_MOVE_ABS (0) ^ SCR_MSG_IN,
14498c2ecf20Sopenharmony_ci		HADDR_1 (msgin[2]),
14508c2ecf20Sopenharmony_ci	SCR_JUMP,
14518c2ecf20Sopenharmony_ci		PADDR_B (msg_received),
14528c2ecf20Sopenharmony_ci}/*-------------------------< MSG_BAD >--------------------------*/,{
14538c2ecf20Sopenharmony_ci	/*
14548c2ecf20Sopenharmony_ci	 *  unimplemented message - reject it.
14558c2ecf20Sopenharmony_ci	 */
14568c2ecf20Sopenharmony_ci	SCR_INT,
14578c2ecf20Sopenharmony_ci		SIR_REJECT_TO_SEND,
14588c2ecf20Sopenharmony_ci	SCR_SET (SCR_ATN),
14598c2ecf20Sopenharmony_ci		0,
14608c2ecf20Sopenharmony_ci	SCR_JUMP,
14618c2ecf20Sopenharmony_ci		PADDR_A (clrack),
14628c2ecf20Sopenharmony_ci}/*-------------------------< MSG_WEIRD >------------------------*/,{
14638c2ecf20Sopenharmony_ci	/*
14648c2ecf20Sopenharmony_ci	 *  weird message received
14658c2ecf20Sopenharmony_ci	 *  ignore all MSG IN phases and reject it.
14668c2ecf20Sopenharmony_ci	 */
14678c2ecf20Sopenharmony_ci	SCR_INT,
14688c2ecf20Sopenharmony_ci		SIR_REJECT_TO_SEND,
14698c2ecf20Sopenharmony_ci	SCR_SET (SCR_ATN),
14708c2ecf20Sopenharmony_ci		0,
14718c2ecf20Sopenharmony_ci}/*-------------------------< MSG_WEIRD1 >-----------------------*/,{
14728c2ecf20Sopenharmony_ci	SCR_CLR (SCR_ACK),
14738c2ecf20Sopenharmony_ci		0,
14748c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_IN)),
14758c2ecf20Sopenharmony_ci		PADDR_A (dispatch),
14768c2ecf20Sopenharmony_ci	SCR_MOVE_ABS (1) ^ SCR_MSG_IN,
14778c2ecf20Sopenharmony_ci		HADDR_1 (scratch),
14788c2ecf20Sopenharmony_ci	SCR_JUMP,
14798c2ecf20Sopenharmony_ci		PADDR_B (msg_weird1),
14808c2ecf20Sopenharmony_ci}/*-------------------------< WDTR_RESP >------------------------*/,{
14818c2ecf20Sopenharmony_ci	/*
14828c2ecf20Sopenharmony_ci	 *  let the target fetch our answer.
14838c2ecf20Sopenharmony_ci	 */
14848c2ecf20Sopenharmony_ci	SCR_SET (SCR_ATN),
14858c2ecf20Sopenharmony_ci		0,
14868c2ecf20Sopenharmony_ci	SCR_CLR (SCR_ACK),
14878c2ecf20Sopenharmony_ci		0,
14888c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_OUT)),
14898c2ecf20Sopenharmony_ci		PADDR_B (nego_bad_phase),
14908c2ecf20Sopenharmony_ci}/*-------------------------< SEND_WDTR >------------------------*/,{
14918c2ecf20Sopenharmony_ci	/*
14928c2ecf20Sopenharmony_ci	 *  Send the M_X_WIDE_REQ
14938c2ecf20Sopenharmony_ci	 */
14948c2ecf20Sopenharmony_ci	SCR_MOVE_ABS (4) ^ SCR_MSG_OUT,
14958c2ecf20Sopenharmony_ci		HADDR_1 (msgout),
14968c2ecf20Sopenharmony_ci	SCR_JUMP,
14978c2ecf20Sopenharmony_ci		PADDR_B (msg_out_done),
14988c2ecf20Sopenharmony_ci}/*-------------------------< SDTR_RESP >------------------------*/,{
14998c2ecf20Sopenharmony_ci	/*
15008c2ecf20Sopenharmony_ci	 *  let the target fetch our answer.
15018c2ecf20Sopenharmony_ci	 */
15028c2ecf20Sopenharmony_ci	SCR_SET (SCR_ATN),
15038c2ecf20Sopenharmony_ci		0,
15048c2ecf20Sopenharmony_ci	SCR_CLR (SCR_ACK),
15058c2ecf20Sopenharmony_ci		0,
15068c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_OUT)),
15078c2ecf20Sopenharmony_ci		PADDR_B (nego_bad_phase),
15088c2ecf20Sopenharmony_ci}/*-------------------------< SEND_SDTR >------------------------*/,{
15098c2ecf20Sopenharmony_ci	/*
15108c2ecf20Sopenharmony_ci	 *  Send the M_X_SYNC_REQ
15118c2ecf20Sopenharmony_ci	 */
15128c2ecf20Sopenharmony_ci	SCR_MOVE_ABS (5) ^ SCR_MSG_OUT,
15138c2ecf20Sopenharmony_ci		HADDR_1 (msgout),
15148c2ecf20Sopenharmony_ci	SCR_JUMP,
15158c2ecf20Sopenharmony_ci		PADDR_B (msg_out_done),
15168c2ecf20Sopenharmony_ci}/*-------------------------< PPR_RESP >-------------------------*/,{
15178c2ecf20Sopenharmony_ci	/*
15188c2ecf20Sopenharmony_ci	 *  let the target fetch our answer.
15198c2ecf20Sopenharmony_ci	 */
15208c2ecf20Sopenharmony_ci	SCR_SET (SCR_ATN),
15218c2ecf20Sopenharmony_ci		0,
15228c2ecf20Sopenharmony_ci	SCR_CLR (SCR_ACK),
15238c2ecf20Sopenharmony_ci		0,
15248c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_OUT)),
15258c2ecf20Sopenharmony_ci		PADDR_B (nego_bad_phase),
15268c2ecf20Sopenharmony_ci}/*-------------------------< SEND_PPR >-------------------------*/,{
15278c2ecf20Sopenharmony_ci	/*
15288c2ecf20Sopenharmony_ci	 *  Send the M_X_PPR_REQ
15298c2ecf20Sopenharmony_ci	 */
15308c2ecf20Sopenharmony_ci	SCR_MOVE_ABS (8) ^ SCR_MSG_OUT,
15318c2ecf20Sopenharmony_ci		HADDR_1 (msgout),
15328c2ecf20Sopenharmony_ci	SCR_JUMP,
15338c2ecf20Sopenharmony_ci		PADDR_B (msg_out_done),
15348c2ecf20Sopenharmony_ci}/*-------------------------< NEGO_BAD_PHASE >-------------------*/,{
15358c2ecf20Sopenharmony_ci	SCR_INT,
15368c2ecf20Sopenharmony_ci		SIR_NEGO_PROTO,
15378c2ecf20Sopenharmony_ci	SCR_JUMP,
15388c2ecf20Sopenharmony_ci		PADDR_A (dispatch),
15398c2ecf20Sopenharmony_ci}/*-------------------------< MSG_OUT >--------------------------*/,{
15408c2ecf20Sopenharmony_ci	/*
15418c2ecf20Sopenharmony_ci	 *  The target requests a message.
15428c2ecf20Sopenharmony_ci	 *  We donnot send messages that may
15438c2ecf20Sopenharmony_ci	 *  require the device to go to bus free.
15448c2ecf20Sopenharmony_ci	 */
15458c2ecf20Sopenharmony_ci	SCR_MOVE_ABS (1) ^ SCR_MSG_OUT,
15468c2ecf20Sopenharmony_ci		HADDR_1 (msgout),
15478c2ecf20Sopenharmony_ci	/*
15488c2ecf20Sopenharmony_ci	 *  ... wait for the next phase
15498c2ecf20Sopenharmony_ci	 *  if it's a message out, send it again, ...
15508c2ecf20Sopenharmony_ci	 */
15518c2ecf20Sopenharmony_ci	SCR_JUMP ^ IFTRUE (WHEN (SCR_MSG_OUT)),
15528c2ecf20Sopenharmony_ci		PADDR_B (msg_out),
15538c2ecf20Sopenharmony_ci}/*-------------------------< MSG_OUT_DONE >---------------------*/,{
15548c2ecf20Sopenharmony_ci	/*
15558c2ecf20Sopenharmony_ci	 *  Let the C code be aware of the
15568c2ecf20Sopenharmony_ci	 *  sent message and clear the message.
15578c2ecf20Sopenharmony_ci	 */
15588c2ecf20Sopenharmony_ci	SCR_INT,
15598c2ecf20Sopenharmony_ci		SIR_MSG_OUT_DONE,
15608c2ecf20Sopenharmony_ci	/*
15618c2ecf20Sopenharmony_ci	 *  ... and process the next phase
15628c2ecf20Sopenharmony_ci	 */
15638c2ecf20Sopenharmony_ci	SCR_JUMP,
15648c2ecf20Sopenharmony_ci		PADDR_A (dispatch),
15658c2ecf20Sopenharmony_ci}/*-------------------------< DATA_OVRUN >-----------------------*/,{
15668c2ecf20Sopenharmony_ci	/*
15678c2ecf20Sopenharmony_ci	 *  Zero scratcha that will count the
15688c2ecf20Sopenharmony_ci	 *  extras bytes.
15698c2ecf20Sopenharmony_ci	 */
15708c2ecf20Sopenharmony_ci	SCR_COPY (4),
15718c2ecf20Sopenharmony_ci		PADDR_B (zero),
15728c2ecf20Sopenharmony_ci		RADDR_1 (scratcha),
15738c2ecf20Sopenharmony_ci}/*-------------------------< DATA_OVRUN1 >----------------------*/,{
15748c2ecf20Sopenharmony_ci	/*
15758c2ecf20Sopenharmony_ci	 *  The target may want to transfer too much data.
15768c2ecf20Sopenharmony_ci	 *
15778c2ecf20Sopenharmony_ci	 *  If phase is DATA OUT write 1 byte and count it.
15788c2ecf20Sopenharmony_ci	 */
15798c2ecf20Sopenharmony_ci	SCR_JUMPR ^ IFFALSE (WHEN (SCR_DATA_OUT)),
15808c2ecf20Sopenharmony_ci		16,
15818c2ecf20Sopenharmony_ci	SCR_CHMOV_ABS (1) ^ SCR_DATA_OUT,
15828c2ecf20Sopenharmony_ci		HADDR_1 (scratch),
15838c2ecf20Sopenharmony_ci	SCR_JUMP,
15848c2ecf20Sopenharmony_ci		PADDR_B (data_ovrun2),
15858c2ecf20Sopenharmony_ci	/*
15868c2ecf20Sopenharmony_ci	 *  If WSR is set, clear this condition, and
15878c2ecf20Sopenharmony_ci	 *  count this byte.
15888c2ecf20Sopenharmony_ci	 */
15898c2ecf20Sopenharmony_ci	SCR_FROM_REG (scntl2),
15908c2ecf20Sopenharmony_ci		0,
15918c2ecf20Sopenharmony_ci	SCR_JUMPR ^ IFFALSE (MASK (WSR, WSR)),
15928c2ecf20Sopenharmony_ci		16,
15938c2ecf20Sopenharmony_ci	SCR_REG_REG (scntl2, SCR_OR, WSR),
15948c2ecf20Sopenharmony_ci		0,
15958c2ecf20Sopenharmony_ci	SCR_JUMP,
15968c2ecf20Sopenharmony_ci		PADDR_B (data_ovrun2),
15978c2ecf20Sopenharmony_ci	/*
15988c2ecf20Sopenharmony_ci	 *  Finally check against DATA IN phase.
15998c2ecf20Sopenharmony_ci	 *  Signal data overrun to the C code
16008c2ecf20Sopenharmony_ci	 *  and jump to dispatcher if not so.
16018c2ecf20Sopenharmony_ci	 *  Read 1 byte otherwise and count it.
16028c2ecf20Sopenharmony_ci	 */
16038c2ecf20Sopenharmony_ci	SCR_JUMPR ^ IFTRUE (WHEN (SCR_DATA_IN)),
16048c2ecf20Sopenharmony_ci		16,
16058c2ecf20Sopenharmony_ci	SCR_INT,
16068c2ecf20Sopenharmony_ci		SIR_DATA_OVERRUN,
16078c2ecf20Sopenharmony_ci	SCR_JUMP,
16088c2ecf20Sopenharmony_ci		PADDR_A (dispatch),
16098c2ecf20Sopenharmony_ci	SCR_CHMOV_ABS (1) ^ SCR_DATA_IN,
16108c2ecf20Sopenharmony_ci		HADDR_1 (scratch),
16118c2ecf20Sopenharmony_ci}/*-------------------------< DATA_OVRUN2 >----------------------*/,{
16128c2ecf20Sopenharmony_ci	/*
16138c2ecf20Sopenharmony_ci	 *  Count this byte.
16148c2ecf20Sopenharmony_ci	 *  This will allow to return a negative
16158c2ecf20Sopenharmony_ci	 *  residual to user.
16168c2ecf20Sopenharmony_ci	 */
16178c2ecf20Sopenharmony_ci	SCR_REG_REG (scratcha,  SCR_ADD,  0x01),
16188c2ecf20Sopenharmony_ci		0,
16198c2ecf20Sopenharmony_ci	SCR_REG_REG (scratcha1, SCR_ADDC, 0),
16208c2ecf20Sopenharmony_ci		0,
16218c2ecf20Sopenharmony_ci	SCR_REG_REG (scratcha2, SCR_ADDC, 0),
16228c2ecf20Sopenharmony_ci		0,
16238c2ecf20Sopenharmony_ci	/*
16248c2ecf20Sopenharmony_ci	 *  .. and repeat as required.
16258c2ecf20Sopenharmony_ci	 */
16268c2ecf20Sopenharmony_ci	SCR_JUMP,
16278c2ecf20Sopenharmony_ci		PADDR_B (data_ovrun1),
16288c2ecf20Sopenharmony_ci}/*-------------------------< ABORT_RESEL >----------------------*/,{
16298c2ecf20Sopenharmony_ci	SCR_SET (SCR_ATN),
16308c2ecf20Sopenharmony_ci		0,
16318c2ecf20Sopenharmony_ci	SCR_CLR (SCR_ACK),
16328c2ecf20Sopenharmony_ci		0,
16338c2ecf20Sopenharmony_ci	/*
16348c2ecf20Sopenharmony_ci	 *  send the abort/abortag/reset message
16358c2ecf20Sopenharmony_ci	 *  we expect an immediate disconnect
16368c2ecf20Sopenharmony_ci	 */
16378c2ecf20Sopenharmony_ci	SCR_REG_REG (scntl2, SCR_AND, 0x7f),
16388c2ecf20Sopenharmony_ci		0,
16398c2ecf20Sopenharmony_ci	SCR_MOVE_ABS (1) ^ SCR_MSG_OUT,
16408c2ecf20Sopenharmony_ci		HADDR_1 (msgout),
16418c2ecf20Sopenharmony_ci	SCR_CLR (SCR_ACK|SCR_ATN),
16428c2ecf20Sopenharmony_ci		0,
16438c2ecf20Sopenharmony_ci	SCR_WAIT_DISC,
16448c2ecf20Sopenharmony_ci		0,
16458c2ecf20Sopenharmony_ci	SCR_INT,
16468c2ecf20Sopenharmony_ci		SIR_RESEL_ABORTED,
16478c2ecf20Sopenharmony_ci	SCR_JUMP,
16488c2ecf20Sopenharmony_ci		PADDR_A (start),
16498c2ecf20Sopenharmony_ci}/*-------------------------< RESEND_IDENT >---------------------*/,{
16508c2ecf20Sopenharmony_ci	/*
16518c2ecf20Sopenharmony_ci	 *  The target stays in MSG OUT phase after having acked
16528c2ecf20Sopenharmony_ci	 *  Identify [+ Tag [+ Extended message ]]. Targets shall
16538c2ecf20Sopenharmony_ci	 *  behave this way on parity error.
16548c2ecf20Sopenharmony_ci	 *  We must send it again all the messages.
16558c2ecf20Sopenharmony_ci	 */
16568c2ecf20Sopenharmony_ci	SCR_SET (SCR_ATN), /* Shall be asserted 2 deskew delays before the  */
16578c2ecf20Sopenharmony_ci		0,         /* 1rst ACK = 90 ns. Hope the chip isn't too fast */
16588c2ecf20Sopenharmony_ci	SCR_JUMP,
16598c2ecf20Sopenharmony_ci		PADDR_A (send_ident),
16608c2ecf20Sopenharmony_ci}/*-------------------------< IDENT_BREAK >----------------------*/,{
16618c2ecf20Sopenharmony_ci	SCR_CLR (SCR_ATN),
16628c2ecf20Sopenharmony_ci		0,
16638c2ecf20Sopenharmony_ci	SCR_JUMP,
16648c2ecf20Sopenharmony_ci		PADDR_A (select2),
16658c2ecf20Sopenharmony_ci}/*-------------------------< IDENT_BREAK_ATN >------------------*/,{
16668c2ecf20Sopenharmony_ci	SCR_SET (SCR_ATN),
16678c2ecf20Sopenharmony_ci		0,
16688c2ecf20Sopenharmony_ci	SCR_JUMP,
16698c2ecf20Sopenharmony_ci		PADDR_A (select2),
16708c2ecf20Sopenharmony_ci}/*-------------------------< SDATA_IN >-------------------------*/,{
16718c2ecf20Sopenharmony_ci	SCR_CHMOV_TBL ^ SCR_DATA_IN,
16728c2ecf20Sopenharmony_ci		offsetof (struct sym_dsb, sense),
16738c2ecf20Sopenharmony_ci	SCR_CALL,
16748c2ecf20Sopenharmony_ci		PADDR_A (datai_done),
16758c2ecf20Sopenharmony_ci	SCR_JUMP,
16768c2ecf20Sopenharmony_ci		PADDR_B (data_ovrun),
16778c2ecf20Sopenharmony_ci}/*-------------------------< RESEL_BAD_LUN >--------------------*/,{
16788c2ecf20Sopenharmony_ci	/*
16798c2ecf20Sopenharmony_ci	 *  Message is an IDENTIFY, but lun is unknown.
16808c2ecf20Sopenharmony_ci	 *  Signal problem to C code for logging the event.
16818c2ecf20Sopenharmony_ci	 *  Send a M_ABORT to clear all pending tasks.
16828c2ecf20Sopenharmony_ci	 */
16838c2ecf20Sopenharmony_ci	SCR_INT,
16848c2ecf20Sopenharmony_ci		SIR_RESEL_BAD_LUN,
16858c2ecf20Sopenharmony_ci	SCR_JUMP,
16868c2ecf20Sopenharmony_ci		PADDR_B (abort_resel),
16878c2ecf20Sopenharmony_ci}/*-------------------------< BAD_I_T_L >------------------------*/,{
16888c2ecf20Sopenharmony_ci	/*
16898c2ecf20Sopenharmony_ci	 *  We donnot have a task for that I_T_L.
16908c2ecf20Sopenharmony_ci	 *  Signal problem to C code for logging the event.
16918c2ecf20Sopenharmony_ci	 *  Send a M_ABORT message.
16928c2ecf20Sopenharmony_ci	 */
16938c2ecf20Sopenharmony_ci	SCR_INT,
16948c2ecf20Sopenharmony_ci		SIR_RESEL_BAD_I_T_L,
16958c2ecf20Sopenharmony_ci	SCR_JUMP,
16968c2ecf20Sopenharmony_ci		PADDR_B (abort_resel),
16978c2ecf20Sopenharmony_ci}/*-------------------------< BAD_I_T_L_Q >----------------------*/,{
16988c2ecf20Sopenharmony_ci	/*
16998c2ecf20Sopenharmony_ci	 *  We donnot have a task that matches the tag.
17008c2ecf20Sopenharmony_ci	 *  Signal problem to C code for logging the event.
17018c2ecf20Sopenharmony_ci	 *  Send a M_ABORTTAG message.
17028c2ecf20Sopenharmony_ci	 */
17038c2ecf20Sopenharmony_ci	SCR_INT,
17048c2ecf20Sopenharmony_ci		SIR_RESEL_BAD_I_T_L_Q,
17058c2ecf20Sopenharmony_ci	SCR_JUMP,
17068c2ecf20Sopenharmony_ci		PADDR_B (abort_resel),
17078c2ecf20Sopenharmony_ci}/*-------------------------< BAD_STATUS >-----------------------*/,{
17088c2ecf20Sopenharmony_ci	/*
17098c2ecf20Sopenharmony_ci	 *  Anything different from INTERMEDIATE
17108c2ecf20Sopenharmony_ci	 *  CONDITION MET should be a bad SCSI status,
17118c2ecf20Sopenharmony_ci	 *  given that GOOD status has already been tested.
17128c2ecf20Sopenharmony_ci	 *  Call the C code.
17138c2ecf20Sopenharmony_ci	 */
17148c2ecf20Sopenharmony_ci	SCR_COPY (4),
17158c2ecf20Sopenharmony_ci		PADDR_B (startpos),
17168c2ecf20Sopenharmony_ci		RADDR_1 (scratcha),
17178c2ecf20Sopenharmony_ci	SCR_INT ^ IFFALSE (DATA (S_COND_MET)),
17188c2ecf20Sopenharmony_ci		SIR_BAD_SCSI_STATUS,
17198c2ecf20Sopenharmony_ci	SCR_RETURN,
17208c2ecf20Sopenharmony_ci		0,
17218c2ecf20Sopenharmony_ci}/*-------------------------< WSR_MA_HELPER >--------------------*/,{
17228c2ecf20Sopenharmony_ci	/*
17238c2ecf20Sopenharmony_ci	 *  Helper for the C code when WSR bit is set.
17248c2ecf20Sopenharmony_ci	 *  Perform the move of the residual byte.
17258c2ecf20Sopenharmony_ci	 */
17268c2ecf20Sopenharmony_ci	SCR_CHMOV_TBL ^ SCR_DATA_IN,
17278c2ecf20Sopenharmony_ci		offsetof (struct sym_ccb, phys.wresid),
17288c2ecf20Sopenharmony_ci	SCR_JUMP,
17298c2ecf20Sopenharmony_ci		PADDR_A (dispatch),
17308c2ecf20Sopenharmony_ci
17318c2ecf20Sopenharmony_ci}/*-------------------------< ZERO >-----------------------------*/,{
17328c2ecf20Sopenharmony_ci	SCR_DATA_ZERO,
17338c2ecf20Sopenharmony_ci}/*-------------------------< SCRATCH >--------------------------*/,{
17348c2ecf20Sopenharmony_ci	SCR_DATA_ZERO, /* MUST BE BEFORE SCRATCH1 */
17358c2ecf20Sopenharmony_ci}/*-------------------------< SCRATCH1 >-------------------------*/,{
17368c2ecf20Sopenharmony_ci	SCR_DATA_ZERO,
17378c2ecf20Sopenharmony_ci}/*-------------------------< PREV_DONE >------------------------*/,{
17388c2ecf20Sopenharmony_ci	SCR_DATA_ZERO, /* MUST BE BEFORE DONE_POS ! */
17398c2ecf20Sopenharmony_ci}/*-------------------------< DONE_POS >-------------------------*/,{
17408c2ecf20Sopenharmony_ci	SCR_DATA_ZERO,
17418c2ecf20Sopenharmony_ci}/*-------------------------< NEXTJOB >--------------------------*/,{
17428c2ecf20Sopenharmony_ci	SCR_DATA_ZERO, /* MUST BE BEFORE STARTPOS ! */
17438c2ecf20Sopenharmony_ci}/*-------------------------< STARTPOS >-------------------------*/,{
17448c2ecf20Sopenharmony_ci	SCR_DATA_ZERO,
17458c2ecf20Sopenharmony_ci}/*-------------------------< TARGTBL >--------------------------*/,{
17468c2ecf20Sopenharmony_ci	SCR_DATA_ZERO,
17478c2ecf20Sopenharmony_ci}/*--------------------------<>----------------------------------*/
17488c2ecf20Sopenharmony_ci};
17498c2ecf20Sopenharmony_ci
17508c2ecf20Sopenharmony_cistatic struct SYM_FWZ_SCR SYM_FWZ_SCR = {
17518c2ecf20Sopenharmony_ci /*-------------------------< SNOOPTEST >------------------------*/{
17528c2ecf20Sopenharmony_ci	/*
17538c2ecf20Sopenharmony_ci	 *  Read the variable.
17548c2ecf20Sopenharmony_ci	 */
17558c2ecf20Sopenharmony_ci	SCR_COPY (4),
17568c2ecf20Sopenharmony_ci		HADDR_1 (scratch),
17578c2ecf20Sopenharmony_ci		RADDR_1 (scratcha),
17588c2ecf20Sopenharmony_ci	/*
17598c2ecf20Sopenharmony_ci	 *  Write the variable.
17608c2ecf20Sopenharmony_ci	 */
17618c2ecf20Sopenharmony_ci	SCR_COPY (4),
17628c2ecf20Sopenharmony_ci		RADDR_1 (temp),
17638c2ecf20Sopenharmony_ci		HADDR_1 (scratch),
17648c2ecf20Sopenharmony_ci	/*
17658c2ecf20Sopenharmony_ci	 *  Read back the variable.
17668c2ecf20Sopenharmony_ci	 */
17678c2ecf20Sopenharmony_ci	SCR_COPY (4),
17688c2ecf20Sopenharmony_ci		HADDR_1 (scratch),
17698c2ecf20Sopenharmony_ci		RADDR_1 (temp),
17708c2ecf20Sopenharmony_ci}/*-------------------------< SNOOPEND >-------------------------*/,{
17718c2ecf20Sopenharmony_ci	/*
17728c2ecf20Sopenharmony_ci	 *  And stop.
17738c2ecf20Sopenharmony_ci	 */
17748c2ecf20Sopenharmony_ci	SCR_INT,
17758c2ecf20Sopenharmony_ci		99,
17768c2ecf20Sopenharmony_ci}/*--------------------------<>----------------------------------*/
17778c2ecf20Sopenharmony_ci};
1778