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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Adaptec 274x/284x/294x device driver firmware for Linux and FreeBSD.
  3.  *
  4.  * Copyright (c) 1994-2001 Justin T. Gibbs.
  5.  * Copyright (c) 2000-2001 Adaptec Inc.
  6.  * All rights reserved.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions, and the following disclaimer,
  13.  *    without modification.
  14.  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
  15.  *    substantially similar to the "NO WARRANTY" disclaimer below
  16.  *    ("Disclaimer") and any redistribution must be conditioned upon
  17.  *    including a substantially similar Disclaimer requirement for further
  18.  *    binary redistribution.
  19.  * 3. Neither the names of the above-listed copyright holders nor the names
  20.  *    of any contributors may be used to endorse or promote products derived
  21.  *    from this software without specific prior written permission.
  22.  *
  23.  * Alternatively, this software may be distributed under the terms of the
  24.  * GNU General Public License ("GPL") version 2 as published by the Free
  25.  * Software Foundation.
  26.  *
  27.  * NO WARRANTY
  28.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  29.  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  30.  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
  31.  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  32.  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  33.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  34.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  35.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  36.  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
  37.  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  38.  * POSSIBILITY OF SUCH DAMAGES.
  39.  *
  40.  * $FreeBSD: src/sys/dev/aic7xxx/aic7xxx.seq,v 1.106 2000/11/12 05:19:46 gibbs Exp $
  41.  */
  42. VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic7xxx.seq#37 $"
  43. #include "aic7xxx.reg"
  44. #include "scsi_message.h"
  45. /*
  46.  * A few words on the waiting SCB list:
  47.  * After starting the selection hardware, we check for reconnecting targets
  48.  * as well as for our selection to complete just in case the reselection wins
  49.  * bus arbitration.  The problem with this is that we must keep track of the
  50.  * SCB that we've already pulled from the QINFIFO and started the selection
  51.  * on just in case the reselection wins so that we can retry the selection at
  52.  * a later time.  This problem cannot be resolved by holding a single entry
  53.  * in scratch ram since a reconnecting target can request sense and this will
  54.  * create yet another SCB waiting for selection.  The solution used here is to 
  55.  * use byte 27 of the SCB as a psuedo-next pointer and to thread a list
  56.  * of SCBs that are awaiting selection.  Since 0-0xfe are valid SCB indexes, 
  57.  * SCB_LIST_NULL is 0xff which is out of range.  An entry is also added to
  58.  * this list everytime a request sense occurs or after completing a non-tagged
  59.  * command for which a second SCB has been queued.  The sequencer will
  60.  * automatically consume the entries.
  61.  */
  62. bus_free_sel:
  63. /*
  64.  * Turn off the selection hardware.  We need to reset the
  65.  * selection request in order to perform a new selection.
  66.  */
  67. and SCSISEQ, TEMODE|ENSELI|ENRSELI|ENAUTOATNP, SCSISEQ;
  68. and SIMODE1, ~ENBUSFREE;
  69. poll_for_work:
  70. call clear_target_state;
  71. and SXFRCTL0, ~SPIOEN;
  72. if ((ahc->features & AHC_ULTRA2) != 0) {
  73. clr SCSIBUSL;
  74. }
  75. test SCSISEQ, ENSELO jnz poll_for_selection;
  76. if ((ahc->features & AHC_TWIN) != 0) {
  77. xor SBLKCTL,SELBUSB; /* Toggle to the other bus */
  78. test SCSISEQ, ENSELO jnz poll_for_selection;
  79. }
  80. cmp WAITING_SCBH,SCB_LIST_NULL jne start_waiting;
  81. poll_for_work_loop:
  82. if ((ahc->features & AHC_TWIN) != 0) {
  83. xor SBLKCTL,SELBUSB; /* Toggle to the other bus */
  84. }
  85. test SSTAT0, SELDO|SELDI jnz selection;
  86. test_queue:
  87. /* Has the driver posted any work for us? */
  88. BEGIN_CRITICAL
  89. if ((ahc->features & AHC_QUEUE_REGS) != 0) {
  90. test QOFF_CTLSTA, SCB_AVAIL jz poll_for_work_loop;
  91. } else {
  92. mov A, QINPOS;
  93. cmp KERNEL_QINPOS, A je poll_for_work_loop;
  94. }
  95. mov ARG_1, NEXT_QUEUED_SCB;
  96. /*
  97.  * We have at least one queued SCB now and we don't have any 
  98.  * SCBs in the list of SCBs awaiting selection.  Allocate a
  99.  * card SCB for the host's SCB and get to work on it.
  100.  */
  101. if ((ahc->flags & AHC_PAGESCBS) != 0) {
  102. mov ALLZEROS call get_free_or_disc_scb;
  103. } else {
  104. /* In the non-paging case, the SCBID == hardware SCB index */
  105. mov SCBPTR, ARG_1;
  106. }
  107. or SEQ_FLAGS2, SCB_DMA;
  108. END_CRITICAL
  109. dma_queued_scb:
  110. /*
  111.  * DMA the SCB from host ram into the current SCB location.
  112.  */
  113. mvi DMAPARAMS, HDMAEN|DIRECTION|FIFORESET;
  114. mov ARG_1 call dma_scb;
  115. /*
  116.  * Check one last time to see if this SCB was canceled
  117.  * before we completed the DMA operation.  If it was,
  118.  * the QINFIFO next pointer will not match our saved
  119.  * value.
  120.  */
  121. mov A, ARG_1;
  122. BEGIN_CRITICAL
  123. cmp NEXT_QUEUED_SCB, A jne abort_qinscb;
  124. if ((ahc->flags & AHC_SEQUENCER_DEBUG) != 0) {
  125. cmp SCB_TAG, A je . + 2;
  126. mvi SCB_MISMATCH call set_seqint;
  127. }
  128. mov NEXT_QUEUED_SCB, SCB_NEXT;
  129. mov SCB_NEXT,WAITING_SCBH;
  130. mov WAITING_SCBH, SCBPTR;
  131. if ((ahc->features & AHC_QUEUE_REGS) != 0) {
  132. mov NONE, SNSCB_QOFF;
  133. } else {
  134. inc QINPOS;
  135. }
  136. and SEQ_FLAGS2, ~SCB_DMA;
  137. END_CRITICAL
  138. start_waiting:
  139. /*
  140.  * Start the first entry on the waiting SCB list.
  141.  */
  142. mov SCBPTR, WAITING_SCBH;
  143. call start_selection;
  144. poll_for_selection:
  145. /*
  146.  * Twin channel devices cannot handle things like SELTO
  147.  * interrupts on the "background" channel.  So, while
  148.  * selecting, keep polling the current channel until
  149.  * either a selection or reselection occurs.
  150.  */
  151. test SSTAT0, SELDO|SELDI jz poll_for_selection;
  152. selection:
  153. /*
  154.  * We aren't expecting a bus free, so interrupt
  155.  * the kernel driver if it happens.
  156.  */
  157. mvi CLRSINT1,CLRBUSFREE;
  158. if ((ahc->features & AHC_DT) == 0) {
  159. or SIMODE1, ENBUSFREE;
  160. }
  161. /*
  162.  * Guard against a bus free after (re)selection
  163.  * but prior to enabling the busfree interrupt.  SELDI
  164.  * and SELDO will be cleared in that case.
  165.  */
  166. test SSTAT0, SELDI|SELDO jz bus_free_sel;
  167. test SSTAT0,SELDO jnz select_out;
  168. select_in:
  169. if ((ahc->flags & AHC_TARGETROLE) != 0) {
  170. if ((ahc->flags & AHC_INITIATORROLE) != 0) {
  171. test SSTAT0, TARGET jz initiator_reselect;
  172. }
  173. mvi CLRSINT0, CLRSELDI;
  174. /*
  175.  * We've just been selected.  Assert BSY and
  176.  * setup the phase for receiving messages
  177.  * from the target.
  178.  */
  179. mvi SCSISIGO, P_MESGOUT|BSYO;
  180. /*
  181.  * Setup the DMA for sending the identify and
  182.  * command information.
  183.  */
  184. or SEQ_FLAGS, CMDPHASE_PENDING;
  185. mov     A, TQINPOS;
  186. if ((ahc->features & AHC_CMD_CHAN) != 0) {
  187. mvi DINDEX, CCHADDR;
  188. mvi SHARED_DATA_ADDR call set_32byte_addr;
  189. mvi CCSCBCTL, CCSCBRESET;
  190. } else {
  191. mvi DINDEX, HADDR;
  192. mvi SHARED_DATA_ADDR call set_32byte_addr;
  193. mvi DFCNTRL, FIFORESET;
  194. }
  195. /* Initiator that selected us */
  196. and SAVED_SCSIID, SELID_MASK, SELID;
  197. /* The Target ID we were selected at */
  198. if ((ahc->features & AHC_MULTI_TID) != 0) {
  199. and A, OID, TARGIDIN;
  200. } else if ((ahc->features & AHC_ULTRA2) != 0) {
  201. and A, OID, SCSIID_ULTRA2;
  202. } else {
  203. and A, OID, SCSIID;
  204. }
  205. or SAVED_SCSIID, A;
  206. if ((ahc->features & AHC_TWIN) != 0) {
  207. test  SBLKCTL, SELBUSB jz . + 2;
  208. or SAVED_SCSIID, TWIN_CHNLB;
  209. }
  210. if ((ahc->features & AHC_CMD_CHAN) != 0) {
  211. mov CCSCBRAM, SAVED_SCSIID;
  212. } else {
  213. mov DFDAT, SAVED_SCSIID;
  214. }
  215. /*
  216.  * If ATN isn't asserted, the target isn't interested
  217.  * in talking to us.  Go directly to bus free.
  218.  * XXX SCSI-1 may require us to assume lun 0 if
  219.  * ATN is false.
  220.  */
  221. test SCSISIGI, ATNI jz target_busfree;
  222. /*
  223.  * Watch ATN closely now as we pull in messages from the
  224.  * initiator.  We follow the guidlines from section 6.5
  225.  * of the SCSI-2 spec for what messages are allowed when.
  226.  */
  227. call target_inb;
  228. /*
  229.  * Our first message must be one of IDENTIFY, ABORT, or
  230.  * BUS_DEVICE_RESET.
  231.  */
  232. test DINDEX, MSG_IDENTIFYFLAG jz host_target_message_loop;
  233. /* Store for host */
  234. if ((ahc->features & AHC_CMD_CHAN) != 0) {
  235. mov CCSCBRAM, DINDEX;
  236. } else {
  237. mov DFDAT, DINDEX;
  238. }
  239. and SAVED_LUN, MSG_IDENTIFY_LUNMASK, DINDEX;
  240. /* Remember for disconnection decision */
  241. test DINDEX, MSG_IDENTIFY_DISCFLAG jnz . + 2;
  242. /* XXX Honor per target settings too */
  243. or SEQ_FLAGS, NO_DISCONNECT;
  244. test SCSISIGI, ATNI jz ident_messages_done;
  245. call target_inb;
  246. /*
  247.  * If this is a tagged request, the tagged message must
  248.  * immediately follow the identify.  We test for a valid
  249.  * tag message by seeing if it is >= MSG_SIMPLE_Q_TAG and
  250.  * < MSG_IGN_WIDE_RESIDUE.
  251.  */
  252. add A, -MSG_SIMPLE_Q_TAG, DINDEX;
  253. jnc ident_messages_done_msg_pending;
  254. add A, -MSG_IGN_WIDE_RESIDUE, DINDEX;
  255. jc ident_messages_done_msg_pending;
  256. /* Store for host */
  257. if ((ahc->features & AHC_CMD_CHAN) != 0) {
  258. mov CCSCBRAM, DINDEX;
  259. } else {
  260. mov DFDAT, DINDEX;
  261. }
  262. /*
  263.  * If the initiator doesn't feel like providing a tag number,
  264.  * we've got a failed selection and must transition to bus
  265.  * free.
  266.  */
  267. test SCSISIGI, ATNI jz target_busfree;
  268. /*
  269.  * Store the tag for the host.
  270.  */
  271. call target_inb;
  272. if ((ahc->features & AHC_CMD_CHAN) != 0) {
  273. mov CCSCBRAM, DINDEX;
  274. } else {
  275. mov DFDAT, DINDEX;
  276. }
  277. mov INITIATOR_TAG, DINDEX;
  278. or SEQ_FLAGS, TARGET_CMD_IS_TAGGED;
  279. ident_messages_done:
  280. /* Terminate the ident list */
  281. if ((ahc->features & AHC_CMD_CHAN) != 0) {
  282. mvi CCSCBRAM, SCB_LIST_NULL;
  283. } else {
  284. mvi DFDAT, SCB_LIST_NULL;
  285. }
  286. or SEQ_FLAGS, TARG_CMD_PENDING|IDENTIFY_SEEN;
  287. test SEQ_FLAGS2, TARGET_MSG_PENDING
  288. jnz target_mesgout_pending;
  289. test SCSISIGI, ATNI jnz target_mesgout_continue;
  290. jmp target_ITloop;
  291. ident_messages_done_msg_pending:
  292. or SEQ_FLAGS2, TARGET_MSG_PENDING;
  293. jmp ident_messages_done;
  294. /*
  295.  * Pushed message loop to allow the kernel to
  296.  * run it's own target mode message state engine.
  297.  */
  298. host_target_message_loop:
  299. mvi HOST_MSG_LOOP call set_seqint;
  300. cmp RETURN_1, EXIT_MSG_LOOP je target_ITloop;
  301. test SSTAT0, SPIORDY jz .;
  302. jmp host_target_message_loop;
  303. }
  304. if ((ahc->flags & AHC_INITIATORROLE) != 0) {
  305. /*
  306.  * Reselection has been initiated by a target. Make a note that we've been
  307.  * reselected, but haven't seen an IDENTIFY message from the target yet.
  308.  */
  309. initiator_reselect:
  310. /* XXX test for and handle ONE BIT condition */
  311. or SXFRCTL0, SPIOEN|CLRSTCNT|CLRCHN;
  312. and SAVED_SCSIID, SELID_MASK, SELID;
  313. if ((ahc->features & AHC_ULTRA2) != 0) {
  314. and A, OID, SCSIID_ULTRA2;
  315. } else {
  316. and A, OID, SCSIID;
  317. }
  318. or SAVED_SCSIID, A;
  319. if ((ahc->features & AHC_TWIN) != 0) {
  320. test SBLKCTL, SELBUSB jz . + 2;
  321. or SAVED_SCSIID, TWIN_CHNLB;
  322. }
  323. mvi CLRSINT0, CLRSELDI;
  324. jmp ITloop;
  325. }
  326. abort_qinscb:
  327. call add_scb_to_free_list;
  328. jmp poll_for_work_loop;
  329. start_selection:
  330. /*
  331.  * If bus reset interrupts have been disabled (from a previous
  332.  * reset), re-enable them now.  Resets are only of interest
  333.  * when we have outstanding transactions, so we can safely
  334.  * defer re-enabling the interrupt until, as an initiator,
  335.  * we start sending out transactions again.
  336.  */
  337. test SIMODE1, ENSCSIRST jnz . + 3;
  338. mvi CLRSINT1, CLRSCSIRSTI;
  339. or SIMODE1, ENSCSIRST;
  340. if ((ahc->features & AHC_TWIN) != 0) {
  341. and SINDEX,~SELBUSB,SBLKCTL;/* Clear channel select bit */
  342. test SCB_SCSIID, TWIN_CHNLB jz . + 2;
  343. or SINDEX, SELBUSB;
  344. mov SBLKCTL,SINDEX; /* select channel */
  345. }
  346. initialize_scsiid:
  347. if ((ahc->features & AHC_ULTRA2) != 0) {
  348. mov SCSIID_ULTRA2, SCB_SCSIID;
  349. } else if ((ahc->features & AHC_TWIN) != 0) {
  350. and SCSIID, TWIN_TID|OID, SCB_SCSIID;
  351. } else {
  352. mov SCSIID, SCB_SCSIID;
  353. }
  354. if ((ahc->flags & AHC_TARGETROLE) != 0) {
  355. mov SINDEX, SCSISEQ_TEMPLATE;
  356. test SCB_CONTROL, TARGET_SCB jz . + 2;
  357. or SINDEX, TEMODE;
  358. mov SCSISEQ, SINDEX ret;
  359. } else {
  360. mov SCSISEQ, SCSISEQ_TEMPLATE ret;
  361. }
  362. /*
  363.  * Initialize transfer settings and clear the SCSI channel.
  364.  * SINDEX should contain any additional bit's the client wants
  365.  * set in SXFRCTL0.  We also assume that the current SCB is
  366.  * a valid SCB for the target we wish to talk to.
  367.  */
  368. initialize_channel:
  369. or SXFRCTL0, SPIOEN|CLRSTCNT|CLRCHN;
  370. set_transfer_settings:
  371. if ((ahc->features & AHC_ULTRA) != 0) {
  372. test SCB_CONTROL, ULTRAENB jz . + 2;
  373. or SXFRCTL0, FAST20;
  374. /*
  375.  * Initialize SCSIRATE with the appropriate value for this target.
  376.  */
  377. if ((ahc->features & AHC_ULTRA2) != 0) {
  378. bmov SCSIRATE, SCB_SCSIRATE, 2 ret;
  379. } else {
  380. mov SCSIRATE, SCB_SCSIRATE ret;
  381. }
  382. if ((ahc->flags & AHC_TARGETROLE) != 0) {
  383. /*
  384.  * We carefully toggle SPIOEN to allow us to return the 
  385.  * message byte we receive so it can be checked prior to
  386.  * driving REQ on the bus for the next byte.
  387.  */
  388. target_inb:
  389. /*
  390.  * Drive REQ on the bus by enabling SCSI PIO.
  391.  */
  392. or SXFRCTL0, SPIOEN;
  393. /* Wait for the byte */
  394. test SSTAT0, SPIORDY jz .;
  395. /* Prevent our read from triggering another REQ */
  396. and SXFRCTL0, ~SPIOEN;
  397. /* Save latched contents */
  398. mov DINDEX, SCSIDATL ret;
  399. }
  400. /*
  401.  * After the selection, remove this SCB from the "waiting SCB"
  402.  * list.  This is achieved by simply moving our "next" pointer into
  403.  * WAITING_SCBH.  Our next pointer will be set to null the next time this
  404.  * SCB is used, so don't bother with it now.
  405.  */
  406. select_out:
  407. /* Turn off the selection hardware */
  408. and SCSISEQ, TEMODE|ENSELI|ENRSELI|ENAUTOATNP, SCSISEQ;
  409. mvi CLRSINT0, CLRSELDO;
  410. mov SCBPTR, WAITING_SCBH;
  411. mov WAITING_SCBH,SCB_NEXT;
  412. mov SAVED_SCSIID, SCB_SCSIID;
  413. mov SAVED_LUN, SCB_LUN;
  414. call initialize_channel;
  415. if ((ahc->flags & AHC_TARGETROLE) != 0) {
  416. test SSTAT0, TARGET jz initiator_select;
  417. /*
  418.  * We've just re-selected an initiator.
  419.  * Assert BSY and setup the phase for
  420.  * sending our identify messages.
  421.  */
  422. mvi P_MESGIN|BSYO call change_phase;
  423. /*
  424.  * Start out with a simple identify message.
  425.  */
  426. or SCB_LUN, MSG_IDENTIFYFLAG call target_outb;
  427. /*
  428.  * If we are the result of a tagged command, send
  429.  * a simple Q tag and the tag id.
  430.  */
  431. test SCB_CONTROL, TAG_ENB jz . + 3;
  432. mvi MSG_SIMPLE_Q_TAG call target_outb;
  433. mov SCB_TARGET_ITAG call target_outb;
  434. target_synccmd:
  435. /*
  436.  * Now determine what phases the host wants us
  437.  * to go through.
  438.  */
  439. mov SEQ_FLAGS, SCB_TARGET_PHASES;
  440. test SCB_CONTROL, MK_MESSAGE jz target_ITloop;
  441. mvi P_MESGIN|BSYO call change_phase;
  442. jmp host_target_message_loop;
  443. target_ITloop:
  444. /*
  445.  * Start honoring ATN signals now that
  446.  * we properly identified ourselves.
  447.  */
  448. test SCSISIGI, ATNI jnz target_mesgout;
  449. test SEQ_FLAGS, CMDPHASE_PENDING jnz target_cmdphase;
  450. test SEQ_FLAGS, DPHASE_PENDING jnz target_dphase;
  451. test SEQ_FLAGS, SPHASE_PENDING jnz target_sphase;
  452. /*
  453.  * No more work to do.  Either disconnect or not depending
  454.  * on the state of NO_DISCONNECT.
  455.  */
  456. test SEQ_FLAGS, NO_DISCONNECT jz target_disconnect; 
  457. mov RETURN_1, ALLZEROS;
  458. call complete_target_cmd;
  459. cmp RETURN_1, CONT_MSG_LOOP jne .;
  460. if ((ahc->flags & AHC_PAGESCBS) != 0) {
  461. mov ALLZEROS call get_free_or_disc_scb;
  462. }
  463. mvi DMAPARAMS, HDMAEN|DIRECTION|FIFORESET;
  464. mov SCB_TAG  call dma_scb;
  465. jmp target_synccmd;
  466. target_mesgout:
  467. mvi SCSISIGO, P_MESGOUT|BSYO;
  468. target_mesgout_continue:
  469. call target_inb;
  470. target_mesgout_pending:
  471. /* Local Processing goes here... */
  472. jmp host_target_message_loop;
  473. target_disconnect:
  474. mvi P_MESGIN|BSYO call change_phase;
  475. test SEQ_FLAGS, DPHASE jz . + 2;
  476. mvi MSG_SAVEDATAPOINTER call target_outb;
  477. mvi MSG_DISCONNECT call target_outb;
  478. target_busfree_wait:
  479. /* Wait for preceding I/O session to complete. */
  480. test SCSISIGI, ACKI jnz .;
  481. target_busfree:
  482. and SIMODE1, ~ENBUSFREE;
  483. if ((ahc->features & AHC_ULTRA2) != 0) {
  484. clr SCSIBUSL;
  485. }
  486. clr SCSISIGO;
  487. mvi LASTPHASE, P_BUSFREE;
  488. call complete_target_cmd;
  489. jmp poll_for_work;
  490. target_cmdphase:
  491. /*
  492.  * The target has dropped ATN (doesn't want to abort or BDR)
  493.  * and we believe this selection to be valid.  If the ring
  494.  * buffer for new commands is full, return busy or queue full.
  495.  */
  496. if ((ahc->features & AHC_HS_MAILBOX) != 0) {
  497. and A, HOST_TQINPOS, HS_MAILBOX;
  498. } else {
  499. mov A, KERNEL_TQINPOS;
  500. }
  501. cmp TQINPOS, A jne tqinfifo_has_space;
  502. mvi P_STATUS|BSYO call change_phase;
  503. test SEQ_FLAGS, TARGET_CMD_IS_TAGGED jz . + 3;
  504. mvi STATUS_QUEUE_FULL call target_outb;
  505. jmp target_busfree_wait;
  506. mvi STATUS_BUSY call target_outb;
  507. jmp target_busfree_wait;
  508. tqinfifo_has_space:
  509. mvi P_COMMAND|BSYO call change_phase;
  510. call target_inb;
  511. mov A, DINDEX;
  512. /* Store for host */
  513. if ((ahc->features & AHC_CMD_CHAN) != 0) {
  514. mov CCSCBRAM, A;
  515. } else {
  516. mov DFDAT, A;
  517. }
  518. /*
  519.  * Determine the number of bytes to read
  520.  * based on the command group code via table lookup.
  521.  * We reuse the first 8 bytes of the TARG_SCSIRATE
  522.  * BIOS array for this table. Count is one less than
  523.  * the total for the command since we've already fetched
  524.  * the first byte.
  525.  */
  526. shr A, CMD_GROUP_CODE_SHIFT;
  527. add SINDEX, CMDSIZE_TABLE, A;
  528. mov A, SINDIR;
  529. test A, 0xFF jz command_phase_done;
  530. or SXFRCTL0, SPIOEN;
  531. command_loop:
  532. test SSTAT0, SPIORDY jz .;
  533. cmp A, 1 jne . + 2;
  534. and SXFRCTL0, ~SPIOEN; /* Last Byte */
  535. if ((ahc->features & AHC_CMD_CHAN) != 0) {
  536. mov CCSCBRAM, SCSIDATL;
  537. } else {
  538. mov DFDAT, SCSIDATL;
  539. }
  540. dec A;
  541. test A, 0xFF jnz command_loop;
  542. command_phase_done:
  543. and SEQ_FLAGS, ~CMDPHASE_PENDING;
  544. jmp target_ITloop;
  545. target_dphase:
  546. /*
  547.  * Data phases on the bus are from the
  548.  * perspective of the initiator.  The dma
  549.  * code looks at LASTPHASE to determine the
  550.  * data direction of the DMA.  Toggle it for
  551.  * target transfers.
  552.  */
  553. xor LASTPHASE, IOI, SCB_TARGET_DATA_DIR;
  554. or SCB_TARGET_DATA_DIR, BSYO call change_phase;
  555. jmp p_data;
  556. target_sphase:
  557. mvi P_STATUS|BSYO call change_phase;
  558. mvi LASTPHASE, P_STATUS;
  559. mov SCB_SCSI_STATUS call target_outb;
  560. /* XXX Watch for ATN or parity errors??? */
  561. mvi SCSISIGO, P_MESGIN|BSYO;
  562. /* MSG_CMDCMPLT is 0, but we can't do an immediate of 0 */
  563. mov ALLZEROS call target_outb;
  564. jmp target_busfree_wait;
  565. complete_target_cmd:
  566. test SEQ_FLAGS, TARG_CMD_PENDING jnz . + 2;
  567. mov SCB_TAG jmp complete_post;
  568. if ((ahc->features & AHC_CMD_CHAN) != 0) {
  569. /* Set the valid byte */
  570. mvi CCSCBADDR, 24;
  571. mov CCSCBRAM, ALLONES;
  572. mvi CCHCNT, 28;
  573. or CCSCBCTL, CCSCBEN|CCSCBRESET;
  574. test CCSCBCTL, CCSCBDONE jz .;
  575. clr CCSCBCTL;
  576. } else {
  577. /* Set the valid byte */
  578. or DFCNTRL, FIFORESET;
  579. mvi DFWADDR, 3; /* Third 64bit word or byte 24 */
  580. mov DFDAT, ALLONES;
  581. mvi 28 call set_hcnt;
  582. or DFCNTRL, HDMAEN|FIFOFLUSH;
  583. call dma_finish;
  584. }
  585. inc TQINPOS;
  586. mvi INTSTAT,CMDCMPLT ret;
  587. }
  588. if ((ahc->flags & AHC_INITIATORROLE) != 0) {
  589. initiator_select:
  590. /*
  591.  * As soon as we get a successful selection, the target
  592.  * should go into the message out phase since we have ATN
  593.  * asserted.
  594.  */
  595. mvi MSG_OUT, MSG_IDENTIFYFLAG;
  596. or SEQ_FLAGS, IDENTIFY_SEEN;
  597. /*
  598.  * Main loop for information transfer phases.  Wait for the
  599.  * target to assert REQ before checking MSG, C/D and I/O for
  600.  * the bus phase.
  601.  */
  602. mesgin_phasemis:
  603. ITloop:
  604. call phase_lock;
  605. mov A, LASTPHASE;
  606. test A, ~P_DATAIN jz p_data;
  607. cmp A,P_COMMAND je p_command;
  608. cmp A,P_MESGOUT je p_mesgout;
  609. cmp A,P_STATUS je p_status;
  610. cmp A,P_MESGIN je p_mesgin;
  611. mvi BAD_PHASE call set_seqint;
  612. jmp ITloop; /* Try reading the bus again. */
  613. await_busfree:
  614. and SIMODE1, ~ENBUSFREE;
  615. mov NONE, SCSIDATL; /* Ack the last byte */
  616. if ((ahc->features & AHC_ULTRA2) != 0) {
  617. clr SCSIBUSL; /* Prevent bit leakage durint SELTO */
  618. }
  619. and SXFRCTL0, ~SPIOEN;
  620. test SSTAT1,REQINIT|BUSFREE jz .;
  621. test SSTAT1, BUSFREE jnz poll_for_work;
  622. mvi MISSED_BUSFREE call set_seqint;
  623. }
  624. clear_target_state:
  625. /*
  626.  * We assume that the kernel driver may reset us
  627.  * at any time, even in the middle of a DMA, so
  628.  * clear DFCNTRL too.
  629.  */
  630. clr DFCNTRL;
  631. or SXFRCTL0, CLRSTCNT|CLRCHN;
  632. /*
  633.  * We don't know the target we will connect to,
  634.  * so default to narrow transfers to avoid
  635.  * parity problems.
  636.  */
  637. if ((ahc->features & AHC_ULTRA2) != 0) {
  638. bmov SCSIRATE, ALLZEROS, 2;
  639. } else {
  640. clr SCSIRATE;
  641. if ((ahc->features & AHC_ULTRA) != 0) {
  642. and SXFRCTL0, ~(FAST20);
  643. }
  644. }
  645. mvi LASTPHASE, P_BUSFREE;
  646. /* clear target specific flags */
  647. clr SEQ_FLAGS ret;
  648. sg_advance:
  649. clr A; /* add sizeof(struct scatter) */
  650. add SCB_RESIDUAL_SGPTR[0],SG_SIZEOF;
  651. adc SCB_RESIDUAL_SGPTR[1],A;
  652. adc SCB_RESIDUAL_SGPTR[2],A;
  653. adc SCB_RESIDUAL_SGPTR[3],A ret;
  654. if ((ahc->features & AHC_CMD_CHAN) != 0) {
  655. disable_ccsgen:
  656. test CCSGCTL, CCSGEN jz return;
  657. test CCSGCTL, CCSGDONE jz .;
  658. disable_ccsgen_fetch_done:
  659. clr CCSGCTL;
  660. test CCSGCTL, CCSGEN jnz .;
  661. ret;
  662. idle_loop:
  663. /*
  664.  * Do we need any more segments for this transfer?
  665.  */
  666. test SCB_RESIDUAL_DATACNT[3], SG_LAST_SEG jnz return;
  667. /* Did we just finish fetching segs? */
  668. cmp CCSGCTL, CCSGEN|CCSGDONE je idle_sgfetch_complete;
  669. /* Are we actively fetching segments? */
  670. test CCSGCTL, CCSGEN jnz return;
  671. /*
  672.  * Do we have any prefetch left???
  673.  */
  674. cmp CCSGADDR, SG_PREFETCH_CNT jne idle_sg_avail;
  675. /*
  676.  * Need to fetch segments, but we can only do that
  677.  * if the command channel is completely idle.  Make
  678.  * sure we don't have an SCB prefetch going on.
  679.  */
  680. test CCSCBCTL, CCSCBEN jnz return;
  681. /*
  682.  * We fetch a "cacheline aligned" and sized amount of data
  683.  * so we don't end up referencing a non-existant page.
  684.  * Cacheline aligned is in quotes because the kernel will
  685.  * set the prefetch amount to a reasonable level if the
  686.  * cacheline size is unknown.
  687.  */
  688. mvi CCHCNT, SG_PREFETCH_CNT;
  689. and CCHADDR[0], SG_PREFETCH_ALIGN_MASK, SCB_RESIDUAL_SGPTR;
  690. bmov CCHADDR[1], SCB_RESIDUAL_SGPTR[1], 3;
  691. mvi CCSGCTL, CCSGEN|CCSGRESET ret;
  692. idle_sgfetch_complete:
  693. call disable_ccsgen_fetch_done;
  694. and CCSGADDR, SG_PREFETCH_ADDR_MASK, SCB_RESIDUAL_SGPTR;
  695. idle_sg_avail:
  696. if ((ahc->features & AHC_ULTRA2) != 0) {
  697. /* Does the hardware have space for another SG entry? */
  698. test DFSTATUS, PRELOAD_AVAIL jz return;
  699. bmov  HADDR, CCSGRAM, 7;
  700. test HCNT[0], 0x1 jz . + 2;
  701. xor DATA_COUNT_ODD, 0x1;
  702. bmov SCB_RESIDUAL_DATACNT[3], CCSGRAM, 1;
  703. if ((ahc->flags & AHC_39BIT_ADDRESSING) != 0) {
  704. mov SCB_RESIDUAL_DATACNT[3] call set_hhaddr;
  705. }
  706. call sg_advance;
  707. mov SINDEX, SCB_RESIDUAL_SGPTR[0];
  708. test DATA_COUNT_ODD, 0x1 jz . + 2;
  709. or SINDEX, ODD_SEG;
  710. test SCB_RESIDUAL_DATACNT[3], SG_LAST_SEG jz . + 2;
  711. or SINDEX, LAST_SEG;
  712. mov SG_CACHE_PRE, SINDEX;
  713. /* Load the segment */
  714. or DFCNTRL, PRELOADEN;
  715. }
  716. ret;
  717. }
  718. if ((ahc->bugs & AHC_PCI_MWI_BUG) != 0 && ahc->pci_cachesize != 0) {
  719. /*
  720.  * Calculate the trailing portion of this S/G segment that cannot
  721.  * be transferred using memory write and invalidate PCI transactions.  
  722.  * XXX Can we optimize this for PCI writes only???
  723.  */
  724. calc_mwi_residual:
  725. /*
  726.  * If the ending address is on a cacheline boundary,
  727.  * there is no need for an extra segment.
  728.  */
  729. mov A, HCNT[0];
  730. add A, A, HADDR[0];
  731. and A, CACHESIZE_MASK;
  732. test A, 0xFF jz return;
  733. /*
  734.  * If the transfer is less than a cachline,
  735.  * there is no need for an extra segment.
  736.  */
  737. test HCNT[1], 0xFF jnz calc_mwi_residual_final;
  738. test HCNT[2], 0xFF jnz calc_mwi_residual_final;
  739. add NONE, INVERTED_CACHESIZE_MASK, HCNT[0];
  740. jnc return;
  741. calc_mwi_residual_final:
  742. mov MWI_RESIDUAL, A;
  743. not A;
  744. inc A;
  745. add HCNT[0], A;
  746. adc HCNT[1], -1;
  747. adc HCNT[2], -1 ret;
  748. }
  749. p_data:
  750. test SEQ_FLAGS,IDENTIFY_SEEN jnz p_data_okay;
  751. mvi NO_IDENT jmp set_seqint;
  752. p_data_okay:
  753. if ((ahc->features & AHC_ULTRA2) != 0) {
  754. mvi DMAPARAMS, PRELOADEN|SCSIEN|HDMAEN;
  755. } else {
  756. mvi DMAPARAMS, WIDEODD|SCSIEN|SDMAEN|HDMAEN|FIFORESET;
  757. }
  758. test LASTPHASE, IOI jnz . + 2;
  759. or DMAPARAMS, DIRECTION;
  760. if ((ahc->features & AHC_CMD_CHAN) != 0) {
  761. /* We don't have any valid S/G elements */
  762. mvi CCSGADDR, SG_PREFETCH_CNT;
  763. }
  764. test SEQ_FLAGS, DPHASE jz data_phase_initialize;
  765. /*
  766.  * If we re-enter the data phase after going through another
  767.  * phase, our transfer location has almost certainly been
  768.  * corrupted by the interveining, non-data, transfers.  Ask
  769.  * the host driver to fix us up based on the transfer residual.
  770.  */
  771. mvi PDATA_REINIT call set_seqint;
  772. jmp data_phase_loop;
  773. data_phase_initialize:
  774. /* We have seen a data phase for the first time */
  775. or SEQ_FLAGS, DPHASE;
  776. /*
  777.  * Initialize the DMA address and counter from the SCB.
  778.  * Also set SCB_RESIDUAL_SGPTR, including the LAST_SEG
  779.  * flag in the highest byte of the data count.  We cannot
  780.  * modify the saved values in the SCB until we see a save
  781.  * data pointers message.
  782.  */
  783. if ((ahc->flags & AHC_39BIT_ADDRESSING) != 0) {
  784. /* The lowest address byte must be loaded last. */
  785. mov SCB_DATACNT[3] call set_hhaddr;
  786. }
  787. if ((ahc->features & AHC_CMD_CHAN) != 0) {
  788. bmov HADDR, SCB_DATAPTR, 7;
  789. bmov SCB_RESIDUAL_DATACNT[3], SCB_DATACNT[3], 5;
  790. } else {
  791. mvi DINDEX, HADDR;
  792. mvi SCB_DATAPTR call bcopy_7;
  793. mvi DINDEX, SCB_RESIDUAL_DATACNT + 3;
  794. mvi SCB_DATACNT + 3 call bcopy_5;
  795. }
  796. if ((ahc->bugs & AHC_PCI_MWI_BUG) != 0 && ahc->pci_cachesize != 0) {
  797. call calc_mwi_residual;
  798. }
  799. and SCB_RESIDUAL_SGPTR[0], ~SG_FULL_RESID;
  800. and DATA_COUNT_ODD, 0x1, HCNT[0];
  801. if ((ahc->features & AHC_ULTRA2) == 0) {
  802. if ((ahc->features & AHC_CMD_CHAN) != 0) {
  803. bmov STCNT, HCNT, 3;
  804. } else {
  805. call set_stcnt_from_hcnt;
  806. }
  807. }
  808. data_phase_loop:
  809. /* Guard against overruns */
  810. test SCB_RESIDUAL_SGPTR[0], SG_LIST_NULL jz data_phase_inbounds;
  811. /*
  812.  * Turn on `Bit Bucket' mode, wait until the target takes
  813.  * us to another phase, and then notify the host.
  814.  */
  815. and DMAPARAMS, DIRECTION;
  816. mov DFCNTRL, DMAPARAMS;
  817. or SXFRCTL1,BITBUCKET;
  818. if ((ahc->features & AHC_DT) == 0) {
  819. test SSTAT1,PHASEMIS jz .;
  820. } else {
  821. test SCSIPHASE, DATA_PHASE_MASK jnz .;
  822. }
  823. and SXFRCTL1, ~BITBUCKET;
  824. mvi DATA_OVERRUN call set_seqint;
  825. jmp ITloop;
  826. data_phase_inbounds:
  827. if ((ahc->features & AHC_ULTRA2) != 0) {
  828. mov SINDEX, SCB_RESIDUAL_SGPTR[0];
  829. test SCB_RESIDUAL_DATACNT[3], SG_LAST_SEG jz . + 2;
  830. or SINDEX, LAST_SEG;
  831. test DATA_COUNT_ODD, 0x1 jz . + 2;
  832. or SINDEX, ODD_SEG;
  833. mov SG_CACHE_PRE, SINDEX;
  834. mov DFCNTRL, DMAPARAMS;
  835. ultra2_dma_loop:
  836. call idle_loop;
  837. /*
  838.  * The transfer is complete if either the last segment
  839.  * completes or the target changes phase.
  840.  */
  841. test SG_CACHE_SHADOW, LAST_SEG_DONE jnz ultra2_dmafinish;
  842. if ((ahc->features & AHC_DT) == 0) {
  843. if ((ahc->flags & AHC_TARGETROLE) != 0) {
  844.  /*
  845.   * As a target, we control the phases,
  846.   * so ignore PHASEMIS.
  847.   */
  848. test SSTAT0, TARGET jnz ultra2_dma_loop;
  849. }
  850. if ((ahc->flags & AHC_INITIATORROLE) != 0) {
  851. test SSTAT1,PHASEMIS jz ultra2_dma_loop;
  852. }
  853. } else {
  854. test DFCNTRL, SCSIEN jnz ultra2_dma_loop;
  855. }
  856. ultra2_dmafinish:
  857. /*
  858.  * The transfer has terminated either due to a phase
  859.  * change, and/or the completion of the last segment.
  860.  * We have two goals here.  Do as much other work
  861.  * as possible while the data fifo drains on a read
  862.  * and respond as quickly as possible to the standard
  863.  * messages (save data pointers/disconnect and command
  864.  * complete) that usually follow a data phase.
  865.  */
  866. if ((ahc->bugs & AHC_AUTOFLUSH_BUG) != 0) {
  867. /*
  868.  * On chips with broken auto-flush, start
  869.  * the flushing process now.  We'll poke
  870.  * the chip from time to time to keep the
  871.  * flush process going as we complete the
  872.  * data phase.
  873.  */
  874. or DFCNTRL, FIFOFLUSH;
  875. }
  876. /*
  877.  * We assume that, even though data may still be
  878.  * transferring to the host, that the SCSI side of
  879.  * the DMA engine is now in a static state.  This
  880.  * allows us to update our notion of where we are
  881.  * in this transfer.
  882.  *
  883.  * If, by chance, we stopped before being able
  884.  * to fetch additional segments for this transfer,
  885.  * yet the last S/G was completely exhausted,
  886.  * call our idle loop until it is able to load
  887.  * another segment.  This will allow us to immediately
  888.  * pickup on the next segment on the next data phase.
  889.  *
  890.  * If we happened to stop on the last segment, then
  891.  * our residual information is still correct from
  892.  * the idle loop and there is no need to perform
  893.  * any fixups.
  894.  */
  895. ultra2_ensure_sg:
  896. test SG_CACHE_SHADOW, LAST_SEG jz ultra2_shvalid;
  897. /* Record if we've consumed all S/G entries */
  898. test    SSTAT2, SHVALID jnz residuals_correct;
  899. or SCB_RESIDUAL_SGPTR[0], SG_LIST_NULL;
  900. jmp residuals_correct;
  901. ultra2_shvalid:
  902.                 test    SSTAT2, SHVALID jnz sgptr_fixup;
  903. call idle_loop;
  904. jmp ultra2_ensure_sg;
  905. sgptr_fixup:
  906. /*
  907.  * Fixup the residual next S/G pointer.  The S/G preload
  908.  * feature of the chip allows us to load two elements
  909.  * in addition to the currently active element.  We
  910.  * store the bottom byte of the next S/G pointer in
  911.  * the SG_CACEPTR register so we can restore the
  912.  * correct value when the DMA completes.  If the next
  913.  * sg ptr value has advanced to the point where higher
  914.  * bytes in the address have been affected, fix them
  915.  * too.
  916.  */
  917. test SG_CACHE_SHADOW, 0x80 jz sgptr_fixup_done;
  918. test SCB_RESIDUAL_SGPTR[0], 0x80 jnz sgptr_fixup_done;
  919. add SCB_RESIDUAL_SGPTR[1], -1;
  920. adc SCB_RESIDUAL_SGPTR[2], -1; 
  921. adc SCB_RESIDUAL_SGPTR[3], -1;
  922. sgptr_fixup_done:
  923. and SCB_RESIDUAL_SGPTR[0], SG_ADDR_MASK, SG_CACHE_SHADOW;
  924. clr DATA_COUNT_ODD;
  925. test SG_CACHE_SHADOW, ODD_SEG jz . + 2;
  926. or DATA_COUNT_ODD, 0x1;
  927. clr SCB_RESIDUAL_DATACNT[3]; /* We are not the last seg */
  928. residuals_correct:
  929. /*
  930.  * Go ahead and shut down the DMA engine now.
  931.  * In the future, we'll want to handle end of
  932.  * transfer messages prior to doing this, but this
  933.  * requires similar restructuring for pre-ULTRA2
  934.  * controllers.
  935.  */
  936. test DMAPARAMS, DIRECTION jnz ultra2_fifoempty;
  937. ultra2_fifoflush:
  938. if ((ahc->features & AHC_DT) == 0) {
  939. if ((ahc->bugs & AHC_AUTOFLUSH_BUG) != 0) {
  940. /*
  941.  * On Rev A of the aic7890, the autoflush
  942.  * feature doesn't function correctly.
  943.  * Perform an explicit manual flush.  During
  944.  * a manual flush, the FIFOEMP bit becomes
  945.  * true every time the PCI FIFO empties
  946.  * regardless of the state of the SCSI FIFO.
  947.  * It can take up to 4 clock cycles for the
  948.  * SCSI FIFO to get data into the PCI FIFO
  949.  * and for FIFOEMP to de-assert.  Here we
  950.  * guard against this condition by making
  951.  * sure the FIFOEMP bit stays on for 5 full
  952.  * clock cycles.
  953.  */
  954. or DFCNTRL, FIFOFLUSH;
  955. test DFSTATUS, FIFOEMP jz ultra2_fifoflush;
  956. test DFSTATUS, FIFOEMP jz ultra2_fifoflush;
  957. test DFSTATUS, FIFOEMP jz ultra2_fifoflush;
  958. test DFSTATUS, FIFOEMP jz ultra2_fifoflush;
  959. }
  960. test DFSTATUS, FIFOEMP jz ultra2_fifoflush;
  961. } else {
  962. /*
  963.  * We enable the auto-ack feature on DT capable
  964.  * controllers.  This means that the controller may
  965.  * have already transferred some overrun bytes into
  966.  * the data FIFO and acked them on the bus.  The only
  967.  * way to detect this situation is to wait for
  968.  * LAST_SEG_DONE to come true on a completed transfer
  969.  * and then test to see if the data FIFO is non-empty.
  970.  */
  971. test SCB_RESIDUAL_SGPTR[0], SG_LIST_NULL jz . + 4;
  972. test SG_CACHE_SHADOW, LAST_SEG_DONE jz .;
  973. test DFSTATUS, FIFOEMP jnz ultra2_fifoempty;
  974. /* Overrun */
  975. jmp data_phase_loop;
  976. test DFSTATUS, FIFOEMP jz .;
  977. }
  978. ultra2_fifoempty:
  979. /* Don't clobber an inprogress host data transfer */
  980. test DFSTATUS, MREQPEND jnz ultra2_fifoempty;
  981. ultra2_dmahalt:
  982. and     DFCNTRL, ~(SCSIEN|HDMAEN);
  983. test DFCNTRL, SCSIEN|HDMAEN jnz .;
  984. if ((ahc->flags & AHC_39BIT_ADDRESSING) != 0) {
  985. /*
  986.  * Keep HHADDR cleared for future, 32bit addressed
  987.  * only, DMA operations.
  988.  *
  989.  * Due to bayonette style S/G handling, our residual
  990.  * data must be "fixed up" once the transfer is halted.
  991.  * Here we fixup the HSHADDR stored in the high byte
  992.  * of the residual data cnt.  By postponing the fixup,
  993.  * we can batch the clearing of HADDR with the fixup.
  994.  * If we halted on the last segment, the residual is
  995.  * already correct.   If we are not on the last
  996.  * segment, copy the high address directly from HSHADDR.
  997.  * We don't need to worry about maintaining the
  998.  * SG_LAST_SEG flag as it will always be false in the
  999.  * case where an update is required.
  1000.  */
  1001. or DSCOMMAND1, HADDLDSEL0;
  1002. test SG_CACHE_SHADOW, LAST_SEG jnz . + 2;
  1003. mov SCB_RESIDUAL_DATACNT[3], SHADDR;
  1004. clr HADDR;
  1005. and DSCOMMAND1, ~HADDLDSEL0;
  1006. }
  1007. } else {
  1008. /* If we are the last SG block, tell the hardware. */
  1009. if ((ahc->bugs & AHC_PCI_MWI_BUG) != 0
  1010.   && ahc->pci_cachesize != 0) {
  1011. test MWI_RESIDUAL, 0xFF jnz dma_mid_sg;
  1012. }
  1013. test SCB_RESIDUAL_DATACNT[3], SG_LAST_SEG jz dma_mid_sg;
  1014. if ((ahc->flags & AHC_TARGETROLE) != 0) {
  1015. test SSTAT0, TARGET jz dma_last_sg;
  1016. if ((ahc->flags & AHC_TMODE_WIDEODD_BUG) != 0) {
  1017. test DMAPARAMS, DIRECTION jz dma_mid_sg;
  1018. }
  1019. }
  1020. dma_last_sg:
  1021. and DMAPARAMS, ~WIDEODD;
  1022. dma_mid_sg:
  1023. /* Start DMA data transfer. */
  1024. mov DFCNTRL, DMAPARAMS;
  1025. dma_loop:
  1026. if ((ahc->features & AHC_CMD_CHAN) != 0) {
  1027. call idle_loop;
  1028. }
  1029. test SSTAT0,DMADONE jnz dma_dmadone;
  1030. test SSTAT1,PHASEMIS jz dma_loop; /* ie. underrun */
  1031. dma_phasemis:
  1032. /*
  1033.  * We will be "done" DMAing when the transfer count goes to
  1034.  * zero, or the target changes the phase (in light of this,
  1035.  * it makes sense that the DMA circuitry doesn't ACK when
  1036.  * PHASEMIS is active).  If we are doing a SCSI->Host transfer,
  1037.  * the data FIFO should be flushed auto-magically on STCNT=0
  1038.  * or a phase change, so just wait for FIFO empty status.
  1039.  */
  1040. dma_checkfifo:
  1041. test DFCNTRL,DIRECTION jnz dma_fifoempty;
  1042. dma_fifoflush:
  1043. test DFSTATUS,FIFOEMP jz dma_fifoflush;
  1044. dma_fifoempty:
  1045. /* Don't clobber an inprogress host data transfer */
  1046. test DFSTATUS, MREQPEND jnz dma_fifoempty;
  1047. /*
  1048.  * Now shut off the DMA and make sure that the DMA
  1049.  * hardware has actually stopped.  Touching the DMA
  1050.  * counters, etc. while a DMA is active will result
  1051.  * in an ILLSADDR exception.
  1052.  */
  1053. dma_dmadone:
  1054. and DFCNTRL, ~(SCSIEN|SDMAEN|HDMAEN);
  1055. dma_halt:
  1056. /*
  1057.  * Some revisions of the aic78XX have a problem where, if the
  1058.  * data fifo is full, but the PCI input latch is not empty, 
  1059.  * HDMAEN cannot be cleared.  The fix used here is to drain
  1060.  * the prefetched but unused data from the data fifo until
  1061.  * there is space for the input latch to drain.
  1062.  */
  1063. if ((ahc->bugs & AHC_PCI_2_1_RETRY_BUG) != 0) {
  1064. mov NONE, DFDAT;
  1065. }
  1066. test DFCNTRL, (SCSIEN|SDMAEN|HDMAEN) jnz dma_halt;
  1067. /* See if we have completed this last segment */
  1068. test STCNT[0], 0xff jnz data_phase_finish;
  1069. test STCNT[1], 0xff jnz data_phase_finish;
  1070. test STCNT[2], 0xff jnz data_phase_finish;
  1071. /*
  1072.  * Advance the scatter-gather pointers if needed 
  1073.  */
  1074. if ((ahc->bugs & AHC_PCI_MWI_BUG) != 0
  1075.   && ahc->pci_cachesize != 0) {
  1076. test MWI_RESIDUAL, 0xFF jz no_mwi_resid;
  1077. /*
  1078.  * Reload HADDR from SHADDR and setup the
  1079.  * count to be the size of our residual.
  1080.  */
  1081. if ((ahc->features & AHC_CMD_CHAN) != 0) {
  1082. bmov HADDR, SHADDR, 4;
  1083. mov HCNT, MWI_RESIDUAL;
  1084. bmov HCNT[1], ALLZEROS, 2;
  1085. } else {
  1086. mvi DINDEX, HADDR;
  1087. mvi SHADDR call bcopy_4;
  1088. mov MWI_RESIDUAL call set_hcnt;
  1089. }
  1090. clr MWI_RESIDUAL;
  1091. jmp sg_load_done;
  1092. no_mwi_resid:
  1093. }
  1094. test SCB_RESIDUAL_DATACNT[3], SG_LAST_SEG jz sg_load;
  1095. or SCB_RESIDUAL_SGPTR[0], SG_LIST_NULL;
  1096. jmp data_phase_finish;
  1097. sg_load:
  1098. /*
  1099.  * Load the next SG element's data address and length
  1100.  * into the DMA engine.  If we don't have hardware
  1101.  * to perform a prefetch, we'll have to fetch the
  1102.  * segment from host memory first.
  1103.  */
  1104. if ((ahc->features & AHC_CMD_CHAN) != 0) {
  1105. /* Wait for the idle loop to complete */
  1106. test CCSGCTL, CCSGEN jz . + 3;
  1107. call idle_loop;
  1108. test CCSGCTL, CCSGEN jnz . - 1;
  1109. bmov  HADDR, CCSGRAM, 7;
  1110. /*
  1111.  * Workaround for flaky external SCB RAM
  1112.  * on certain aic7895 setups.  It seems
  1113.  * unable to handle direct transfers from
  1114.  * S/G ram to certain SCB locations.
  1115.  */
  1116. mov SINDEX, CCSGRAM;
  1117. mov SCB_RESIDUAL_DATACNT[3], SINDEX;
  1118. } else {
  1119. if ((ahc->flags & AHC_39BIT_ADDRESSING) != 0) {
  1120. mov ALLZEROS call set_hhaddr;
  1121. }
  1122. mvi DINDEX, HADDR;
  1123. mvi SCB_RESIDUAL_SGPTR call bcopy_4;
  1124. mvi SG_SIZEOF call set_hcnt;
  1125. or DFCNTRL, HDMAEN|DIRECTION|FIFORESET;
  1126. call dma_finish;
  1127. mvi DINDEX, HADDR;
  1128. call dfdat_in_7;
  1129. mov SCB_RESIDUAL_DATACNT[3], DFDAT;
  1130. }
  1131. if ((ahc->flags & AHC_39BIT_ADDRESSING) != 0) {
  1132. mov SCB_RESIDUAL_DATACNT[3] call set_hhaddr;
  1133. /*
  1134.  * The lowest address byte must be loaded
  1135.  * last as it triggers the computation of
  1136.  * some items in the PCI block.  The ULTRA2
  1137.  * chips do this on PRELOAD.
  1138.  */
  1139. mov HADDR, HADDR;
  1140. }
  1141. if ((ahc->bugs & AHC_PCI_MWI_BUG) != 0
  1142.   && ahc->pci_cachesize != 0) {
  1143. call calc_mwi_residual;
  1144. }
  1145. /* Point to the new next sg in memory */
  1146. call sg_advance;
  1147. sg_load_done:
  1148. if ((ahc->features & AHC_CMD_CHAN) != 0) {
  1149. bmov STCNT, HCNT, 3;
  1150. } else {
  1151. call set_stcnt_from_hcnt;
  1152. }
  1153. /* Track odd'ness */
  1154. test HCNT[0], 0x1 jz . + 2;
  1155. xor DATA_COUNT_ODD, 0x1;
  1156. if ((ahc->flags & AHC_TARGETROLE) != 0) {
  1157. test SSTAT0, TARGET jnz data_phase_loop;
  1158. }
  1159. }
  1160. data_phase_finish:
  1161. /*
  1162.  * If the target has left us in data phase, loop through
  1163.  * the dma code again.  In the case of ULTRA2 adapters,
  1164.  * we should only loop if there is a data overrun.  For
  1165.  * all other adapters, we'll loop after each S/G element
  1166.  * is loaded as well as if there is an overrun.
  1167.  */
  1168. if ((ahc->flags & AHC_TARGETROLE) != 0) {
  1169. test SSTAT0, TARGET jnz data_phase_done;
  1170. }
  1171. if ((ahc->flags & AHC_INITIATORROLE) != 0) {
  1172. test SSTAT1, REQINIT jz .;
  1173. if ((ahc->features & AHC_DT) == 0) {
  1174. test SSTAT1,PHASEMIS jz data_phase_loop;
  1175. } else {
  1176. test SCSIPHASE, DATA_PHASE_MASK jnz data_phase_loop;
  1177. }
  1178. }
  1179. data_phase_done:
  1180. /*
  1181.  * After a DMA finishes, save the SG and STCNT residuals back into
  1182.  * the SCB.  We use STCNT instead of HCNT, since it's a reflection
  1183.  * of how many bytes were transferred on the SCSI (as opposed to the
  1184.  * host) bus.
  1185.  */
  1186. if ((ahc->features & AHC_CMD_CHAN) != 0) {
  1187. /* Kill off any pending prefetch */
  1188. call disable_ccsgen;
  1189. }
  1190. if ((ahc->features & AHC_ULTRA2) == 0) {
  1191. /*
  1192.  * Clear the high address byte so that all other DMA
  1193.  * operations, which use 32bit addressing, can assume
  1194.  * HHADDR is 0.
  1195.  */
  1196. if ((ahc->flags & AHC_39BIT_ADDRESSING) != 0) {
  1197. mov ALLZEROS call set_hhaddr;
  1198. }
  1199. }
  1200. /*
  1201.  * Update our residual information before the information is
  1202.  * lost by some other type of SCSI I/O (e.g. PIO).  If we have
  1203.  * transferred all data, no update is needed.
  1204.  *
  1205.  */
  1206. test SCB_RESIDUAL_SGPTR, SG_LIST_NULL jnz residual_update_done;
  1207. if ((ahc->bugs & AHC_PCI_MWI_BUG) != 0
  1208.   && ahc->pci_cachesize != 0) {
  1209. if ((ahc->features & AHC_CMD_CHAN) != 0) {
  1210. test MWI_RESIDUAL, 0xFF jz bmov_resid;
  1211. }
  1212. mov A, MWI_RESIDUAL;
  1213. add SCB_RESIDUAL_DATACNT[0], A, STCNT[0];
  1214. clr A;
  1215. adc SCB_RESIDUAL_DATACNT[1], A, STCNT[1];
  1216. adc SCB_RESIDUAL_DATACNT[2], A, STCNT[2];
  1217. clr MWI_RESIDUAL;
  1218. if ((ahc->features & AHC_CMD_CHAN) != 0) {
  1219. jmp . + 2;
  1220. bmov_resid:
  1221. bmov SCB_RESIDUAL_DATACNT, STCNT, 3;
  1222. }
  1223. } else if ((ahc->features & AHC_CMD_CHAN) != 0) {
  1224. bmov SCB_RESIDUAL_DATACNT, STCNT, 3;
  1225. } else {
  1226. mov SCB_RESIDUAL_DATACNT[0], STCNT[0];
  1227. mov SCB_RESIDUAL_DATACNT[1], STCNT[1];
  1228. mov SCB_RESIDUAL_DATACNT[2], STCNT[2];
  1229. }
  1230. residual_update_done:
  1231. /*
  1232.  * Since we've been through a data phase, the SCB_RESID* fields
  1233.  * are now initialized.  Clear the full residual flag.
  1234.  */
  1235. and SCB_SGPTR[0], ~SG_FULL_RESID;
  1236. if ((ahc->features & AHC_ULTRA2) != 0) {
  1237. /* Clear the channel in case we return to data phase later */
  1238. or SXFRCTL0, CLRSTCNT|CLRCHN;
  1239. or SXFRCTL0, CLRSTCNT|CLRCHN;
  1240. }
  1241. if ((ahc->flags & AHC_TARGETROLE) != 0) {
  1242. test SEQ_FLAGS, DPHASE_PENDING jz ITloop;
  1243. and SEQ_FLAGS, ~DPHASE_PENDING;
  1244. /*
  1245.  * For data-in phases, wait for any pending acks from the
  1246.  * initiator before changing phase.  We only need to
  1247.  * send Ignore Wide Residue messages for data-in phases.
  1248.  */
  1249. test DFCNTRL, DIRECTION jz target_ITloop;
  1250. test SSTAT1, REQINIT jnz .;
  1251. test DATA_COUNT_ODD, 0x1 jz target_ITloop;
  1252. test SCSIRATE, WIDEXFER jz target_ITloop;
  1253. /*
  1254.  * Issue an Ignore Wide Residue Message.
  1255.  */
  1256. mvi P_MESGIN|BSYO call change_phase;
  1257. mvi MSG_IGN_WIDE_RESIDUE call target_outb;
  1258. mvi 1 call target_outb;
  1259. jmp target_ITloop;
  1260. } else {
  1261. jmp ITloop;
  1262. }
  1263. if ((ahc->flags & AHC_INITIATORROLE) != 0) {
  1264. /*
  1265.  * Command phase.  Set up the DMA registers and let 'er rip.
  1266.  */
  1267. p_command:
  1268. test SEQ_FLAGS,IDENTIFY_SEEN jnz p_command_okay;
  1269. mvi NO_IDENT jmp set_seqint;
  1270. p_command_okay:
  1271. if ((ahc->features & AHC_ULTRA2) != 0) {
  1272. bmov HCNT[0], SCB_CDB_LEN,  1;
  1273. bmov HCNT[1], ALLZEROS, 2;
  1274. mvi SG_CACHE_PRE, LAST_SEG;
  1275. } else if ((ahc->features & AHC_CMD_CHAN) != 0) {
  1276. bmov STCNT[0], SCB_CDB_LEN, 1;
  1277. bmov STCNT[1], ALLZEROS, 2;
  1278. } else {
  1279. mov STCNT[0], SCB_CDB_LEN;
  1280. clr STCNT[1];
  1281. clr STCNT[2];
  1282. }
  1283. add NONE, -13, SCB_CDB_LEN;
  1284. mvi SCB_CDB_STORE jnc p_command_embedded;
  1285. p_command_from_host:
  1286. if ((ahc->features & AHC_ULTRA2) != 0) {
  1287. bmov HADDR[0], SCB_CDB_PTR, 4;
  1288. mvi DFCNTRL, (PRELOADEN|SCSIEN|HDMAEN|DIRECTION);
  1289. } else {
  1290. if ((ahc->features & AHC_CMD_CHAN) != 0) {
  1291. bmov HADDR[0], SCB_CDB_PTR, 4;
  1292. bmov HCNT, STCNT, 3;
  1293. } else {
  1294. mvi DINDEX, HADDR;
  1295. mvi SCB_CDB_PTR call bcopy_4;
  1296. mov SCB_CDB_LEN call set_hcnt;
  1297. }
  1298. mvi DFCNTRL, (SCSIEN|SDMAEN|HDMAEN|DIRECTION|FIFORESET);
  1299. }
  1300. jmp p_command_loop;
  1301. p_command_embedded:
  1302. /*
  1303.  * The data fifo seems to require 4 byte aligned
  1304.  * transfers from the sequencer.  Force this to
  1305.  * be the case by clearing HADDR[0] even though
  1306.  * we aren't going to touch host memeory.
  1307.  */
  1308. clr HADDR[0];
  1309. if ((ahc->features & AHC_ULTRA2) != 0) {
  1310. mvi DFCNTRL, (PRELOADEN|SCSIEN|DIRECTION);
  1311. bmov DFDAT, SCB_CDB_STORE, 12; 
  1312. } else if ((ahc->features & AHC_CMD_CHAN) != 0) {
  1313. if ((ahc->flags & AHC_SCB_BTT) != 0) {
  1314. /*
  1315.  * On the 7895 the data FIFO will
  1316.  * get corrupted if you try to dump
  1317.  * data from external SCB memory into
  1318.  * the FIFO while it is enabled.  So,
  1319.  * fill the fifo and then enable SCSI
  1320.  * transfers.
  1321.  */
  1322. mvi DFCNTRL, (DIRECTION|FIFORESET);
  1323. } else {
  1324. mvi DFCNTRL, (SCSIEN|SDMAEN|DIRECTION|FIFORESET);
  1325. }
  1326. bmov DFDAT, SCB_CDB_STORE, 12; 
  1327. if ((ahc->flags & AHC_SCB_BTT) != 0) {
  1328. mvi DFCNTRL, (SCSIEN|SDMAEN|DIRECTION|FIFOFLUSH);
  1329. } else {
  1330. or DFCNTRL, FIFOFLUSH;
  1331. }
  1332. } else {
  1333. mvi DFCNTRL, (SCSIEN|SDMAEN|DIRECTION|FIFORESET);
  1334. call copy_to_fifo_6;
  1335. call copy_to_fifo_6;
  1336. or DFCNTRL, FIFOFLUSH;
  1337. }
  1338. p_command_loop:
  1339. if ((ahc->features & AHC_DT) == 0) {
  1340. test SSTAT0, SDONE jnz . + 2;
  1341. test    SSTAT1, PHASEMIS jz p_command_loop;
  1342. /*
  1343.  * Wait for our ACK to go-away on it's own
  1344.  * instead of being killed by SCSIEN getting cleared.
  1345.  */
  1346. test SCSISIGI, ACKI jnz .;
  1347. } else {
  1348. test DFCNTRL, SCSIEN jnz p_command_loop;
  1349. }
  1350. and DFCNTRL, ~(SCSIEN|SDMAEN|HDMAEN);
  1351. test DFCNTRL, (SCSIEN|SDMAEN|HDMAEN) jnz .;
  1352. if ((ahc->features & AHC_ULTRA2) != 0) {
  1353. /* Drop any residual from the S/G Preload queue */
  1354. or SXFRCTL0, CLRSTCNT;
  1355. }
  1356. jmp ITloop;
  1357. /*
  1358.  * Status phase.  Wait for the data byte to appear, then read it
  1359.  * and store it into the SCB.
  1360.  */
  1361. p_status:
  1362. test SEQ_FLAGS,IDENTIFY_SEEN jnz p_status_okay;
  1363. mvi NO_IDENT jmp set_seqint;
  1364. p_status_okay:
  1365. mov SCB_SCSI_STATUS, SCSIDATL;
  1366. jmp ITloop;
  1367. /*
  1368.  * Message out phase.  If MSG_OUT is MSG_IDENTIFYFLAG, build a full
  1369.  * indentify message sequence and send it to the target.  The host may
  1370.  * override this behavior by setting the MK_MESSAGE bit in the SCB
  1371.  * control byte.  This will cause us to interrupt the host and allow
  1372.  * it to handle the message phase completely on its own.  If the bit
  1373.  * associated with this target is set, we will also interrupt the host,
  1374.  * thereby allowing it to send a message on the next selection regardless
  1375.  * of the transaction being sent.
  1376.  * 
  1377.  * If MSG_OUT is == HOST_MSG, also interrupt the host and take a message.
  1378.  * This is done to allow the host to send messages outside of an identify
  1379.  * sequence while protecting the seqencer from testing the MK_MESSAGE bit
  1380.  * on an SCB that might not be for the current nexus. (For example, a
  1381.  * BDR message in responce to a bad reselection would leave us pointed to
  1382.  * an SCB that doesn't have anything to do with the current target).
  1383.  *
  1384.  * Otherwise, treat MSG_OUT as a 1 byte message to send (abort, abort tag,
  1385.  * bus device reset).
  1386.  *
  1387.  * When there are no messages to send, MSG_OUT should be set to MSG_NOOP,
  1388.  * in case the target decides to put us in this phase for some strange
  1389.  * reason.
  1390.  */
  1391. p_mesgout_retry:
  1392. /* Turn on ATN for the retry */
  1393. if ((ahc->features & AHC_DT) == 0) {
  1394. or SCSISIGO, ATNO, LASTPHASE;
  1395. } else {
  1396. mvi SCSISIGO, ATNO;
  1397. }
  1398. p_mesgout:
  1399. mov SINDEX, MSG_OUT;
  1400. cmp SINDEX, MSG_IDENTIFYFLAG jne p_mesgout_from_host;
  1401. test SCB_CONTROL,MK_MESSAGE jnz host_message_loop;
  1402. p_mesgout_identify:
  1403. or SINDEX, MSG_IDENTIFYFLAG|DISCENB, SCB_LUN;
  1404. test SCB_CONTROL, DISCENB jnz . + 2;
  1405. and SINDEX, ~DISCENB;
  1406. /*
  1407.  * Send a tag message if TAG_ENB is set in the SCB control block.
  1408.  * Use SCB_TAG (the position in the kernel's SCB array) as the tag value.
  1409.  */
  1410. p_mesgout_tag:
  1411. test SCB_CONTROL,TAG_ENB jz  p_mesgout_onebyte;
  1412. mov SCSIDATL, SINDEX; /* Send the identify message */
  1413. call phase_lock;
  1414. cmp LASTPHASE, P_MESGOUT jne p_mesgout_done;
  1415. and SCSIDATL,TAG_ENB|SCB_TAG_TYPE,SCB_CONTROL;
  1416. call phase_lock;
  1417. cmp LASTPHASE, P_MESGOUT jne p_mesgout_done;
  1418. mov SCB_TAG jmp p_mesgout_onebyte;
  1419. /*
  1420.  * Interrupt the driver, and allow it to handle this message
  1421.  * phase and any required retries.
  1422.  */
  1423. p_mesgout_from_host:
  1424. cmp SINDEX, HOST_MSG jne p_mesgout_onebyte;
  1425. jmp host_message_loop;
  1426. p_mesgout_onebyte:
  1427. mvi CLRSINT1, CLRATNO;
  1428. mov SCSIDATL, SINDEX;
  1429. /*
  1430.  * If the next bus phase after ATN drops is message out, it means
  1431.  * that the target is requesting that the last message(s) be resent.
  1432.  */
  1433. call phase_lock;
  1434. cmp LASTPHASE, P_MESGOUT je p_mesgout_retry;
  1435. p_mesgout_done:
  1436. mvi CLRSINT1,CLRATNO; /* Be sure to turn ATNO off */
  1437. mov LAST_MSG, MSG_OUT;
  1438. mvi MSG_OUT, MSG_NOOP; /* No message left */
  1439. jmp ITloop;
  1440. /*
  1441.  * Message in phase.  Bytes are read using Automatic PIO mode.
  1442.  */
  1443. p_mesgin:
  1444. mvi ACCUM call inb_first; /* read the 1st message byte */
  1445. test A,MSG_IDENTIFYFLAG jnz mesgin_identify;
  1446. cmp A,MSG_DISCONNECT je mesgin_disconnect;
  1447. cmp A,MSG_SAVEDATAPOINTER je mesgin_sdptrs;
  1448. cmp ALLZEROS,A je mesgin_complete;
  1449. cmp A,MSG_RESTOREPOINTERS je mesgin_rdptrs;
  1450. cmp A,MSG_IGN_WIDE_RESIDUE je mesgin_ign_wide_residue;
  1451. cmp A,MSG_NOOP je mesgin_done;
  1452. /*
  1453.  * Pushed message loop to allow the kernel to
  1454.  * run it's own message state engine.  To avoid an
  1455.  * extra nop instruction after signaling the kernel,
  1456.  * we perform the phase_lock before checking to see
  1457.  * if we should exit the loop and skip the phase_lock
  1458.  * in the ITloop.  Performing back to back phase_locks
  1459.  * shouldn't hurt, but why do it twice...
  1460.  */
  1461. host_message_loop:
  1462. mvi HOST_MSG_LOOP call set_seqint;
  1463. call phase_lock;
  1464. cmp RETURN_1, EXIT_MSG_LOOP je ITloop + 1;
  1465. jmp host_message_loop;
  1466. mesgin_ign_wide_residue:
  1467. if ((ahc->features & AHC_WIDE) != 0) {
  1468. test SCSIRATE, WIDEXFER jz mesgin_reject;
  1469. /* Pull the residue byte */
  1470. mvi ARG_1 call inb_next;
  1471. cmp ARG_1, 0x01 jne mesgin_reject;
  1472. test SCB_RESIDUAL_SGPTR[0], SG_LIST_NULL jz . + 2;
  1473. test DATA_COUNT_ODD, 0x1 jz mesgin_done;
  1474. mvi IGN_WIDE_RES call set_seqint;
  1475. jmp mesgin_done;
  1476. }
  1477. mesgin_reject:
  1478. mvi MSG_MESSAGE_REJECT call mk_mesg;
  1479. mesgin_done:
  1480. mov NONE,SCSIDATL; /*dummy read from latch to ACK*/
  1481. jmp ITloop;
  1482. mesgin_complete:
  1483. /*
  1484.  * We received a "command complete" message.  Put the SCB_TAG into the QOUTFIFO,
  1485.  * and trigger a completion interrupt.  Before doing so, check to see if there
  1486.  * is a residual or the status byte is something other than STATUS_GOOD (0).
  1487.  * In either of these conditions, we upload the SCB back to the host so it can
  1488.  * process this information.  In the case of a non zero status byte, we 
  1489.  * additionally interrupt the kernel driver synchronously, allowing it to
  1490.  * decide if sense should be retrieved.  If the kernel driver wishes to request
  1491.  * sense, it will fill the kernel SCB with a request sense command, requeue
  1492.  * it to the QINFIFO and tell us not to post to the QOUTFIFO by setting 
  1493.  * RETURN_1 to SEND_SENSE.
  1494.  */
  1495. /*
  1496.  * If ATN is raised, we still want to give the target a message.
  1497.  * Perhaps there was a parity error on this last message byte.
  1498.  * Either way, the target should take us to message out phase
  1499.  * and then attempt to complete the command again.  We should use a
  1500.  * critical section here to guard against a timeout triggering
  1501.  * for this command and setting ATN while we are still processing
  1502.  * the completion.
  1503. test SCSISIGI, ATNI jnz mesgin_done;
  1504.  */
  1505. /*
  1506.  * See if we attempted to deliver a message but the target ingnored us.
  1507.  */
  1508. test SCB_CONTROL, MK_MESSAGE jz . + 2;
  1509. mvi MKMSG_FAILED call set_seqint;
  1510. /*
  1511.  * Check for residuals
  1512.  */
  1513. test SCB_SGPTR, SG_LIST_NULL jnz check_status;/* No xfer */
  1514. test SCB_SGPTR, SG_FULL_RESID jnz upload_scb;/* Never xfered */
  1515. test SCB_RESIDUAL_SGPTR, SG_LIST_NULL jz upload_scb;
  1516. check_status:
  1517. test SCB_SCSI_STATUS,0xff jz complete; /* Good Status? */
  1518. upload_scb:
  1519. or SCB_SGPTR, SG_RESID_VALID;
  1520. mvi DMAPARAMS, FIFORESET;
  1521. mov SCB_TAG call dma_scb;
  1522. test SCB_SCSI_STATUS, 0xff jz complete; /* Just a residual? */
  1523. mvi BAD_STATUS call set_seqint; /* let driver know */
  1524. cmp RETURN_1, SEND_SENSE jne complete;
  1525. call add_scb_to_free_list;
  1526. jmp await_busfree;
  1527. complete:
  1528. mov SCB_TAG call complete_post;
  1529. jmp await_busfree;
  1530. }
  1531. complete_post:
  1532. /* Post the SCBID in SINDEX and issue an interrupt */
  1533. call add_scb_to_free_list;
  1534. mov ARG_1, SINDEX;
  1535. if ((ahc->features & AHC_QUEUE_REGS) != 0) {
  1536. mov A, SDSCB_QOFF;
  1537. } else {
  1538. mov A, QOUTPOS;
  1539. }
  1540. mvi QOUTFIFO_OFFSET call post_byte_setup;
  1541. mov ARG_1 call post_byte;
  1542. if ((ahc->features & AHC_QUEUE_REGS) == 0) {
  1543. inc  QOUTPOS;
  1544. }
  1545. mvi INTSTAT,CMDCMPLT ret;
  1546. if ((ahc->flags & AHC_INITIATORROLE) != 0) {
  1547. /*
  1548.  * Is it a disconnect message?  Set a flag in the SCB to remind us
  1549.  * and await the bus going free.  If this is an untagged transaction
  1550.  * store the SCB id for it in our untagged target table for lookup on
  1551.  * a reselction.
  1552.  */
  1553. mesgin_disconnect:
  1554. /*
  1555.  * If ATN is raised, we still want to give the target a message.
  1556.  * Perhaps there was a parity error on this last message byte
  1557.  * or we want to abort this command.  Either way, the target
  1558.  * should take us to message out phase and then attempt to
  1559.  * disconnect again.
  1560.  * XXX - Wait for more testing.
  1561. test SCSISIGI, ATNI jnz mesgin_done;
  1562.  */
  1563. or SCB_CONTROL,DISCONNECTED;
  1564. if ((ahc->flags & AHC_PAGESCBS) != 0) {
  1565. call add_scb_to_disc_list;
  1566. }
  1567. test SCB_CONTROL, TAG_ENB jnz await_busfree;
  1568. mov ARG_1, SCB_TAG;
  1569. mov SAVED_LUN, SCB_LUN;
  1570. mov SCB_SCSIID call set_busy_target;
  1571. jmp await_busfree;
  1572. /*
  1573.  * Save data pointers message:
  1574.  * Copying RAM values back to SCB, for Save Data Pointers message, but
  1575.  * only if we've actually been into a data phase to change them.  This
  1576.  * protects against bogus data in scratch ram and the residual counts
  1577.  * since they are only initialized when we go into data_in or data_out.
  1578.  * Ack the message as soon as possible.  For chips without S/G pipelining,
  1579.  * we can only ack the message after SHADDR has been saved.  On these
  1580.  * chips, SHADDR increments with every bus transaction, even PIO.
  1581.  */
  1582. mesgin_sdptrs:
  1583. if ((ahc->features & AHC_ULTRA2) != 0) {
  1584. mov NONE,SCSIDATL; /*dummy read from latch to ACK*/
  1585. test SEQ_FLAGS, DPHASE jz ITloop;
  1586. } else {
  1587. test SEQ_FLAGS, DPHASE jz mesgin_done;
  1588. }
  1589. /*
  1590.  * If we are asked to save our position at the end of the
  1591.  * transfer, just mark us at the end rather than perform a
  1592.  * full save.
  1593.  */
  1594. test SCB_RESIDUAL_SGPTR[0], SG_LIST_NULL jz mesgin_sdptrs_full;
  1595. or SCB_SGPTR, SG_LIST_NULL;
  1596. if ((ahc->features & AHC_ULTRA2) != 0) {
  1597. jmp ITloop;
  1598. } else {
  1599. jmp mesgin_done;
  1600. }
  1601. mesgin_sdptrs_full:
  1602. /*
  1603.  * The SCB_SGPTR becomes the next one we'll download,
  1604.  * and the SCB_DATAPTR becomes the current SHADDR.
  1605.  * Use the residual number since STCNT is corrupted by
  1606.  * any message transfer.
  1607.  */
  1608. if ((ahc->features & AHC_CMD_CHAN) != 0) {
  1609. bmov SCB_DATAPTR, SHADDR, 4;
  1610. if ((ahc->features & AHC_ULTRA2) == 0) {
  1611. mov NONE,SCSIDATL; /*dummy read from latch to ACK*/
  1612. }
  1613. bmov SCB_DATACNT, SCB_RESIDUAL_DATACNT, 8;
  1614. } else {
  1615. mvi DINDEX, SCB_DATAPTR;
  1616. mvi SHADDR call bcopy_4;
  1617. mov NONE,SCSIDATL; /*dummy read from latch to ACK*/
  1618. mvi SCB_RESIDUAL_DATACNT call bcopy_8;
  1619. }
  1620. jmp ITloop;
  1621. /*
  1622.  * Restore pointers message?  Data pointers are recopied from the
  1623.  * SCB anytime we enter a data phase for the first time, so all
  1624.  * we need to do is clear the DPHASE flag and let the data phase
  1625.  * code do the rest.
  1626.  */
  1627. mesgin_rdptrs:
  1628. and SEQ_FLAGS, ~DPHASE; /*
  1629.  * We'll reload them
  1630.  * the next time through
  1631.  * the dataphase.
  1632.  */
  1633. jmp mesgin_done;
  1634. /*
  1635.  * Index into our Busy Target table.  SINDEX and DINDEX are modified
  1636.  * upon return.  SCBPTR may be modified by this action.
  1637.  */
  1638. set_busy_target:
  1639. shr DINDEX, 4, SINDEX;
  1640. if ((ahc->flags & AHC_SCB_BTT) != 0) {
  1641. mov SCBPTR, SAVED_LUN;
  1642. add DINDEX, SCB_64_BTT;
  1643. } else {
  1644. add DINDEX, BUSY_TARGETS;
  1645. }
  1646. mov DINDIR, ARG_1 ret;
  1647. /*
  1648.  * Identify message?  For a reconnecting target, this tells us the lun
  1649.  * that the reconnection is for - find the correct SCB and switch to it,
  1650.  * clearing the "disconnected" bit so we don't "find" it by accident later.
  1651.  */
  1652. mesgin_identify:
  1653. /*
  1654.  * Determine whether a target is using tagged or non-tagged
  1655.  * transactions by first looking at the transaction stored in
  1656.  * the busy target array.  If there is no untagged transaction
  1657.  * for this target or the transaction is for a different lun, then
  1658.  * this must be an untagged transaction.
  1659.  */
  1660. shr SINDEX, 4, SAVED_SCSIID;
  1661. and SAVED_LUN, MSG_IDENTIFY_LUNMASK, A;
  1662. if ((ahc->flags & AHC_SCB_BTT) != 0) {
  1663. add SINDEX, SCB_64_BTT;
  1664. mov SCBPTR, SAVED_LUN;
  1665. if ((ahc->flags & AHC_SEQUENCER_DEBUG) != 0) {
  1666. add NONE, -SCB_64_BTT, SINDEX;
  1667. jc . + 2;
  1668. mvi INTSTAT, OUT_OF_RANGE;
  1669. nop;
  1670. add NONE, -(SCB_64_BTT + 16), SINDEX;
  1671. jnc . + 2;
  1672. mvi INTSTAT, OUT_OF_RANGE;
  1673. nop;
  1674. }
  1675. } else {
  1676. add SINDEX, BUSY_TARGETS;
  1677. if ((ahc->flags & AHC_SEQUENCER_DEBUG) != 0) {
  1678. add NONE, -BUSY_TARGETS, SINDEX;
  1679. jc . + 2;
  1680. mvi INTSTAT, OUT_OF_RANGE;
  1681. nop;
  1682. add NONE, -(BUSY_TARGETS + 16), SINDEX;
  1683. jnc . + 2;
  1684. mvi INTSTAT, OUT_OF_RANGE;
  1685. nop;
  1686. }
  1687. }
  1688. mov ARG_1, SINDIR;
  1689. cmp ARG_1, SCB_LIST_NULL je snoop_tag;
  1690. if ((ahc->flags & AHC_PAGESCBS) != 0) {
  1691. mov ARG_1 call findSCB;
  1692. } else {
  1693. mov SCBPTR, ARG_1;
  1694. }
  1695. if ((ahc->flags & AHC_SCB_BTT) != 0) {
  1696. jmp setup_SCB_id_lun_okay;
  1697. } else {
  1698. /*
  1699.  * We only allow one untagged command per-target
  1700.  * at a time.  So, if the lun doesn't match, look
  1701.  * for a tag message.
  1702.  */
  1703. mov A, SCB_LUN;
  1704. cmp SAVED_LUN, A je setup_SCB_id_lun_okay;
  1705. if ((ahc->flags & AHC_PAGESCBS) != 0) {
  1706. /*
  1707.  * findSCB removes the SCB from the
  1708.  * disconnected list, so we must replace
  1709.  * it there should this SCB be for another
  1710.  * lun.
  1711.  */
  1712. call cleanup_scb;
  1713. }
  1714. }
  1715. /*
  1716.  * Here we "snoop" the bus looking for a SIMPLE QUEUE TAG message.
  1717.  * If we get one, we use the tag returned to find the proper
  1718.  * SCB.  With SCB paging, we must search for non-tagged
  1719.  * transactions since the SCB may exist in any slot.  If we're not
  1720.  * using SCB paging, we can use the tag as the direct index to the
  1721.  * SCB.
  1722.  */
  1723. snoop_tag:
  1724. if ((ahc->flags & AHC_SEQUENCER_DEBUG) != 0) {
  1725. or SEQ_FLAGS, 0x80;
  1726. }
  1727. mov NONE,SCSIDATL; /* ACK Identify MSG */
  1728. call phase_lock;
  1729. if ((ahc->flags & AHC_SEQUENCER_DEBUG) != 0) {
  1730. or SEQ_FLAGS, 0x1;
  1731. }
  1732. cmp LASTPHASE, P_MESGIN jne not_found;
  1733. if ((ahc->flags & AHC_SEQUENCER_DEBUG) != 0) {
  1734. or SEQ_FLAGS, 0x2;
  1735. }
  1736. cmp SCSIBUSL,MSG_SIMPLE_Q_TAG jne not_found;
  1737. get_tag:
  1738. if ((ahc->flags & AHC_PAGESCBS) != 0) {
  1739. mvi ARG_1 call inb_next; /* tag value */
  1740. mov ARG_1 call findSCB;
  1741. } else {
  1742. mvi ARG_1 call inb_next; /* tag value */
  1743. mov SCBPTR, ARG_1;
  1744. }
  1745. /*
  1746.  * Ensure that the SCB the tag points to is for
  1747.  * an SCB transaction to the reconnecting target.
  1748.  */
  1749. setup_SCB:
  1750. if ((ahc->flags & AHC_SEQUENCER_DEBUG) != 0) {
  1751. or SEQ_FLAGS, 0x4;
  1752. }
  1753. mov A, SCB_SCSIID;
  1754. cmp SAVED_SCSIID, A jne not_found_cleanup_scb;
  1755. if ((ahc->flags & AHC_SEQUENCER_DEBUG) != 0) {
  1756. or SEQ_FLAGS, 0x8;
  1757. }
  1758. setup_SCB_id_okay:
  1759. mov A, SCB_LUN;
  1760. cmp SAVED_LUN, A jne not_found_cleanup_scb;
  1761. setup_SCB_id_lun_okay:
  1762. if ((ahc->flags & AHC_SEQUENCER_DEBUG) != 0) {
  1763. or SEQ_FLAGS, 0x10;
  1764. }
  1765. test SCB_CONTROL,DISCONNECTED jz not_found_cleanup_scb;
  1766. and SCB_CONTROL,~DISCONNECTED;
  1767. test SCB_CONTROL, TAG_ENB jnz setup_SCB_tagged;
  1768. if ((ahc->flags & AHC_SCB_BTT) != 0) {
  1769. mov A, SCBPTR;
  1770. }
  1771. mvi ARG_1, SCB_LIST_NULL;
  1772. mov SAVED_SCSIID call set_busy_target;
  1773. if ((ahc->flags & AHC_SCB_BTT) != 0) {
  1774. mov SCBPTR, A;
  1775. }
  1776. setup_SCB_tagged:
  1777. mvi SEQ_FLAGS,IDENTIFY_SEEN; /* make note of IDENTIFY */
  1778. call set_transfer_settings;
  1779. /* See if the host wants to send a message upon reconnection */
  1780. test SCB_CONTROL, MK_MESSAGE jz mesgin_done;
  1781. mvi HOST_MSG call mk_mesg;
  1782. jmp mesgin_done;
  1783. not_found_cleanup_scb:
  1784. if ((ahc->flags & AHC_PAGESCBS) != 0) {
  1785. call cleanup_scb;
  1786. }
  1787. not_found:
  1788. mvi NO_MATCH call set_seqint;
  1789. jmp mesgin_done;
  1790. mk_mesg:
  1791. if ((ahc->features & AHC_DT) == 0) {
  1792. or SCSISIGO, ATNO, LASTPHASE;
  1793. } else {
  1794. mvi SCSISIGO, ATNO;
  1795. }
  1796. mov MSG_OUT,SINDEX ret;
  1797. /*
  1798.  * Functions to read data in Automatic PIO mode.
  1799.  *
  1800.  * According to Adaptec's documentation, an ACK is not sent on input from
  1801.  * the target until SCSIDATL is read from.  So we wait until SCSIDATL is
  1802.  * latched (the usual way), then read the data byte directly off the bus
  1803.  * using SCSIBUSL.  When we have pulled the ATN line, or we just want to
  1804.  * acknowledge the byte, then we do a dummy read from SCISDATL.  The SCSI
  1805.  * spec guarantees that the target will hold the data byte on the bus until
  1806.  * we send our ACK.
  1807.  *
  1808.  * The assumption here is that these are called in a particular sequence,
  1809.  * and that REQ is already set when inb_first is called.  inb_{first,next}
  1810.  * use the same calling convention as inb.
  1811.  */
  1812. inb_next_wait_perr:
  1813. mvi PERR_DETECTED call set_seqint;
  1814. jmp inb_next_wait;
  1815. inb_next:
  1816. mov NONE,SCSIDATL; /*dummy read from latch to ACK*/
  1817. inb_next_wait:
  1818. /*
  1819.  * If there is a parity error, wait for the kernel to
  1820.  * see the interrupt and prepare our message response
  1821.  * before continuing.
  1822.  */
  1823. test SSTAT1, REQINIT jz inb_next_wait;
  1824. test SSTAT1, SCSIPERR jnz inb_next_wait_perr;
  1825. inb_next_check_phase:
  1826. and LASTPHASE, PHASE_MASK, SCSISIGI;
  1827. cmp LASTPHASE, P_MESGIN jne mesgin_phasemis;
  1828. inb_first:
  1829. mov DINDEX,SINDEX;
  1830. mov DINDIR,SCSIBUSL ret; /*read byte directly from bus*/
  1831. inb_last:
  1832. mov NONE,SCSIDATL ret; /*dummy read from latch to ACK*/
  1833. }
  1834. if ((ahc->flags & AHC_TARGETROLE) != 0) {
  1835. /*
  1836.  * Change to a new phase.  If we are changing the state of the I/O signal,
  1837.  * from out to in, wait an additional data release delay before continuing.
  1838.  */
  1839. change_phase:
  1840. /* Wait for preceeding I/O session to complete. */
  1841. test SCSISIGI, ACKI jnz .;
  1842. /* Change the phase */
  1843. and DINDEX, IOI, SCSISIGI;
  1844. mov SCSISIGO, SINDEX;
  1845. and A, IOI, SINDEX;
  1846. /*
  1847.  * If the data direction has changed, from
  1848.  * out (initiator driving) to in (target driving),
  1849.  * we must wait at least a data release delay plus
  1850.  * the normal bus settle delay. [SCSI III SPI 10.11.0]
  1851.  */
  1852. cmp  DINDEX, A je change_phase_wait;
  1853. test SINDEX, IOI jz change_phase_wait;
  1854. call change_phase_wait;
  1855. change_phase_wait:
  1856. nop;
  1857. nop;
  1858. nop;
  1859. nop ret;
  1860. /*
  1861.  * Send a byte to an initiator in Automatic PIO mode.
  1862.  */
  1863. target_outb:
  1864. or SXFRCTL0, SPIOEN;
  1865. test SSTAT0, SPIORDY jz .;
  1866. mov SCSIDATL, SINDEX;
  1867. test SSTAT0, SPIORDY jz .;
  1868. and SXFRCTL0, ~SPIOEN ret;
  1869. }
  1870. /*
  1871.  * Locate a disconnected SCB by SCBID.  Upon return, SCBPTR and SINDEX will
  1872.  * be set to the position of the SCB.  If the SCB cannot be found locally,
  1873.  * it will be paged in from host memory.  RETURN_2 stores the address of the
  1874.  * preceding SCB in the disconnected list which can be used to speed up
  1875.  * removal of the found SCB from the disconnected list.
  1876.  */
  1877. if ((ahc->flags & AHC_PAGESCBS) != 0) {
  1878. BEGIN_CRITICAL
  1879. findSCB:
  1880. mov A, SINDEX; /* Tag passed in SINDEX */
  1881. cmp DISCONNECTED_SCBH, SCB_LIST_NULL je findSCB_notFound;
  1882. mov SCBPTR, DISCONNECTED_SCBH; /* Initialize SCBPTR */
  1883. mvi ARG_2, SCB_LIST_NULL; /* Head of list */
  1884. jmp findSCB_loop;
  1885. findSCB_next:
  1886. cmp SCB_NEXT, SCB_LIST_NULL je findSCB_notFound;
  1887. mov ARG_2, SCBPTR;
  1888. mov SCBPTR,SCB_NEXT;
  1889. findSCB_loop:
  1890. cmp SCB_TAG, A jne findSCB_next;
  1891. rem_scb_from_disc_list:
  1892. cmp ARG_2, SCB_LIST_NULL je rHead;
  1893. mov DINDEX, SCB_NEXT;
  1894. mov SINDEX, SCBPTR;
  1895. mov SCBPTR, ARG_2;
  1896. mov SCB_NEXT, DINDEX;
  1897. mov SCBPTR, SINDEX ret;
  1898. rHead:
  1899. mov DISCONNECTED_SCBH,SCB_NEXT ret;
  1900. END_CRITICAL
  1901. findSCB_notFound:
  1902. /*
  1903.  * We didn't find it.  Page in the SCB.
  1904.  */
  1905. mov ARG_1, A; /* Save tag */
  1906. mov ALLZEROS call get_free_or_disc_scb;
  1907. mvi DMAPARAMS, HDMAEN|DIRECTION|FIFORESET;
  1908. mov ARG_1 jmp dma_scb;
  1909. }
  1910. /*
  1911.  * Prepare the hardware to post a byte to host memory given an
  1912.  * index of (A + (256 * SINDEX)) and a base address of SHARED_DATA_ADDR.
  1913.  */
  1914. post_byte_setup:
  1915. mov ARG_2, SINDEX;
  1916. if ((ahc->features & AHC_CMD_CHAN) != 0) {
  1917. mvi DINDEX, CCHADDR;
  1918. mvi SHARED_DATA_ADDR call set_1byte_addr;
  1919. mvi CCHCNT, 1;
  1920. mvi CCSCBCTL, CCSCBRESET ret;
  1921. } else {
  1922. mvi DINDEX, HADDR;
  1923. mvi SHARED_DATA_ADDR call set_1byte_addr;
  1924. mvi 1 call set_hcnt;
  1925. mvi DFCNTRL, FIFORESET ret;
  1926. }
  1927. post_byte:
  1928. if ((ahc->features & AHC_CMD_CHAN) != 0) {
  1929. bmov CCSCBRAM, SINDEX, 1;
  1930. or CCSCBCTL, CCSCBEN|CCSCBRESET;
  1931. test CCSCBCTL, CCSCBDONE jz .;
  1932. clr CCSCBCTL ret;
  1933. } else {
  1934. mov DFDAT, SINDEX;
  1935. or DFCNTRL, HDMAEN|FIFOFLUSH;
  1936. jmp dma_finish;
  1937. }
  1938. phase_lock_perr:
  1939. mvi PERR_DETECTED call set_seqint;
  1940. phase_lock:     
  1941. /*
  1942.  * If there is a parity error, wait for the kernel to
  1943.  * see the interrupt and prepare our message response
  1944.  * before continuing.
  1945.  */
  1946. test SSTAT1, REQINIT jz phase_lock;
  1947. test SSTAT1, SCSIPERR jnz phase_lock_perr;
  1948. phase_lock_latch_phase:
  1949. if ((ahc->features & AHC_DT) == 0) {
  1950. and SCSISIGO, PHASE_MASK, SCSISIGI;
  1951. }
  1952. and LASTPHASE, PHASE_MASK, SCSISIGI ret;
  1953. if ((ahc->features & AHC_CMD_CHAN) == 0) {
  1954. set_hcnt:
  1955. mov HCNT[0], SINDEX;
  1956. clear_hcnt:
  1957. clr HCNT[1];
  1958. clr HCNT[2] ret;
  1959. set_stcnt_from_hcnt:
  1960. mov STCNT[0], HCNT[0];
  1961. mov STCNT[1], HCNT[1];
  1962. mov STCNT[2], HCNT[2] ret;
  1963. bcopy_8:
  1964. mov DINDIR, SINDIR;
  1965. bcopy_7:
  1966. mov DINDIR, SINDIR;
  1967. mov DINDIR, SINDIR;
  1968. bcopy_5:
  1969. mov DINDIR, SINDIR;
  1970. bcopy_4:
  1971. mov DINDIR, SINDIR;
  1972. bcopy_3:
  1973. mov DINDIR, SINDIR;
  1974. mov DINDIR, SINDIR;
  1975. mov DINDIR, SINDIR ret;
  1976. }
  1977. if ((ahc->flags & AHC_TARGETROLE) != 0) {
  1978. /*
  1979.  * Setup addr assuming that A is an index into
  1980.  * an array of 32byte objects, SINDEX contains
  1981.  * the base address of that array, and DINDEX
  1982.  * contains the base address of the location
  1983.  * to store the indexed address.
  1984.  */
  1985. set_32byte_addr:
  1986. shr ARG_2, 3, A;
  1987. shl A, 5;
  1988. jmp set_1byte_addr;
  1989. }
  1990. /*
  1991.  * Setup addr assuming that A is an index into
  1992.  * an array of 64byte objects, SINDEX contains
  1993.  * the base address of that array, and DINDEX
  1994.  * contains the base address of the location
  1995.  * to store the indexed address.
  1996.  */
  1997. set_64byte_addr:
  1998. shr ARG_2, 2, A;
  1999. shl A, 6;
  2000. /*
  2001.  * Setup addr assuming that A + (ARG_2 * 256) is an
  2002.  * index into an array of 1byte objects, SINDEX contains
  2003.  * the base address of that array, and DINDEX contains
  2004.  * the base address of the location to store the computed
  2005.  * address.
  2006.  */
  2007. set_1byte_addr:
  2008. add     DINDIR, A, SINDIR;
  2009. mov     A, ARG_2;
  2010. adc DINDIR, A, SINDIR;
  2011. clr A;
  2012. adc DINDIR, A, SINDIR;
  2013. adc DINDIR, A, SINDIR ret;
  2014. /*
  2015.  * Either post or fetch and SCB from host memory based on the
  2016.  * DIRECTION bit in DMAPARAMS. The host SCB index is in SINDEX.
  2017.  */
  2018. dma_scb:
  2019. mov A, SINDEX;
  2020. if ((ahc->features & AHC_CMD_CHAN) != 0) {
  2021. mvi DINDEX, CCHADDR;
  2022. mvi HSCB_ADDR call set_64byte_addr;
  2023. mov CCSCBPTR, SCBPTR;
  2024. test DMAPARAMS, DIRECTION jz dma_scb_tohost;
  2025. if ((ahc->flags & AHC_SCB_BTT) != 0) {
  2026. mvi CCHCNT, SCB_DOWNLOAD_SIZE_64;
  2027. } else {
  2028. mvi CCHCNT, SCB_DOWNLOAD_SIZE;
  2029. }
  2030. mvi CCSCBCTL, CCARREN|CCSCBEN|CCSCBDIR|CCSCBRESET;
  2031. cmp CCSCBCTL, CCSCBDONE|ARRDONE|CCARREN|CCSCBEN|CCSCBDIR jne .;
  2032. jmp dma_scb_finish;
  2033. dma_scb_tohost:
  2034. mvi CCHCNT, SCB_UPLOAD_SIZE;
  2035. if ((ahc->features & AHC_ULTRA2) == 0) {
  2036. mvi CCSCBCTL, CCSCBRESET;
  2037. bmov CCSCBRAM, SCB_BASE, SCB_UPLOAD_SIZE;
  2038. or CCSCBCTL, CCSCBEN|CCSCBRESET;
  2039. test CCSCBCTL, CCSCBDONE jz .;
  2040. } else if ((ahc->bugs & AHC_SCBCHAN_UPLOAD_BUG) != 0) {
  2041. mvi CCSCBCTL, CCARREN|CCSCBRESET;
  2042. cmp CCSCBCTL, ARRDONE|CCARREN jne .;
  2043. mvi CCHCNT, SCB_UPLOAD_SIZE;
  2044. mvi CCSCBCTL, CCSCBEN|CCSCBRESET;
  2045. cmp CCSCBCTL, CCSCBDONE|CCSCBEN jne .;
  2046. } else {
  2047. mvi CCSCBCTL, CCARREN|CCSCBEN|CCSCBRESET;
  2048. cmp CCSCBCTL, CCSCBDONE|ARRDONE|CCARREN|CCSCBEN jne .;
  2049. }
  2050. dma_scb_finish:
  2051. clr CCSCBCTL;
  2052. test CCSCBCTL, CCARREN|CCSCBEN jnz .;
  2053. ret;
  2054. } else {
  2055. mvi DINDEX, HADDR;
  2056. mvi HSCB_ADDR call set_64byte_addr;
  2057. mvi SCB_DOWNLOAD_SIZE call set_hcnt;
  2058. mov DFCNTRL, DMAPARAMS;
  2059. test DMAPARAMS, DIRECTION jnz dma_scb_fromhost;
  2060. /* Fill it with the SCB data */
  2061. copy_scb_tofifo:
  2062. mvi SINDEX, SCB_BASE;
  2063. add A, SCB_DOWNLOAD_SIZE, SINDEX;
  2064. copy_scb_tofifo_loop:
  2065. call copy_to_fifo_8;
  2066. cmp SINDEX, A jne copy_scb_tofifo_loop;
  2067. or DFCNTRL, HDMAEN|FIFOFLUSH;
  2068. jmp dma_finish;
  2069. dma_scb_fromhost:
  2070. mvi DINDEX, SCB_BASE;
  2071. if ((ahc->bugs & AHC_PCI_2_1_RETRY_BUG) != 0) {
  2072. /*
  2073.  * The PCI module will only issue a PCI
  2074.  * retry if the data FIFO is empty.  If the
  2075.  * host disconnects in the middle of a
  2076.  * transfer, we must empty the fifo of all
  2077.  * available data to force the chip to
  2078.  * continue the transfer.  This does not
  2079.  * happen for SCSI transfers as the SCSI module
  2080.  * will drain the FIFO as data is made available.
  2081.  * When the hang occurs, we know that a multiple
  2082.  * of 8 bytes are in the FIFO because the PCI
  2083.  * module has an 8 byte input latch that only
  2084.  * dumps to the FIFO when HCNT == 0 or the
  2085.  * latch is full.
  2086.  */
  2087. clr A;
  2088. /* Wait for at least 8 bytes of data to arrive. */
  2089. dma_scb_hang_fifo:
  2090. test DFSTATUS, FIFOQWDEMP jnz dma_scb_hang_fifo;
  2091. dma_scb_hang_wait:
  2092. test DFSTATUS, MREQPEND jnz dma_scb_hang_wait;
  2093. test DFSTATUS, HDONE jnz dma_scb_hang_dma_done;
  2094. test DFSTATUS, HDONE jnz dma_scb_hang_dma_done;
  2095. test DFSTATUS, HDONE jnz dma_scb_hang_dma_done;
  2096. /*
  2097.  * The PCI module no longer intends to perform
  2098.  * a PCI transaction.  Drain the fifo.
  2099.  */
  2100. dma_scb_hang_dma_drain_fifo:
  2101. not A, HCNT;
  2102. add A, SCB_DOWNLOAD_SIZE+SCB_BASE+1;
  2103. and A, ~0x7;
  2104. mov DINDIR,DFDAT;
  2105. cmp DINDEX, A jne . - 1;
  2106. cmp DINDEX, SCB_DOWNLOAD_SIZE+SCB_BASE
  2107. je dma_finish_nowait;
  2108. /* Restore A as the lines left to transfer. */
  2109. add A, -SCB_BASE, DINDEX;
  2110. shr A, 3;
  2111. jmp dma_scb_hang_fifo;
  2112. dma_scb_hang_dma_done:
  2113. and DFCNTRL, ~HDMAEN;
  2114. test DFCNTRL, HDMAEN jnz .;
  2115. add SEQADDR0, A;
  2116. } else {
  2117. call dma_finish;
  2118. }
  2119. /* If we were putting the SCB, we are done */
  2120. call dfdat_in_8;
  2121. call dfdat_in_8;
  2122. call dfdat_in_8;
  2123. dfdat_in_8:
  2124. mov DINDIR,DFDAT;
  2125. dfdat_in_7:
  2126. mov DINDIR,DFDAT;
  2127. mov DINDIR,DFDAT;
  2128. mov DINDIR,DFDAT;
  2129. mov DINDIR,DFDAT;
  2130. mov DINDIR,DFDAT;
  2131. dfdat_in_2:
  2132. mov DINDIR,DFDAT;
  2133. mov DINDIR,DFDAT ret;
  2134. }
  2135. copy_to_fifo_8:
  2136. mov DFDAT,SINDIR;
  2137. mov DFDAT,SINDIR;
  2138. copy_to_fifo_6:
  2139. mov DFDAT,SINDIR;
  2140. copy_to_fifo_5:
  2141. mov DFDAT,SINDIR;
  2142. copy_to_fifo_4:
  2143. mov DFDAT,SINDIR;
  2144. mov DFDAT,SINDIR;
  2145. mov DFDAT,SINDIR;
  2146. mov DFDAT,SINDIR ret;
  2147. /*
  2148.  * Wait for DMA from host memory to data FIFO to complete, then disable
  2149.  * DMA and wait for it to acknowledge that it's off.
  2150.  */
  2151. dma_finish:
  2152. test DFSTATUS,HDONE jz dma_finish;
  2153. dma_finish_nowait:
  2154. /* Turn off DMA */
  2155. and DFCNTRL, ~HDMAEN;
  2156. test DFCNTRL, HDMAEN jnz .;
  2157. ret;
  2158. /*
  2159.  * Restore an SCB that failed to match an incoming reselection
  2160.  * to the correct/safe state.  If the SCB is for a disconnected
  2161.  * transaction, it must be returned to the disconnected list.
  2162.  * If it is not in the disconnected state, it must be free.
  2163.  */
  2164. cleanup_scb:
  2165. if ((ahc->flags & AHC_PAGESCBS) != 0) {
  2166. test SCB_CONTROL,DISCONNECTED jnz add_scb_to_disc_list;
  2167. }
  2168. add_scb_to_free_list:
  2169. if ((ahc->flags & AHC_PAGESCBS) != 0) {
  2170. BEGIN_CRITICAL
  2171. mov SCB_NEXT, FREE_SCBH;
  2172. mvi SCB_TAG, SCB_LIST_NULL;
  2173. mov FREE_SCBH, SCBPTR ret;
  2174. END_CRITICAL
  2175. } else {
  2176. mvi SCB_TAG, SCB_LIST_NULL ret;
  2177. }
  2178. if ((ahc->flags & AHC_39BIT_ADDRESSING) != 0) {
  2179. set_hhaddr:
  2180. or DSCOMMAND1, HADDLDSEL0;
  2181. and HADDR, SG_HIGH_ADDR_BITS, SINDEX;
  2182. and DSCOMMAND1, ~HADDLDSEL0 ret;
  2183. }
  2184. if ((ahc->flags & AHC_PAGESCBS) != 0) {
  2185. get_free_or_disc_scb:
  2186. BEGIN_CRITICAL
  2187. cmp FREE_SCBH, SCB_LIST_NULL jne dequeue_free_scb;
  2188. cmp DISCONNECTED_SCBH, SCB_LIST_NULL jne dequeue_disc_scb;
  2189. return_error:
  2190. mvi NO_FREE_SCB call set_seqint;
  2191. mvi SINDEX, SCB_LIST_NULL ret;
  2192. dequeue_disc_scb:
  2193. mov SCBPTR, DISCONNECTED_SCBH;
  2194. mov DISCONNECTED_SCBH, SCB_NEXT;
  2195. END_CRITICAL
  2196. mvi DMAPARAMS, FIFORESET;
  2197. mov SCB_TAG jmp dma_scb;
  2198. BEGIN_CRITICAL
  2199. dequeue_free_scb:
  2200. mov SCBPTR, FREE_SCBH;
  2201. mov FREE_SCBH, SCB_NEXT ret;
  2202. END_CRITICAL
  2203. add_scb_to_disc_list:
  2204. /*
  2205.  * Link this SCB into the DISCONNECTED list.  This list holds the
  2206.  * candidates for paging out an SCB if one is needed for a new command.
  2207.  * Modifying the disconnected list is a critical(pause dissabled) section.
  2208.  */
  2209. BEGIN_CRITICAL
  2210. mov SCB_NEXT, DISCONNECTED_SCBH;
  2211. mov DISCONNECTED_SCBH, SCBPTR ret;
  2212. END_CRITICAL
  2213. }
  2214. set_seqint:
  2215. mov INTSTAT, SINDEX;
  2216. nop;
  2217. return:
  2218. ret;