sym_fw1.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:47k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

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