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