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

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