aic7xxx.seq
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:68k
源码类别:

Linux/Unix编程

开发平台:

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