[BACK]Return to aic79xx.seq CVS log [TXT][DIR] Up to [local] / sys / dev / microcode / aic7xxx

Annotation of sys/dev/microcode/aic7xxx/aic79xx.seq, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: aic79xx.seq,v 1.8 2007/05/26 00:36:03 krw Exp $       */
                      2: /*
                      3:  * Adaptec U320 device driver firmware for Linux and FreeBSD.
                      4:  *
                      5:  * Copyright (c) 1994-2001, 2004 Justin T. Gibbs.
                      6:  * Copyright (c) 2000-2002 Adaptec Inc.
                      7:  * All rights reserved.
                      8:  *
                      9:  * Redistribution and use in source and binary forms, with or without
                     10:  * modification, are permitted provided that the following conditions
                     11:  * are met:
                     12:  * 1. Redistributions of source code must retain the above copyright
                     13:  *    notice, this list of conditions, and the following disclaimer,
                     14:  *    without modification.
                     15:  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
                     16:  *    substantially similar to the "NO WARRANTY" disclaimer below
                     17:  *    ("Disclaimer") and any redistribution must be conditioned upon
                     18:  *    including a substantially similar Disclaimer requirement for further
                     19:  *    binary redistribution.
                     20:  * 3. Neither the names of the above-listed copyright holders nor the names
                     21:  *    of any contributors may be used to endorse or promote products derived
                     22:  *    from this software without specific prior written permission.
                     23:  *
                     24:  * Alternatively, this software may be distributed under the terms of the
                     25:  * GNU General Public License ("GPL") version 2 as published by the Free
                     26:  * Software Foundation.
                     27:  *
                     28:  * NO WARRANTY
                     29:  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
                     30:  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
                     31:  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
                     32:  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
                     33:  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     34:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     35:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     36:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
                     37:  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
                     38:  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     39:  * POSSIBILITY OF SUCH DAMAGES.
                     40:  *
                     41:  * $FreeBSD: src/sys/dev/aic7xxx/aic79xx.seq,v 1.17 2004/08/04 17:55:34 gibbs Exp $
                     42:  */
                     43:
                     44: VERSION = "$Id: aic79xx.seq,v 1.8 2007/05/26 00:36:03 krw Exp $"
                     45: PATCH_ARG_LIST = "struct ahd_softc *ahd"
                     46: PREFIX = "ahd_"
                     47:
                     48: #include <dev/microcode/aic7xxx/aic79xx.reg>
                     49: #include <scsi/scsi_message.h>
                     50:
                     51: restart:
                     52: if ((ahd->bugs & AHD_INTCOLLISION_BUG) != 0) {
                     53:        test    SEQINTCODE, 0xFF jz idle_loop;
                     54:        SET_SEQINTCODE(NO_SEQINT)
                     55: }
                     56:
                     57: idle_loop:
                     58:
                     59:        if ((ahd->bugs & AHD_INTCOLLISION_BUG) != 0) {
                     60:                /*
                     61:                 * Convert ERROR status into a sequencer
                     62:                 * interrupt to handle the case of an
                     63:                 * interrupt collision on the hardware
                     64:                 * setting of HWERR.
                     65:                 */
                     66:                test    ERROR, 0xFF jz no_error_set;
                     67:                SET_SEQINTCODE(SAW_HWERR)
                     68: no_error_set:
                     69:        }
                     70:        SET_MODE(M_SCSI, M_SCSI)
                     71:        test    SCSISEQ0, ENSELO|ENARBO jnz idle_loop_checkbus;
                     72:        test    SEQ_FLAGS2, SELECTOUT_QFROZEN jz check_waiting_list;
                     73:        /*
                     74:         * If the kernel has caught up with us, thaw the queue.
                     75:         */
                     76:        mov     A, KERNEL_QFREEZE_COUNT;
                     77:        cmp     QFREEZE_COUNT, A jne check_frozen_completions;
                     78:        mov     A, KERNEL_QFREEZE_COUNT[1];
                     79:        cmp     QFREEZE_COUNT[1], A jne check_frozen_completions;
                     80:        and     SEQ_FLAGS2, ~SELECTOUT_QFROZEN;
                     81:        jmp     check_waiting_list;
                     82: check_frozen_completions:
                     83:        test    SSTAT0, SELDO|SELINGO jnz idle_loop_checkbus;
                     84: BEGIN_CRITICAL;
                     85:        /*
                     86:         * If we have completions stalled waiting for the qfreeze
                     87:         * to take effect, move them over to the complete_scb list
                     88:         * now that no selections are pending.
                     89:         */
                     90:        cmp     COMPLETE_ON_QFREEZE_HEAD[1],SCB_LIST_NULL je idle_loop_checkbus;
                     91:        /*
                     92:         * Find the end of the qfreeze list.  The first element has
                     93:         * to be treated specially.
                     94:         */
                     95:        bmov    SCBPTR, COMPLETE_ON_QFREEZE_HEAD, 2;
                     96:        cmp     SCB_NEXT_COMPLETE[1], SCB_LIST_NULL je join_lists;
                     97:        /*
                     98:         * Now the normal loop.
                     99:         */
                    100:        bmov    SCBPTR, SCB_NEXT_COMPLETE, 2;
                    101:        cmp     SCB_NEXT_COMPLETE[1], SCB_LIST_NULL jne . - 1;
                    102: join_lists:
                    103:        bmov    SCB_NEXT_COMPLETE, COMPLETE_SCB_HEAD, 2;
                    104:        bmov    COMPLETE_SCB_HEAD, COMPLETE_ON_QFREEZE_HEAD, 2;
                    105:        mvi     COMPLETE_ON_QFREEZE_HEAD[1], SCB_LIST_NULL;
                    106:        jmp     idle_loop_checkbus;
                    107: check_waiting_list:
                    108:        cmp     WAITING_TID_HEAD[1], SCB_LIST_NULL je idle_loop_checkbus;
                    109:        /*
                    110:         * ENSELO is cleared by a SELDO, so we must test for SELDO
                    111:         * one last time.
                    112:         */
                    113:        test    SSTAT0, SELDO jnz select_out;
                    114:        call    start_selection;
                    115: idle_loop_checkbus:
                    116:        test    SSTAT0, SELDO jnz select_out;
                    117: END_CRITICAL;
                    118:        test    SSTAT0, SELDI jnz select_in;
                    119:        test    SCSIPHASE, ~DATA_PHASE_MASK jz idle_loop_check_nonpackreq;
                    120:        test    SCSISIGO, ATNO jz idle_loop_check_nonpackreq;
                    121:        call    unexpected_nonpkt_phase_find_ctxt;
                    122: idle_loop_check_nonpackreq:
                    123:        test    SSTAT2, NONPACKREQ jz . + 2;
                    124:        call    unexpected_nonpkt_phase_find_ctxt;
                    125:        if ((ahd->bugs & AHD_FAINT_LED_BUG) != 0) {
                    126:                /*
                    127:                 * On Rev A. hardware, the busy LED is only
                    128:                 * turned on automatically during selections
                    129:                 * and re-selections.  Make the LED status
                    130:                 * more useful by forcing it to be on so
                    131:                 * long as one of our data FIFOs is active.
                    132:                 */
                    133:                and     A, FIFO0FREE|FIFO1FREE, DFFSTAT;
                    134:                cmp     A, FIFO0FREE|FIFO1FREE jne . + 3;
                    135:                and     SBLKCTL, ~DIAGLEDEN|DIAGLEDON;
                    136:                jmp     . + 2;
                    137:                or      SBLKCTL, DIAGLEDEN|DIAGLEDON;
                    138:        }
                    139:        call    idle_loop_gsfifo_in_scsi_mode;
                    140:        call    idle_loop_service_fifos;
                    141:        call    idle_loop_cchan;
                    142:        jmp     idle_loop;
                    143:
                    144: idle_loop_gsfifo:
                    145:        SET_MODE(M_SCSI, M_SCSI)
                    146: BEGIN_CRITICAL;
                    147: idle_loop_gsfifo_in_scsi_mode:
                    148:        test    LQISTAT2, LQIGSAVAIL jz return;
                    149:        /*
                    150:         * We have received good status for this transaction.  There may
                    151:         * still be data in our FIFOs draining to the host.  Complete
                    152:         * the SCB only if all data has transferred to the host.
                    153:         */
                    154: good_status_IU_done:
                    155:        bmov    SCBPTR, GSFIFO, 2;
                    156:        clr     SCB_SCSI_STATUS;
                    157:        /*
                    158:         * If a command completed before an attempted task management
                    159:         * function completed, notify the host after disabling any
                    160:         * pending select-outs.
                    161:         */
                    162:        test    SCB_TASK_MANAGEMENT, 0xFF jz gsfifo_complete_normally;
                    163:        test    SSTAT0, SELDO|SELINGO jnz . + 2;
                    164:        and     SCSISEQ0, ~ENSELO;
                    165:        SET_SEQINTCODE(TASKMGMT_CMD_CMPLT_OKAY)
                    166: gsfifo_complete_normally:
                    167:        or      SCB_CONTROL, STATUS_RCVD;
                    168:
                    169:        /*
                    170:         * Since this status did not consume a FIFO, we have to
                    171:         * be a bit more diligent in how we check for FIFOs pertaining
                    172:         * to this transaction.  There are two states that a FIFO still
                    173:         * transferring data may be in.
                    174:         *
                    175:         * 1) Configured and draining to the host, with a FIFO handler.
                    176:         * 2) Pending cfg4data, fifo not empty.
                    177:         *
                    178:         * Case 1 can be detected by noticing a non-zero FIFO active
                    179:         * count in the SCB.  In this case, we allow the routine servicing
                    180:         * the FIFO to complete the SCB.
                    181:         *
                    182:         * Case 2 implies either a pending or yet to occur save data
                    183:         * pointers for this same context in the other FIFO.  So, if
                    184:         * we detect case 1, we will properly defer the post of the SCB
                    185:         * and achieve the desired result.  The pending cfg4data will
                    186:         * notice that status has been received and complete the SCB.
                    187:         */
                    188:        test    SCB_FIFO_USE_COUNT, 0xFF jnz idle_loop_gsfifo_in_scsi_mode;
                    189:        call    complete;
                    190: END_CRITICAL;
                    191:        jmp     idle_loop_gsfifo_in_scsi_mode;
                    192:
                    193: idle_loop_service_fifos:
                    194:        SET_MODE(M_DFF0, M_DFF0)
                    195: BEGIN_CRITICAL;
                    196:        test    LONGJMP_ADDR[1], INVALID_ADDR jnz idle_loop_next_fifo;
                    197:        call    longjmp;
                    198: END_CRITICAL;
                    199: idle_loop_next_fifo:
                    200:        SET_MODE(M_DFF1, M_DFF1)
                    201: BEGIN_CRITICAL;
                    202:        test    LONGJMP_ADDR[1], INVALID_ADDR jz longjmp;
                    203: END_CRITICAL;
                    204: return:
                    205:        ret;
                    206:
                    207: idle_loop_cchan:
                    208:        SET_MODE(M_CCHAN, M_CCHAN)
                    209:        test    QOFF_CTLSTA, HS_MAILBOX_ACT jz  hs_mailbox_empty;
                    210:        or      QOFF_CTLSTA, HS_MAILBOX_ACT;
                    211:        mov     LOCAL_HS_MAILBOX, HS_MAILBOX;
                    212: hs_mailbox_empty:
                    213: BEGIN_CRITICAL;
                    214:        test    CCSCBCTL, CCARREN|CCSCBEN jz scbdma_idle;
                    215:        test    CCSCBCTL, CCSCBDIR jnz fetch_new_scb_inprog;
                    216:        test    CCSCBCTL, CCSCBDONE jz return;
                    217:        /* FALLTHROUGH */
                    218: scbdma_tohost_done:
                    219:        test    CCSCBCTL, CCARREN jz fill_qoutfifo_dmadone;
                    220:        /*
                    221:         * An SCB has been successfully uploaded to the host.
                    222:         * If the SCB was uploaded for some reason other than
                    223:         * bad SCSI status (currently only for underruns), we
                    224:         * queue the SCB for normal completion.  Otherwise, we
                    225:         * wait until any select-out activity has halted, and
                    226:         * then queue the completion.
                    227:         */
                    228:        and     CCSCBCTL, ~(CCARREN|CCSCBEN);
                    229:        bmov    COMPLETE_DMA_SCB_HEAD, SCB_NEXT_COMPLETE, 2;
                    230:        cmp     SCB_NEXT_COMPLETE[1], SCB_LIST_NULL jne . + 2;
                    231:        mvi     COMPLETE_DMA_SCB_TAIL[1], SCB_LIST_NULL;
                    232:        test    SCB_SCSI_STATUS, 0xff jz scbdma_queue_completion;
                    233:        bmov    SCB_NEXT_COMPLETE, COMPLETE_ON_QFREEZE_HEAD, 2;
                    234:        bmov    COMPLETE_ON_QFREEZE_HEAD, SCBPTR, 2 ret;
                    235: scbdma_queue_completion:
                    236:        bmov    SCB_NEXT_COMPLETE, COMPLETE_SCB_HEAD, 2;
                    237:        bmov    COMPLETE_SCB_HEAD, SCBPTR, 2 ret;
                    238: fill_qoutfifo_dmadone:
                    239:        and     CCSCBCTL, ~(CCARREN|CCSCBEN);
                    240:        call    qoutfifo_updated;
                    241:        mvi     COMPLETE_SCB_DMAINPROG_HEAD[1], SCB_LIST_NULL;
                    242:        bmov    QOUTFIFO_NEXT_ADDR, SCBHADDR, 4;
                    243:        test    QOFF_CTLSTA, SDSCB_ROLLOVR jz return;
                    244:        bmov    QOUTFIFO_NEXT_ADDR, SHARED_DATA_ADDR, 4;
                    245:        xor     QOUTFIFO_ENTRY_VALID_TAG, QOUTFIFO_ENTRY_VALID_TOGGLE ret;
                    246: END_CRITICAL;
                    247:
                    248: qoutfifo_updated:
                    249:        /*
                    250:         * If there are more commands waiting to be dma'ed
                    251:         * to the host, always coalesce.  Otherwise honor the
                    252:         * host's wishes.
                    253:         */
                    254:        cmp     COMPLETE_DMA_SCB_HEAD[1], SCB_LIST_NULL jne coalesce_by_count;
                    255:        cmp     COMPLETE_SCB_HEAD[1], SCB_LIST_NULL jne coalesce_by_count;
                    256:        test    LOCAL_HS_MAILBOX, ENINT_COALESCE jz issue_cmdcmplt;
                    257:
                    258:        /*
                    259:         * If we have relatively few commands outstanding, don't
                    260:         * bother waiting for another command to complete.
                    261:         */
                    262:        test    CMDS_PENDING[1], 0xFF jnz coalesce_by_count;
                    263:        /* Add -1 so that jnc means <= not just < */
                    264:        add     A, -1, INT_COALESCING_MINCMDS;
                    265:        add     NONE, A, CMDS_PENDING;
                    266:        jnc     issue_cmdcmplt;
                    267:
                    268:        /*
                    269:         * If coalescing, only coalesce up to the limit
                    270:         * provided by the host driver.
                    271:         */
                    272: coalesce_by_count:
                    273:        mov     A, INT_COALESCING_MAXCMDS;
                    274:        add     NONE, A, INT_COALESCING_CMDCOUNT;
                    275:        jc      issue_cmdcmplt;
                    276:        /*
                    277:         * If the timer is not currently active,
                    278:         * fire it up.
                    279:         */
                    280:        test    INTCTL, SWTMINTMASK jz return;
                    281:        bmov    SWTIMER, INT_COALESCING_TIMER, 2;
                    282:        mvi     CLRSEQINTSTAT, CLRSEQ_SWTMRTO;
                    283:        or      INTCTL, SWTMINTEN|SWTIMER_START;
                    284:        and     INTCTL, ~SWTMINTMASK ret;
                    285:
                    286: issue_cmdcmplt:
                    287:        mvi     INTSTAT, CMDCMPLT;
                    288:        clr     INT_COALESCING_CMDCOUNT;
                    289:        or      INTCTL, SWTMINTMASK ret;
                    290:
                    291: BEGIN_CRITICAL;
                    292: fetch_new_scb_inprog:
                    293:        test    CCSCBCTL, ARRDONE jz return;
                    294: fetch_new_scb_done:
                    295:        and     CCSCBCTL, ~(CCARREN|CCSCBEN);
                    296:        clr     A;
                    297:        add     CMDS_PENDING, 1;
                    298:        adc     CMDS_PENDING[1], A;
                    299:        if ((ahd->bugs & AHD_PKT_LUN_BUG) != 0) {
                    300:                /*
                    301:                 * "Short Luns" are not placed into outgoing LQ
                    302:                 * packets in the correct byte order.  Use a full
                    303:                 * sized lun field instead and fill it with the
                    304:                 * one byte of lun information we support.
                    305:                 */
                    306:                mov     SCB_PKT_LUN[6], SCB_LUN;
                    307:        }
                    308:        /*
                    309:         * The FIFO use count field is shared with the
                    310:         * tag set by the host so that our SCB dma engine
                    311:         * knows the correct location to store the SCB.
                    312:         * Set it to zero before processing the SCB.
                    313:         */
                    314:        clr     SCB_FIFO_USE_COUNT;
                    315:        /* Update the next SCB address to download. */
                    316:        bmov    NEXT_QUEUED_SCB_ADDR, SCB_NEXT_SCB_BUSADDR, 4;
                    317:        /*
                    318:         * NULL out the SCB links since these fields
                    319:         * occupy the same location as SCB_NEXT_SCB_BUSADDR.
                    320:         */
                    321:        mvi     SCB_NEXT[1], SCB_LIST_NULL;
                    322:        mvi     SCB_NEXT2[1], SCB_LIST_NULL;
                    323:        /* Increment our position in the QINFIFO. */
                    324:        mov     NONE, SNSCB_QOFF;
                    325:
                    326:        /*
                    327:         * Save SCBID of this SCB in REG0 since
                    328:         * SCBPTR will be clobbered during target
                    329:         * list updates.  We also record the SCB's
                    330:         * flags so that we can refer to them even
                    331:         * after SCBPTR has been changed.
                    332:         */
                    333:        bmov    REG0, SCBPTR, 2;
                    334:        mov     A, SCB_CONTROL;
                    335:
                    336:        /*
                    337:         * Find the tail SCB of the execution queue
                    338:         * for this target.
                    339:         */
                    340:        shr     SINDEX, 3, SCB_SCSIID;
                    341:        and     SINDEX, ~0x1;
                    342:        mvi     SINDEX[1], (WAITING_SCB_TAILS >> 8);
                    343:        bmov    DINDEX, SINDEX, 2;
                    344:        bmov    SCBPTR, SINDIR, 2;
                    345:
                    346:        /*
                    347:         * Update the tail to point to the new SCB.
                    348:         */
                    349:        bmov    DINDIR, REG0, 2;
                    350:
                    351:        /*
                    352:         * If the queue was empty, queue this SCB as
                    353:         * the first for this target.
                    354:         */
                    355:        cmp     SCBPTR[1], SCB_LIST_NULL je first_new_target_scb;
                    356:
                    357:        /*
                    358:         * SCBs that want to send messages must always be
                    359:         * at the head of their per-target queue so that
                    360:         * ATN can be asserted even if the current
                    361:         * negotiation agreement is packetized.  If the
                    362:         * target queue is empty, the SCB can be queued
                    363:         * immediately.  If the queue is not empty, we must
                    364:         * wait for it to empty before entering this SCB
                    365:         * into the waiting for selection queue.  Otherwise
                    366:         * our batching and round-robin selection scheme
                    367:         * could allow commands to be queued out of order.
                    368:         * To simplify the implementation, we stop pulling
                    369:         * new commands from the host until the MK_MESSAGE
                    370:         * SCB can be queued to the waiting for selection
                    371:         * list.
                    372:         */
                    373:        test    A, MK_MESSAGE jz batch_scb;
                    374:
                    375:        /*
                    376:         * If the last SCB is also a MK_MESSAGE SCB, then
                    377:         * order is preserved even if we batch.
                    378:         */
                    379:        test    SCB_CONTROL, MK_MESSAGE jz batch_scb;
                    380:
                    381:        /*
                    382:         * Defer this SCB and stop fetching new SCBs until
                    383:         * it can be queued.  Since the SCB_SCSIID of the
                    384:         * tail SCB must be the same as that of the newly
                    385:         * queued SCB, there is no need to restore the SCBID
                    386:         * here.
                    387:         */
                    388:        or      SEQ_FLAGS2, PENDING_MK_MESSAGE;
                    389:        bmov    MK_MESSAGE_SCB, REG0, 2;
                    390:        mov     MK_MESSAGE_SCSIID, SCB_SCSIID ret;
                    391:
                    392: batch_scb:
                    393:        /*
                    394:         * Otherwise just update the previous tail SCB to
                    395:         * point to the new tail.
                    396:         */
                    397:        bmov    SCB_NEXT, REG0, 2 ret;
                    398:
                    399: first_new_target_scb:
                    400:        /*
                    401:         * Append SCB to the tail of the waiting for
                    402:         * selection list.
                    403:         */
                    404:        cmp     WAITING_TID_HEAD[1], SCB_LIST_NULL je first_new_scb;
                    405:        bmov    SCBPTR, WAITING_TID_TAIL, 2;
                    406:        bmov    SCB_NEXT2, REG0, 2;
                    407:        bmov    WAITING_TID_TAIL, REG0, 2 ret;
                    408: first_new_scb:
                    409:        /*
                    410:         * Whole list is empty, so the head of
                    411:         * the list must be initialized too.
                    412:         */
                    413:        bmov    WAITING_TID_HEAD, REG0, 2;
                    414:        bmov    WAITING_TID_TAIL, REG0, 2 ret;
                    415: END_CRITICAL;
                    416:
                    417: scbdma_idle:
                    418:        /*
                    419:         * Don't bother downloading new SCBs to execute
                    420:         * if select-outs are currently frozen or we have
                    421:         * a MK_MESSAGE SCB waiting to enter the queue.
                    422:         */
                    423:        test    SEQ_FLAGS2, SELECTOUT_QFROZEN|PENDING_MK_MESSAGE
                    424:                jnz scbdma_no_new_scbs;
                    425: BEGIN_CRITICAL;
                    426:        test    QOFF_CTLSTA, NEW_SCB_AVAIL jnz fetch_new_scb;
                    427: scbdma_no_new_scbs:
                    428:        cmp     COMPLETE_DMA_SCB_HEAD[1], SCB_LIST_NULL jne dma_complete_scb;
                    429:        cmp     COMPLETE_SCB_HEAD[1], SCB_LIST_NULL je return;
                    430:        /* FALLTHROUGH */
                    431: fill_qoutfifo:
                    432:        /*
                    433:         * Keep track of the SCBs we are dmaing just
                    434:         * in case the DMA fails or is aborted.
                    435:         */
                    436:        bmov    COMPLETE_SCB_DMAINPROG_HEAD, COMPLETE_SCB_HEAD, 2;
                    437:        mvi     CCSCBCTL, CCSCBRESET;
                    438:        bmov    SCBHADDR, QOUTFIFO_NEXT_ADDR, 4;
                    439:        mov     A, QOUTFIFO_NEXT_ADDR;
                    440:        bmov    SCBPTR, COMPLETE_SCB_HEAD, 2;
                    441: fill_qoutfifo_loop:
                    442:        bmov    CCSCBRAM, SCBPTR, 2;
                    443:        mov     CCSCBRAM, SCB_SGPTR[0];
                    444:        mov     CCSCBRAM, QOUTFIFO_ENTRY_VALID_TAG;
                    445:        mov     NONE, SDSCB_QOFF;
                    446:        inc     INT_COALESCING_CMDCOUNT;
                    447:        add     CMDS_PENDING, -1;
                    448:        adc     CMDS_PENDING[1], -1;
                    449:        cmp     SCB_NEXT_COMPLETE[1], SCB_LIST_NULL je fill_qoutfifo_done;
                    450:        cmp     CCSCBADDR, CCSCBADDR_MAX je fill_qoutfifo_done;
                    451:        test    QOFF_CTLSTA, SDSCB_ROLLOVR jnz fill_qoutfifo_done;
                    452:        /*
                    453:         * Don't cross an ADB or Cachline boundary when DMA'ing
                    454:         * completion entries.  In PCI mode, at least in 32/33
                    455:         * configurations, the SCB DMA engine may lose its place
                    456:         * in the data-stream should the target force a retry on
                    457:         * something other than an 8byte aligned boundary. In
                    458:         * PCI-X mode, we do this to avoid split transactions since
                    459:         * many chipsets seem to be unable to format proper split
                    460:         * completions to continue the data transfer.
                    461:         */
                    462:        add     SINDEX, A, CCSCBADDR;
                    463:        test    SINDEX, CACHELINE_MASK jz fill_qoutfifo_done;
                    464:        bmov    SCBPTR, SCB_NEXT_COMPLETE, 2;
                    465:        jmp     fill_qoutfifo_loop;
                    466: fill_qoutfifo_done:
                    467:        mov     SCBHCNT, CCSCBADDR;
                    468:        mvi     CCSCBCTL, CCSCBEN|CCSCBRESET;
                    469:        bmov    COMPLETE_SCB_HEAD, SCB_NEXT_COMPLETE, 2;
                    470:        mvi     SCB_NEXT_COMPLETE[1], SCB_LIST_NULL ret;
                    471:
                    472: fetch_new_scb:
                    473:        bmov    SCBHADDR, NEXT_QUEUED_SCB_ADDR, 4;
                    474:        mvi     CCARREN|CCSCBEN|CCSCBDIR|CCSCBRESET jmp dma_scb;
                    475: dma_complete_scb:
                    476:        bmov    SCBPTR, COMPLETE_DMA_SCB_HEAD, 2;
                    477:        bmov    SCBHADDR, SCB_BUSADDR, 4;
                    478:        mvi     CCARREN|CCSCBEN|CCSCBRESET jmp dma_scb;
                    479:
                    480: /*
                    481:  * Either post or fetch an SCB from host memory.  The caller
                    482:  * is responsible for polling for transfer completion.
                    483:  *
                    484:  * Prerequisites: Mode == M_CCHAN
                    485:  *               SINDEX contains CCSCBCTL flags
                    486:  *               SCBHADDR set to Host SCB address
                    487:  *               SCBPTR set to SCB src location on "push" operations
                    488:  */
                    489: SET_SRC_MODE   M_CCHAN;
                    490: SET_DST_MODE   M_CCHAN;
                    491: dma_scb:
                    492:        mvi     SCBHCNT, SCB_TRANSFER_SIZE;
                    493:        mov     CCSCBCTL, SINDEX ret;
                    494:
                    495: setjmp:
                    496:        /*
                    497:         * At least on the A, a return in the same
                    498:         * instruction as the bmov results in a return
                    499:         * to the caller, not to the new address at the
                    500:         * top of the stack.  Since we want the latter
                    501:         * (we use setjmp to register a handler from an
                    502:         * interrupt context but not invoke that handler
                    503:         * until we return to our idle loop), use a
                    504:         * separate ret instruction.
                    505:         */
                    506:        bmov    LONGJMP_ADDR, STACK, 2;
                    507:        ret;
                    508: setjmp_inline:
                    509:        bmov    LONGJMP_ADDR, STACK, 2;
                    510: longjmp:
                    511:        bmov    STACK, LONGJMP_ADDR, 2 ret;
                    512: END_CRITICAL;
                    513:
                    514: /*************************** Chip Bug Work Arounds ****************************/
                    515: /*
                    516:  * Must disable interrupts when setting the mode pointer
                    517:  * register as an interrupt occurring mid update will
                    518:  * fail to store the new mode value for restoration on
                    519:  * an iret.
                    520:  */
                    521: if ((ahd->bugs & AHD_SET_MODE_BUG) != 0) {
                    522: set_mode_work_around:
                    523:        mvi     SEQINTCTL, INTVEC1DSL;
                    524:        mov     MODE_PTR, SINDEX;
                    525:        clr     SEQINTCTL ret;
                    526: }
                    527:
                    528:
                    529: if ((ahd->bugs & AHD_INTCOLLISION_BUG) != 0) {
                    530: set_seqint_work_around:
                    531:        mov     SEQINTCODE, SINDEX;
                    532:        mvi     SEQINTCODE, NO_SEQINT ret;
                    533: }
                    534:
                    535: /************************ Packetized LongJmp Routines *************************/
                    536: SET_SRC_MODE   M_SCSI;
                    537: SET_DST_MODE   M_SCSI;
                    538: start_selection:
                    539: BEGIN_CRITICAL;
                    540:        if ((ahd->bugs & AHD_SENT_SCB_UPDATE_BUG) != 0) {
                    541:                /*
                    542:                 * Razor #494
                    543:                 * Rev A hardware fails to update LAST/CURR/NEXTSCB
                    544:                 * correctly after a packetized selection in several
                    545:                 * situations:
                    546:                 *
                    547:                 * 1) If only one command existed in the queue, the
                    548:                 *    LAST/CURR/NEXTSCB are unchanged.
                    549:                 *
                    550:                 * 2) In a non QAS, protocol allowed phase change,
                    551:                 *    the queue is shifted 1 too far.  LASTSCB is
                    552:                 *    the last SCB that was correctly processed.
                    553:                 *
                    554:                 * 3) In the QAS case, if the full list of commands
                    555:                 *    was successfully sent, NEXTSCB is NULL and neither
                    556:                 *    CURRSCB nor LASTSCB can be trusted.  We must
                    557:                 *    manually walk the list counting MAXCMDCNT elements
                    558:                 *    to find the last SCB that was sent correctly.
                    559:                 *
                    560:                 * To simplify the workaround for this bug in SELDO
                    561:                 * handling, we initialize LASTSCB prior to enabling
                    562:                 * selection so we can rely on it even for case #1 above.
                    563:                 */
                    564:                bmov    LASTSCB, WAITING_TID_HEAD, 2;
                    565:        }
                    566:        bmov    CURRSCB, WAITING_TID_HEAD, 2;
                    567:        bmov    SCBPTR, WAITING_TID_HEAD, 2;
                    568:        shr     SELOID, 4, SCB_SCSIID;
                    569:        /*
                    570:         * If we want to send a message to the device, ensure
                    571:         * we are selecting with atn irregardless of our packetized
                    572:         * agreement.  Since SPI4 only allows target reset or PPR
                    573:         * messages if this is a packetized connection, the change
                    574:         * to our negotiation table entry for this selection will
                    575:         * be cleared when the message is acted on.
                    576:         */
                    577:        test    SCB_CONTROL, MK_MESSAGE jz . + 3;
                    578:        mov     NEGOADDR, SELOID;
                    579:        or      NEGCONOPTS, ENAUTOATNO;
                    580:        or      SCSISEQ0, ENSELO ret;
                    581: END_CRITICAL;
                    582:
                    583: /*
                    584:  * Allocate a FIFO for a non-packetized transaction.
                    585:  * In RevA hardware, both FIFOs must be free before we
                    586:  * can allocate a FIFO for a non-packetized transaction.
                    587:  */
                    588: allocate_fifo_loop:
                    589:        /*
                    590:         * Do whatever work is required to free a FIFO.
                    591:         */
                    592:        call    idle_loop_service_fifos;
                    593:        SET_MODE(M_SCSI, M_SCSI)
                    594: allocate_fifo:
                    595:        if ((ahd->bugs & AHD_NONPACKFIFO_BUG) != 0) {
                    596:                and     A, FIFO0FREE|FIFO1FREE, DFFSTAT;
                    597:                cmp     A, FIFO0FREE|FIFO1FREE jne allocate_fifo_loop;
                    598:        } else {
                    599:                test    DFFSTAT, FIFO1FREE jnz allocate_fifo1;
                    600:                test    DFFSTAT, FIFO0FREE jz allocate_fifo_loop;
                    601:                mvi     DFFSTAT, B_CURRFIFO_0;
                    602:                SET_MODE(M_DFF0, M_DFF0)
                    603:                bmov    SCBPTR, ALLOCFIFO_SCBPTR, 2 ret;
                    604:        }
                    605: SET_SRC_MODE   M_SCSI;
                    606: SET_DST_MODE   M_SCSI;
                    607: allocate_fifo1:
                    608:        mvi     DFFSTAT, CURRFIFO_1;
                    609:        SET_MODE(M_DFF1, M_DFF1)
                    610:        bmov    SCBPTR, ALLOCFIFO_SCBPTR, 2 ret;
                    611:
                    612: /*
                    613:  * We have been reselected as an initiator
                    614:  * or selected as a target.
                    615:  */
                    616: SET_SRC_MODE   M_SCSI;
                    617: SET_DST_MODE   M_SCSI;
                    618: select_in:
                    619:        if ((ahd->bugs & AHD_FAINT_LED_BUG) != 0) {
                    620:                /*
                    621:                 * On Rev A. hardware, the busy LED is only
                    622:                 * turned on automatically during selections
                    623:                 * and re-selections.  Make the LED status
                    624:                 * more useful by forcing it to be on from
                    625:                 * the point of selection until our idle
                    626:                 * loop determines that neither of our FIFOs
                    627:                 * are busy.  This handles the non-packetized
                    628:                 * case nicely as we will not return to the
                    629:                 * idle loop until the busfree at the end of
                    630:                 * each transaction.
                    631:                 */
                    632:                or      SBLKCTL, DIAGLEDEN|DIAGLEDON;
                    633:        }
                    634:        if ((ahd->bugs & AHD_BUSFREEREV_BUG) != 0) {
                    635:                /*
                    636:                 * Test to ensure that the bus has not
                    637:                 * already gone free prior to clearing
                    638:                 * any stale busfree status.  This avoids
                    639:                 * a window whereby a busfree just after
                    640:                 * a selection could be missed.
                    641:                 */
                    642:                test    SCSISIGI, BSYI jz . + 2;
                    643:                mvi     CLRSINT1,CLRBUSFREE;
                    644:                or      SIMODE1, ENBUSFREE;
                    645:        }
                    646:        or      SXFRCTL0, SPIOEN;
                    647:        and     SAVED_SCSIID, SELID_MASK, SELID;
                    648:        and     A, OID, IOWNID;
                    649:        or      SAVED_SCSIID, A;
                    650:        mvi     CLRSINT0, CLRSELDI;
                    651:        jmp     ITloop;
                    652:
                    653: /*
                    654:  * We have successfully selected out.
                    655:  *
                    656:  * Clear SELDO.
                    657:  * Dequeue all SCBs sent from the waiting queue
                    658:  * Requeue all SCBs *not* sent to the tail of the waiting queue
                    659:  * Take Razor #494 into account for above.
                    660:  *
                    661:  * In Packetized Mode:
                    662:  *     Return to the idle loop.  Our interrupt handler will take
                    663:  *     care of any incoming L_Qs.
                    664:  *
                    665:  * In Non-Packetize Mode:
                    666:  *     Continue to our normal state machine.
                    667:  */
                    668: SET_SRC_MODE   M_SCSI;
                    669: SET_DST_MODE   M_SCSI;
                    670: select_out:
                    671: BEGIN_CRITICAL;
                    672:        if ((ahd->bugs & AHD_FAINT_LED_BUG) != 0) {
                    673:                /*
                    674:                 * On Rev A. hardware, the busy LED is only
                    675:                 * turned on automatically during selections
                    676:                 * and re-selections.  Make the LED status
                    677:                 * more useful by forcing it to be on from
                    678:                 * the point of re-selection until our idle
                    679:                 * loop determines that neither of our FIFOs
                    680:                 * are busy.  This handles the non-packetized
                    681:                 * case nicely as we will not return to the
                    682:                 * idle loop until the busfree at the end of
                    683:                 * each transaction.
                    684:                 */
                    685:                or      SBLKCTL, DIAGLEDEN|DIAGLEDON;
                    686:        }
                    687:        /* Clear out all SCBs that have been successfully sent. */
                    688:        if ((ahd->bugs & AHD_SENT_SCB_UPDATE_BUG) != 0) {
                    689:                /*
                    690:                 * For packetized, the LQO manager clears ENSELO on
                    691:                 * the assertion of SELDO.  If we are non-packetized,
                    692:                 * LASTSCB and CURRSCB are accurate.
                    693:                 */
                    694:                test    SCSISEQ0, ENSELO jnz use_lastscb;
                    695:
                    696:                /*
                    697:                 * The update is correct for LQOSTAT1 errors.  All
                    698:                 * but LQOBUSFREE are handled by kernel interrupts.
                    699:                 * If we see LQOBUSFREE, return to the idle loop.
                    700:                 * Once we are out of the select_out critical section,
                    701:                 * the kernel will cleanup the LQOBUSFREE and we will
                    702:                 * eventually restart the selection if appropriate.
                    703:                 */
                    704:                test    LQOSTAT1, LQOBUSFREE jnz idle_loop;
                    705:
                    706:                /*
                    707:                 * On a phase change outside of packet boundaries,
                    708:                 * LASTSCB points to the currently active SCB context
                    709:                 * on the bus.
                    710:                 */
                    711:                test    LQOSTAT2, LQOPHACHGOUTPKT jnz use_lastscb;
                    712:
                    713:                /*
                    714:                 * If the hardware has traversed the whole list, NEXTSCB
                    715:                 * will be NULL, CURRSCB and LASTSCB cannot be trusted,
                    716:                 * but MAXCMDCNT is accurate.  If we stop part way through
                    717:                 * the list or only had one command to issue, NEXTSCB[1] is
                    718:                 * not NULL and LASTSCB is the last command to go out.
                    719:                 */
                    720:                cmp     NEXTSCB[1], SCB_LIST_NULL jne use_lastscb;
                    721:
                    722:                /*
                    723:                 * Brute force walk.
                    724:                 */
                    725:                bmov    SCBPTR, WAITING_TID_HEAD, 2;
                    726:                mvi     SEQINTCTL, INTVEC1DSL;
                    727:                mvi     MODE_PTR, MK_MODE(M_CFG, M_CFG);
                    728:                mov     A, MAXCMDCNT;
                    729:                mvi     MODE_PTR, MK_MODE(M_SCSI, M_SCSI);
                    730:                clr     SEQINTCTL;
                    731: find_lastscb_loop:
                    732:                dec     A;
                    733:                test    A, 0xFF jz found_last_sent_scb;
                    734:                bmov    SCBPTR, SCB_NEXT, 2;
                    735:                jmp     find_lastscb_loop;
                    736: use_lastscb:
                    737:                bmov    SCBPTR, LASTSCB, 2;
                    738: found_last_sent_scb:
                    739:                bmov    CURRSCB, SCBPTR, 2;
                    740: curscb_ww_done:
                    741:        } else {
                    742:                bmov    SCBPTR, CURRSCB, 2;
                    743:        }
                    744:
                    745:        /*
                    746:         * The whole list made it.  Clear our tail pointer to indicate
                    747:         * that the per-target selection queue is now empty.
                    748:         */
                    749:        cmp     SCB_NEXT[1], SCB_LIST_NULL je select_out_clear_tail;
                    750:
                    751:        /*
                    752:         * Requeue any SCBs not sent, to the tail of the waiting Q.
                    753:         * We know that neither the per-TID list nor the list of
                    754:         * TIDs is empty.  Use this knowledge to our advantage and
                    755:         * queue the remainder to the tail of the global execution
                    756:         * queue.
                    757:         */
                    758:        bmov    REG0, SCB_NEXT, 2;
                    759: select_out_queue_remainder:
                    760:        bmov    SCBPTR, WAITING_TID_TAIL, 2;
                    761:        bmov    SCB_NEXT2, REG0, 2;
                    762:        bmov    WAITING_TID_TAIL, REG0, 2;
                    763:        jmp     select_out_inc_tid_q;
                    764:
                    765: select_out_clear_tail:
                    766:        /*
                    767:         * Queue any pending MK_MESSAGE SCB for this target now
                    768:         * that the queue is empty.
                    769:         */
                    770:        test    SEQ_FLAGS2, PENDING_MK_MESSAGE jz select_out_no_mk_message_scb;
                    771:        mov     A, MK_MESSAGE_SCSIID;
                    772:        cmp     SCB_SCSIID, A jne select_out_no_mk_message_scb;
                    773:        and     SEQ_FLAGS2, ~PENDING_MK_MESSAGE;
                    774:        bmov    REG0, MK_MESSAGE_SCB, 2;
                    775:        jmp select_out_queue_remainder;
                    776:
                    777: select_out_no_mk_message_scb:
                    778:        /*
                    779:         * Clear this target's execution tail and increment the queue.
                    780:         */
                    781:        shr     DINDEX, 3, SCB_SCSIID;
                    782:        or      DINDEX, 1;      /* Want only the second byte */
                    783:        mvi     DINDEX[1], ((WAITING_SCB_TAILS) >> 8);
                    784:        mvi     DINDIR, SCB_LIST_NULL;
                    785: select_out_inc_tid_q:
                    786:        bmov    SCBPTR, WAITING_TID_HEAD, 2;
                    787:        bmov    WAITING_TID_HEAD, SCB_NEXT2, 2;
                    788:        cmp     WAITING_TID_HEAD[1], SCB_LIST_NULL jne . + 2;
                    789:        mvi     WAITING_TID_TAIL[1], SCB_LIST_NULL;
                    790:        bmov    SCBPTR, CURRSCB, 2;
                    791:        mvi     CLRSINT0, CLRSELDO;
                    792:        test    LQOSTAT2, LQOPHACHGOUTPKT jnz unexpected_nonpkt_mode_cleared;
                    793:        test    LQOSTAT1, LQOPHACHGINPKT jnz unexpected_nonpkt_mode_cleared;
                    794:
                    795:        /*
                    796:         * If this is a packetized connection, return to our
                    797:         * idle_loop and let our interrupt handler deal with
                    798:         * any connection setup/teardown issues.  The only
                    799:         * exceptions are the case of MK_MESSAGE and task management
                    800:         * SCBs.
                    801:         */
                    802:        if ((ahd->bugs & AHD_LQO_ATNO_BUG) != 0) {
                    803:                /*
                    804:                 * In the A, the LQO manager transitions to LQOSTOP0 even if
                    805:                 * we have selected out with ATN asserted and the target
                    806:                 * REQs in a non-packet phase.
                    807:                 */
                    808:                test    SCB_CONTROL, MK_MESSAGE jz select_out_no_message;
                    809:                test    SCSISIGO, ATNO jnz select_out_non_packetized;
                    810: select_out_no_message:
                    811:        }
                    812:        test    LQOSTAT2, LQOSTOP0 jz select_out_non_packetized;
                    813:        test    SCB_TASK_MANAGEMENT, 0xFF jz idle_loop;
                    814:        SET_SEQINTCODE(TASKMGMT_FUNC_COMPLETE)
                    815:        jmp     idle_loop;
                    816:
                    817: select_out_non_packetized:
                    818:        /* Non packetized request. */
                    819:        and     SCSISEQ0, ~ENSELO;
                    820:        if ((ahd->bugs & AHD_BUSFREEREV_BUG) != 0) {
                    821:                /*
                    822:                 * Test to ensure that the bus has not
                    823:                 * already gone free prior to clearing
                    824:                 * any stale busfree status.  This avoids
                    825:                 * a window whereby a busfree just after
                    826:                 * a selection could be missed.
                    827:                 */
                    828:                test    SCSISIGI, BSYI jz . + 2;
                    829:                mvi     CLRSINT1,CLRBUSFREE;
                    830:                or      SIMODE1, ENBUSFREE;
                    831:        }
                    832:        mov     SAVED_SCSIID, SCB_SCSIID;
                    833:        mov     SAVED_LUN, SCB_LUN;
                    834:        mvi     SEQ_FLAGS, NO_CDB_SENT;
                    835: END_CRITICAL;
                    836:        or      SXFRCTL0, SPIOEN;
                    837:
                    838:        /*
                    839:         * As soon as we get a successful selection, the target
                    840:         * should go into the message out phase since we have ATN
                    841:         * asserted.
                    842:         */
                    843:        mvi     MSG_OUT, MSG_IDENTIFYFLAG;
                    844:
                    845:        /*
                    846:         * Main loop for information transfer phases.  Wait for the
                    847:         * target to assert REQ before checking MSG, C/D and I/O for
                    848:         * the bus phase.
                    849:         */
                    850: mesgin_phasemis:
                    851: ITloop:
                    852:        call    phase_lock;
                    853:
                    854:        mov     A, LASTPHASE;
                    855:
                    856:        test    A, ~P_DATAIN_DT jz p_data;
                    857:        cmp     A,P_COMMAND     je p_command;
                    858:        cmp     A,P_MESGOUT     je p_mesgout;
                    859:        cmp     A,P_STATUS      je p_status;
                    860:        cmp     A,P_MESGIN      je p_mesgin;
                    861:
                    862:        SET_SEQINTCODE(BAD_PHASE)
                    863:        jmp     ITloop;                 /* Try reading the bus again. */
                    864:
                    865: /*
                    866:  * Command phase.  Set up the DMA registers and let 'er rip.
                    867:  */
                    868: p_command:
                    869:        test    SEQ_FLAGS, NOT_IDENTIFIED jz p_command_okay;
                    870:        SET_SEQINTCODE(PROTO_VIOLATION)
                    871: p_command_okay:
                    872:        test    MODE_PTR, ~(MK_MODE(M_DFF1, M_DFF1))
                    873:                jnz p_command_allocate_fifo;
                    874:        /*
                    875:         * Command retry.  Free our current FIFO and
                    876:         * re-allocate a FIFO so transfer state is
                    877:         * reset.
                    878:         */
                    879: SET_SRC_MODE   M_DFF1;
                    880: SET_DST_MODE   M_DFF1;
                    881:        mvi     DFFSXFRCTL, RSTCHN|CLRSHCNT;
                    882:        SET_MODE(M_SCSI, M_SCSI)
                    883: p_command_allocate_fifo:
                    884:        bmov    ALLOCFIFO_SCBPTR, SCBPTR, 2;
                    885:        call    allocate_fifo;
                    886: SET_SRC_MODE   M_DFF1;
                    887: SET_DST_MODE   M_DFF1;
                    888:        add     NONE, -17, SCB_CDB_LEN;
                    889:        jnc     p_command_embedded;
                    890: p_command_from_host:
                    891:        bmov    HADDR[0], SCB_HOST_CDB_PTR, 9;
                    892:        mvi     SG_CACHE_PRE, LAST_SEG;
                    893:        mvi     DFCNTRL, (PRELOADEN|SCSIEN|HDMAEN);
                    894:        jmp     p_command_xfer;
                    895: p_command_embedded:
                    896:        bmov    SHCNT[0], SCB_CDB_LEN,  1;
                    897:        bmov    DFDAT, SCB_CDB_STORE, 16;
                    898:        mvi     DFCNTRL, SCSIEN;
                    899: p_command_xfer:
                    900:        and     SEQ_FLAGS, ~NO_CDB_SENT;
                    901:        if ((ahd->features & AHD_FAST_CDB_DELIVERY) != 0) {
                    902:                /*
                    903:                 * To speed up CDB delivery in Rev B, all CDB acks
                    904:                 * are "released" to the output sync as soon as the
                    905:                 * command phase starts.  There is only one problem
                    906:                 * with this approach.  If the target changes phase
                    907:                 * before all data are sent, we have left over acks
                    908:                 * that can go out on the bus in a data phase.  Due
                    909:                 * to other chip contraints, this only happens if
                    910:                 * the target goes to data-in, but if the acks go
                    911:                 * out before we can test SDONE, we'll think that
                    912:                 * the transfer has completed successfully.  Work
                    913:                 * around this by taking advantage of the 400ns or
                    914:                 * 800ns dead time between command phase and the REQ
                    915:                 * of the new phase.  If the transfer has completed
                    916:                 * successfully, SCSIEN should fall *long* before we
                    917:                 * see a phase change.  We thus treat any phasemiss
                    918:                 * that occurs before SCSIEN falls as an incomplete
                    919:                 * transfer.
                    920:                 */
                    921:                test    SSTAT1, PHASEMIS jnz p_command_xfer_failed;
                    922:                test    DFCNTRL, SCSIEN jnz . - 1;
                    923:        } else {
                    924:                test    DFCNTRL, SCSIEN jnz .;
                    925:        }
                    926:        /*
                    927:         * DMA Channel automatically disabled.
                    928:         * Don't allow a data phase if the command
                    929:         * was not fully transferred.
                    930:         */
                    931:        test    SSTAT2, SDONE jnz ITloop;
                    932: p_command_xfer_failed:
                    933:        or      SEQ_FLAGS, NO_CDB_SENT;
                    934:        jmp     ITloop;
                    935:
                    936:
                    937: /*
                    938:  * Status phase.  Wait for the data byte to appear, then read it
                    939:  * and store it into the SCB.
                    940:  */
                    941: SET_SRC_MODE   M_SCSI;
                    942: SET_DST_MODE   M_SCSI;
                    943: p_status:
                    944:        test    SEQ_FLAGS,NOT_IDENTIFIED jnz mesgin_proto_violation;
                    945: p_status_okay:
                    946:        mov     SCB_SCSI_STATUS, SCSIDAT;
                    947:        or      SCB_CONTROL, STATUS_RCVD;
                    948:        jmp     ITloop;
                    949:
                    950: /*
                    951:  * Message out phase.  If MSG_OUT is MSG_IDENTIFYFLAG, build a full
                    952:  * identify message sequence and send it to the target.  The host may
                    953:  * override this behavior by setting the MK_MESSAGE bit in the SCB
                    954:  * control byte.  This will cause us to interrupt the host and allow
                    955:  * it to handle the message phase completely on its own.  If the bit
                    956:  * associated with this target is set, we will also interrupt the host,
                    957:  * thereby allowing it to send a message on the next selection regardless
                    958:  * of the transaction being sent.
                    959:  *
                    960:  * If MSG_OUT is == HOST_MSG, also interrupt the host and take a message.
                    961:  * This is done to allow the host to send messages outside of an identify
                    962:  * sequence while protecting the sequencer from testing the MK_MESSAGE bit
                    963:  * on an SCB that might not be for the current nexus. (For example, a
                    964:  * BDR message in response to a bad reselection would leave us pointed to
                    965:  * an SCB that doesn't have anything to do with the current target).
                    966:  *
                    967:  * Otherwise, treat MSG_OUT as a 1 byte message to send (abort, abort tag,
                    968:  * bus device reset).
                    969:  *
                    970:  * When there are no messages to send, MSG_OUT should be set to MSG_NOOP,
                    971:  * in case the target decides to put us in this phase for some strange
                    972:  * reason.
                    973:  */
                    974: p_mesgout_retry:
                    975:        /* Turn on ATN for the retry */
                    976:        mvi     SCSISIGO, ATNO;
                    977: p_mesgout:
                    978:        mov     SINDEX, MSG_OUT;
                    979:        cmp     SINDEX, MSG_IDENTIFYFLAG jne p_mesgout_from_host;
                    980:        test    SCB_CONTROL,MK_MESSAGE  jnz host_message_loop;
                    981: p_mesgout_identify:
                    982:        or      SINDEX, MSG_IDENTIFYFLAG|DISCENB, SCB_LUN;
                    983:        test    SCB_CONTROL, DISCENB jnz . + 2;
                    984:        and     SINDEX, ~DISCENB;
                    985: /*
                    986:  * Send a tag message if TAG_ENB is set in the SCB control block.
                    987:  * Use SCB_NONPACKET_TAG as the tag value.
                    988:  */
                    989: p_mesgout_tag:
                    990:        test    SCB_CONTROL,TAG_ENB jz  p_mesgout_onebyte;
                    991:        mov     SCSIDAT, SINDEX;        /* Send the identify message */
                    992:        call    phase_lock;
                    993:        cmp     LASTPHASE, P_MESGOUT    jne p_mesgout_done;
                    994:        and     SCSIDAT,TAG_ENB|SCB_TAG_TYPE,SCB_CONTROL;
                    995:        call    phase_lock;
                    996:        cmp     LASTPHASE, P_MESGOUT    jne p_mesgout_done;
                    997:        mov     SCBPTR jmp p_mesgout_onebyte;
                    998: /*
                    999:  * Interrupt the driver, and allow it to handle this message
                   1000:  * phase and any required retries.
                   1001:  */
                   1002: p_mesgout_from_host:
                   1003:        cmp     SINDEX, HOST_MSG        jne p_mesgout_onebyte;
                   1004:        jmp     host_message_loop;
                   1005:
                   1006: p_mesgout_onebyte:
                   1007:        mvi     CLRSINT1, CLRATNO;
                   1008:        mov     SCSIDAT, SINDEX;
                   1009:
                   1010: /*
                   1011:  * If the next bus phase after ATN drops is message out, it means
                   1012:  * that the target is requesting that the last message(s) be resent.
                   1013:  */
                   1014:        call    phase_lock;
                   1015:        cmp     LASTPHASE, P_MESGOUT    je p_mesgout_retry;
                   1016:
                   1017: p_mesgout_done:
                   1018:        mvi     CLRSINT1,CLRATNO;       /* Be sure to turn ATNO off */
                   1019:        mov     LAST_MSG, MSG_OUT;
                   1020:        mvi     MSG_OUT, MSG_NOOP;      /* No message left */
                   1021:        jmp     ITloop;
                   1022:
                   1023: /*
                   1024:  * Message in phase.  Bytes are read using Automatic PIO mode.
                   1025:  */
                   1026: p_mesgin:
                   1027:        /* read the 1st message byte */
                   1028:        mvi     ACCUM           call inb_first;
                   1029:
                   1030:        test    A,MSG_IDENTIFYFLAG      jnz mesgin_identify;
                   1031:        cmp     A,MSG_DISCONNECT        je mesgin_disconnect;
                   1032:        cmp     A,MSG_SAVEDATAPOINTER   je mesgin_sdptrs;
                   1033:        cmp     ALLZEROS,A              je mesgin_complete;
                   1034:        cmp     A,MSG_RESTOREPOINTERS   je mesgin_rdptrs;
                   1035:        cmp     A,MSG_IGN_WIDE_RESIDUE  je mesgin_ign_wide_residue;
                   1036:        cmp     A,MSG_NOOP              je mesgin_done;
                   1037:
                   1038: /*
                   1039:  * Pushed message loop to allow the kernel to
                   1040:  * run its own message state engine.  To avoid an
                   1041:  * extra nop instruction after signaling the kernel,
                   1042:  * we perform the phase_lock before checking to see
                   1043:  * if we should exit the loop and skip the phase_lock
                   1044:  * in the ITloop.  Performing back to back phase_locks
                   1045:  * shouldn't hurt, but why do it twice...
                   1046:  */
                   1047: host_message_loop:
                   1048:        call    phase_lock;     /* Benign the first time through. */
                   1049:        SET_SEQINTCODE(HOST_MSG_LOOP)
                   1050:        cmp     RETURN_1, EXIT_MSG_LOOP je ITloop;
                   1051:        cmp     RETURN_1, CONT_MSG_LOOP_WRITE   jne . + 3;
                   1052:        mov     SCSIDAT, RETURN_2;
                   1053:        jmp     host_message_loop;
                   1054:        /* Must be CONT_MSG_LOOP_READ */
                   1055:        mov     NONE, SCSIDAT;  /* ACK Byte */
                   1056:        jmp     host_message_loop;
                   1057:
                   1058: mesgin_ign_wide_residue:
                   1059:        mov     SAVED_MODE, MODE_PTR;
                   1060:        SET_MODE(M_SCSI, M_SCSI)
                   1061:        shr     NEGOADDR, 4, SAVED_SCSIID;
                   1062:        mov     A, NEGCONOPTS;
                   1063:        RESTORE_MODE(SAVED_MODE)
                   1064:        test    A, WIDEXFER jz mesgin_reject;
                   1065:        /* Pull the residue byte */
                   1066:        mvi     REG0    call inb_next;
                   1067:        cmp     REG0, 0x01 jne mesgin_reject;
                   1068:        test    SCB_RESIDUAL_SGPTR[0], SG_LIST_NULL jz . + 2;
                   1069:        test    SCB_TASK_ATTRIBUTE, SCB_XFERLEN_ODD jnz mesgin_done;
                   1070:        SET_SEQINTCODE(IGN_WIDE_RES)
                   1071:        jmp     mesgin_done;
                   1072:
                   1073: mesgin_proto_violation:
                   1074:        SET_SEQINTCODE(PROTO_VIOLATION)
                   1075:        jmp     mesgin_done;
                   1076: mesgin_reject:
                   1077:        mvi     MSG_MESSAGE_REJECT      call mk_mesg;
                   1078: mesgin_done:
                   1079:        mov     NONE,SCSIDAT;           /*dummy read from latch to ACK*/
                   1080:        jmp     ITloop;
                   1081:
                   1082: #define INDEX_DISC_LIST(scsiid, lun)                                   \
                   1083:        and     A, 0xC0, scsiid;                                        \
                   1084:        or      SCBPTR, A, lun;                                         \
                   1085:        clr     SCBPTR[1];                                              \
                   1086:        and     SINDEX, 0x30, scsiid;                                   \
                   1087:        shr     SINDEX, 3;      /* Multiply by 2 */                     \
                   1088:        add     SINDEX, (SCB_DISCONNECTED_LISTS & 0xFF);                \
                   1089:        mvi     SINDEX[1], ((SCB_DISCONNECTED_LISTS >> 8) & 0xFF)
                   1090:
                   1091: mesgin_identify:
                   1092:        /*
                   1093:         * Determine whether a target is using tagged or non-tagged
                   1094:         * transactions by first looking at the transaction stored in
                   1095:         * the per-device, disconnected array.  If there is no untagged
                   1096:         * transaction for this target, this must be a tagged transaction.
                   1097:         */
                   1098:        and     SAVED_LUN, MSG_IDENTIFY_LUNMASK, A;
                   1099:        INDEX_DISC_LIST(SAVED_SCSIID, SAVED_LUN);
                   1100:        bmov    DINDEX, SINDEX, 2;
                   1101:        bmov    REG0, SINDIR, 2;
                   1102:        cmp     REG0[1], SCB_LIST_NULL je snoop_tag;
                   1103:        /* Untagged.  Clear the busy table entry and setup the SCB. */
                   1104:        bmov    DINDIR, ALLONES, 2;
                   1105:        bmov    SCBPTR, REG0, 2;
                   1106:        jmp     setup_SCB;
                   1107:
                   1108: /*
                   1109:  * Here we "snoop" the bus looking for a SIMPLE QUEUE TAG message.
                   1110:  * If we get one, we use the tag returned to find the proper
                   1111:  * SCB.  After receiving the tag, look for the SCB at SCB locations tag and
                   1112:  * tag + 256.
                   1113:  */
                   1114: snoop_tag:
                   1115:        if ((ahd->flags & AHD_SEQUENCER_DEBUG) != 0) {
                   1116:                or      SEQ_FLAGS, 0x80;
                   1117:        }
                   1118:        mov     NONE, SCSIDAT;          /* ACK Identify MSG */
                   1119:        call    phase_lock;
                   1120:        if ((ahd->flags & AHD_SEQUENCER_DEBUG) != 0) {
                   1121:                or      SEQ_FLAGS, 0x1;
                   1122:        }
                   1123:        cmp     LASTPHASE, P_MESGIN     jne not_found_ITloop;
                   1124:        if ((ahd->flags & AHD_SEQUENCER_DEBUG) != 0) {
                   1125:                or      SEQ_FLAGS, 0x2;
                   1126:        }
                   1127:        cmp     SCSIBUS, MSG_SIMPLE_Q_TAG jne not_found;
                   1128: get_tag:
                   1129:        clr     SCBPTR[1];
                   1130:        mvi     SCBPTR  call inb_next;  /* tag value */
                   1131: verify_scb:
                   1132:        test    SCB_CONTROL,DISCONNECTED jz verify_other_scb;
                   1133:        mov     A, SAVED_SCSIID;
                   1134:        cmp     SCB_SCSIID, A jne verify_other_scb;
                   1135:        mov     A, SAVED_LUN;
                   1136:        cmp     SCB_LUN, A je setup_SCB_disconnected;
                   1137: verify_other_scb:
                   1138:        xor     SCBPTR[1], 1;
                   1139:        test    SCBPTR[1], 0xFF jnz verify_scb;
                   1140:        jmp     not_found;
                   1141:
                   1142: /*
                   1143:  * Ensure that the SCB the tag points to is for
                   1144:  * an SCB transaction to the reconnecting target.
                   1145:  */
                   1146: setup_SCB:
                   1147:        if ((ahd->flags & AHD_SEQUENCER_DEBUG) != 0) {
                   1148:                or      SEQ_FLAGS, 0x10;
                   1149:        }
                   1150:        test    SCB_CONTROL,DISCONNECTED jz not_found;
                   1151: setup_SCB_disconnected:
                   1152:        and     SCB_CONTROL,~DISCONNECTED;
                   1153:        clr     SEQ_FLAGS;      /* make note of IDENTIFY */
                   1154:        test    SCB_SGPTR, SG_LIST_NULL jnz . + 3;
                   1155:        bmov    ALLOCFIFO_SCBPTR, SCBPTR, 2;
                   1156:        call    allocate_fifo;
                   1157:        /* See if the host wants to send a message upon reconnection */
                   1158:        test    SCB_CONTROL, MK_MESSAGE jz mesgin_done;
                   1159:        mvi     HOST_MSG        call mk_mesg;
                   1160:        jmp     mesgin_done;
                   1161:
                   1162: not_found:
                   1163:        SET_SEQINTCODE(NO_MATCH)
                   1164:        jmp     mesgin_done;
                   1165:
                   1166: not_found_ITloop:
                   1167:        SET_SEQINTCODE(NO_MATCH)
                   1168:        jmp     ITloop;
                   1169:
                   1170: /*
                   1171:  * We received a "command complete" message.  Put the SCB on the complete
                   1172:  * queue and trigger a completion interrupt via the idle loop.  Before doing
                   1173:  * so, check to see if there is a residual or the status byte is something
                   1174:  * other than STATUS_GOOD (0).  In either of these conditions, we upload the
                   1175:  * SCB back to the host so it can process this information.
                   1176:  */
                   1177: mesgin_complete:
                   1178:
                   1179:        /*
                   1180:         * If ATN is raised, we still want to give the target a message.
                   1181:         * Perhaps there was a parity error on this last message byte.
                   1182:         * Either way, the target should take us to message out phase
                   1183:         * and then attempt to complete the command again.  We should use a
                   1184:         * critical section here to guard against a timeout triggering
                   1185:         * for this command and setting ATN while we are still processing
                   1186:         * the completion.
                   1187:        test    SCSISIGI, ATNI jnz mesgin_done;
                   1188:         */
                   1189:
                   1190:        /*
                   1191:         * If we are identified and have successfully sent the CDB,
                   1192:         * any status will do.  Optimize this fast path.
                   1193:         */
                   1194:        test    SCB_CONTROL, STATUS_RCVD jz mesgin_proto_violation;
                   1195:        test    SEQ_FLAGS, NOT_IDENTIFIED|NO_CDB_SENT jz complete_accepted;
                   1196:
                   1197:        /*
                   1198:         * If the target never sent an identify message but instead went
                   1199:         * to mesgin to give an invalid message, let the host abort us.
                   1200:         */
                   1201:        test    SEQ_FLAGS, NOT_IDENTIFIED jnz mesgin_proto_violation;
                   1202:
                   1203:        /*
                   1204:         * If we received good status but never successfully sent the
                   1205:         * cdb, abort the command.
                   1206:         */
                   1207:        test    SCB_SCSI_STATUS,0xff    jnz complete_accepted;
                   1208:        test    SEQ_FLAGS, NO_CDB_SENT jnz mesgin_proto_violation;
                   1209: complete_accepted:
                   1210:
                   1211:        /*
                   1212:         * See if we attempted to deliver a message but the target ingnored us.
                   1213:         */
                   1214:        test    SCB_CONTROL, MK_MESSAGE jz complete_nomsg;
                   1215:        SET_SEQINTCODE(MKMSG_FAILED)
                   1216: complete_nomsg:
                   1217:        call    queue_scb_completion;
                   1218:        jmp     await_busfree;
                   1219:
                   1220: BEGIN_CRITICAL;
                   1221: freeze_queue:
                   1222:        /* Cancel any pending select-out. */
                   1223:        test    SSTAT0, SELDO|SELINGO jnz . + 2;
                   1224:        and     SCSISEQ0, ~ENSELO;
                   1225:        mov     ACCUM_SAVE, A;
                   1226:        clr     A;
                   1227:        add     QFREEZE_COUNT, 1;
                   1228:        adc     QFREEZE_COUNT[1], A;
                   1229:        or      SEQ_FLAGS2, SELECTOUT_QFROZEN;
                   1230:        mov     A, ACCUM_SAVE ret;
                   1231: END_CRITICAL;
                   1232:
                   1233: /*
                   1234:  * Complete the current FIFO's SCB if data for this same
                   1235:  * SCB is not transferring in the other FIFO.
                   1236:  */
                   1237: SET_SRC_MODE   M_DFF1;
                   1238: SET_DST_MODE   M_DFF1;
                   1239: pkt_complete_scb_if_fifos_idle:
                   1240:        bmov    ARG_1, SCBPTR, 2;
                   1241:        mvi     DFFSXFRCTL, CLRCHN;
                   1242:        SET_MODE(M_SCSI, M_SCSI)
                   1243:        bmov    SCBPTR, ARG_1, 2;
                   1244:        test    SCB_FIFO_USE_COUNT, 0xFF jnz return;
                   1245: queue_scb_completion:
                   1246:        test    SCB_SCSI_STATUS,0xff    jnz bad_status;
                   1247:        /*
                   1248:         * Check for residuals
                   1249:         */
                   1250:        test    SCB_SGPTR, SG_LIST_NULL jnz complete;   /* No xfer */
                   1251:        test    SCB_SGPTR, SG_FULL_RESID jnz upload_scb;/* Never xfered */
                   1252:        test    SCB_RESIDUAL_SGPTR, SG_LIST_NULL jz upload_scb;
                   1253: complete:
                   1254: BEGIN_CRITICAL;
                   1255:        bmov    SCB_NEXT_COMPLETE, COMPLETE_SCB_HEAD, 2;
                   1256:        bmov    COMPLETE_SCB_HEAD, SCBPTR, 2 ret;
                   1257: END_CRITICAL;
                   1258: bad_status:
                   1259:        cmp     SCB_SCSI_STATUS, STATUS_PKT_SENSE je upload_scb;
                   1260:        call    freeze_queue;
                   1261: upload_scb:
                   1262:        /*
                   1263:         * Restore SCB TAG since we reuse this field
                   1264:         * in the sequencer.  We don't want to corrupt
                   1265:         * it on the host.
                   1266:         */
                   1267:        bmov    SCB_TAG, SCBPTR, 2;
                   1268: BEGIN_CRITICAL;
                   1269:        or      SCB_SGPTR, SG_STATUS_VALID;
                   1270:        mvi     SCB_NEXT_COMPLETE[1], SCB_LIST_NULL;
                   1271:        cmp     COMPLETE_DMA_SCB_HEAD[1], SCB_LIST_NULL jne add_dma_scb_tail;
                   1272:        bmov    COMPLETE_DMA_SCB_HEAD, SCBPTR, 2;
                   1273:        bmov    COMPLETE_DMA_SCB_TAIL, SCBPTR, 2 ret;
                   1274: add_dma_scb_tail:
                   1275:        bmov    REG0, SCBPTR, 2;
                   1276:        bmov    SCBPTR, COMPLETE_DMA_SCB_TAIL, 2;
                   1277:        bmov    SCB_NEXT_COMPLETE, REG0, 2;
                   1278:        bmov    COMPLETE_DMA_SCB_TAIL, REG0, 2 ret;
                   1279: END_CRITICAL;
                   1280:
                   1281: /*
                   1282:  * Is it a disconnect message?  Set a flag in the SCB to remind us
                   1283:  * and await the bus going free.  If this is an untagged transaction
                   1284:  * store the SCB id for it in our untagged target table for lookup on
                   1285:  * a reselection.
                   1286:  */
                   1287: mesgin_disconnect:
                   1288:        /*
                   1289:         * If ATN is raised, we still want to give the target a message.
                   1290:         * Perhaps there was a parity error on this last message byte
                   1291:         * or we want to abort this command.  Either way, the target
                   1292:         * should take us to message out phase and then attempt to
                   1293:         * disconnect again.
                   1294:         * XXX - Wait for more testing.
                   1295:        test    SCSISIGI, ATNI jnz mesgin_done;
                   1296:         */
                   1297:        test    SEQ_FLAGS, NOT_IDENTIFIED|NO_CDB_SENT
                   1298:                jnz mesgin_proto_violation;
                   1299:        or      SCB_CONTROL,DISCONNECTED;
                   1300:        test    SCB_CONTROL, TAG_ENB jnz await_busfree;
                   1301: queue_disc_scb:
                   1302:        bmov    REG0, SCBPTR, 2;
                   1303:        INDEX_DISC_LIST(SAVED_SCSIID, SAVED_LUN);
                   1304:        bmov    DINDEX, SINDEX, 2;
                   1305:        bmov    DINDIR, REG0, 2;
                   1306:        bmov    SCBPTR, REG0, 2;
                   1307:        /* FALLTHROUGH */
                   1308: await_busfree:
                   1309:        and     SIMODE1, ~ENBUSFREE;
                   1310:        if ((ahd->bugs & AHD_BUSFREEREV_BUG) == 0) {
                   1311:                /*
                   1312:                 * In the BUSFREEREV_BUG case, the
                   1313:                 * busfree status was cleared at the
                   1314:                 * beginning of the connection.
                   1315:                 */
                   1316:                mvi     CLRSINT1,CLRBUSFREE;
                   1317:        }
                   1318:        mov     NONE, SCSIDAT;          /* Ack the last byte */
                   1319:        test    MODE_PTR, ~(MK_MODE(M_DFF1, M_DFF1))
                   1320:                jnz await_busfree_not_m_dff;
                   1321: SET_SRC_MODE   M_DFF1;
                   1322: SET_DST_MODE   M_DFF1;
                   1323: await_busfree_clrchn:
                   1324:        mvi     DFFSXFRCTL, CLRCHN;
                   1325: await_busfree_not_m_dff:
                   1326:        /* clear target specific flags */
                   1327:        mvi     SEQ_FLAGS, NOT_IDENTIFIED|NO_CDB_SENT;
                   1328:        test    SSTAT1,REQINIT|BUSFREE  jz .;
                   1329:        /*
                   1330:         * We only set BUSFREE status once either a new
                   1331:         * phase has been detected or we are really
                   1332:         * BUSFREE.  This allows the driver to know
                   1333:         * that we are active on the bus even though
                   1334:         * no identified transaction exists should a
                   1335:         * timeout occur while awaiting busfree.
                   1336:         */
                   1337:        mvi     LASTPHASE, P_BUSFREE;
                   1338:        test    SSTAT1, BUSFREE jnz idle_loop;
                   1339:        SET_SEQINTCODE(MISSED_BUSFREE)
                   1340:
                   1341:
                   1342: /*
                   1343:  * Save data pointers message:
                   1344:  * Copying RAM values back to SCB, for Save Data Pointers message, but
                   1345:  * only if we've actually been into a data phase to change them.  This
                   1346:  * protects against bogus data in scratch ram and the residual counts
                   1347:  * since they are only initialized when we go into data_in or data_out.
                   1348:  * Ack the message as soon as possible.
                   1349:  */
                   1350: SET_SRC_MODE   M_DFF1;
                   1351: SET_DST_MODE   M_DFF1;
                   1352: mesgin_sdptrs:
                   1353:        mov     NONE,SCSIDAT;           /*dummy read from latch to ACK*/
                   1354:        test    SEQ_FLAGS, DPHASE       jz ITloop;
                   1355:        call    save_pointers;
                   1356:        jmp     ITloop;
                   1357:
                   1358: save_pointers:
                   1359:        /*
                   1360:         * If we are asked to save our position at the end of the
                   1361:         * transfer, just mark us at the end rather than perform a
                   1362:         * full save.
                   1363:         */
                   1364:        test    SCB_RESIDUAL_SGPTR[0], SG_LIST_NULL jz save_pointers_full;
                   1365:        or      SCB_SGPTR, SG_LIST_NULL ret;
                   1366:
                   1367: save_pointers_full:
                   1368:        /*
                   1369:         * The SCB_DATAPTR becomes the current SHADDR.
                   1370:         * All other information comes directly from our residual
                   1371:         * state.
                   1372:         */
                   1373:        bmov    SCB_DATAPTR, SHADDR, 8;
                   1374:        bmov    SCB_DATACNT, SCB_RESIDUAL_DATACNT, 8 ret;
                   1375:
                   1376: /*
                   1377:  * Restore pointers message?  Data pointers are recopied from the
                   1378:  * SCB anytime we enter a data phase for the first time, so all
                   1379:  * we need to do is clear the DPHASE flag and let the data phase
                   1380:  * code do the rest.  We also reset/reallocate the FIFO to make
                   1381:  * sure we have a clean start for the next data or command phase.
                   1382:  */
                   1383: mesgin_rdptrs:
                   1384:        and     SEQ_FLAGS, ~DPHASE;
                   1385:        test    MODE_PTR, ~(MK_MODE(M_DFF1, M_DFF1)) jnz msgin_rdptrs_get_fifo;
                   1386:        mvi     DFFSXFRCTL, RSTCHN|CLRSHCNT;
                   1387:        SET_MODE(M_SCSI, M_SCSI)
                   1388: msgin_rdptrs_get_fifo:
                   1389:        call    allocate_fifo;
                   1390:        jmp     mesgin_done;
                   1391:
                   1392: phase_lock:
                   1393:        if ((ahd->bugs & AHD_EARLY_REQ_BUG) != 0) {
                   1394:                /*
                   1395:                 * Don't ignore persistent REQ assertions just because
                   1396:                 * they were asserted within the bus settle delay window.
                   1397:                 * This allows us to tolerate devices like the GEM318
                   1398:                 * that violate the SCSI spec.  We are careful not to
                   1399:                 * count REQ while we are waiting for it to fall during
                   1400:                 * an async phase due to our asserted ACK.  Each
                   1401:                 * sequencer instruction takes ~25ns, so the REQ must
                   1402:                 * last at least 100ns in order to be counted as a true
                   1403:                 * REQ.
                   1404:                 */
                   1405:                test    SCSIPHASE, 0xFF jnz phase_locked;
                   1406:                test    SCSISIGI, ACKI jnz phase_lock;
                   1407:                test    SCSISIGI, REQI jz phase_lock;
                   1408:                test    SCSIPHASE, 0xFF jnz phase_locked;
                   1409:                test    SCSISIGI, ACKI jnz phase_lock;
                   1410:                test    SCSISIGI, REQI jz phase_lock;
                   1411: phase_locked:
                   1412:        } else {
                   1413:                test    SCSIPHASE, 0xFF jz .;
                   1414:        }
                   1415:        test    SSTAT1, SCSIPERR jnz phase_lock;
                   1416: phase_lock_latch_phase:
                   1417:        and     LASTPHASE, PHASE_MASK, SCSISIGI ret;
                   1418:
                   1419: /*
                   1420:  * Functions to read data in Automatic PIO mode.
                   1421:  *
                   1422:  * An ACK is not sent on input from the target until SCSIDATL is read from.
                   1423:  * So we wait until SCSIDATL is latched (the usual way), then read the data
                   1424:  * byte directly off the bus using SCSIBUSL.  When we have pulled the ATN
                   1425:  * line, or we just want to acknowledge the byte, then we do a dummy read
                   1426:  * from SCISDATL.  The SCSI spec guarantees that the target will hold the
                   1427:  * data byte on the bus until we send our ACK.
                   1428:  *
                   1429:  * The assumption here is that these are called in a particular sequence,
                   1430:  * and that REQ is already set when inb_first is called.  inb_{first,next}
                   1431:  * use the same calling convention as inb.
                   1432:  */
                   1433: inb_next:
                   1434:        mov     NONE,SCSIDAT;           /*dummy read from latch to ACK*/
                   1435: inb_next_wait:
                   1436:        /*
                   1437:         * If there is a parity error, wait for the kernel to
                   1438:         * see the interrupt and prepare our message response
                   1439:         * before continuing.
                   1440:         */
                   1441:        test    SCSIPHASE, 0xFF jz .;
                   1442:        test    SSTAT1, SCSIPERR jnz inb_next_wait;
                   1443: inb_next_check_phase:
                   1444:        and     LASTPHASE, PHASE_MASK, SCSISIGI;
                   1445:        cmp     LASTPHASE, P_MESGIN jne mesgin_phasemis;
                   1446: inb_first:
                   1447:        clr     DINDEX[1];
                   1448:        mov     DINDEX,SINDEX;
                   1449:        mov     DINDIR,SCSIBUS  ret;            /*read byte directly from bus*/
                   1450: inb_last:
                   1451:        mov     NONE,SCSIDAT ret;               /*dummy read from latch to ACK*/
                   1452:
                   1453: mk_mesg:
                   1454:        mvi     SCSISIGO, ATNO;
                   1455:        mov     MSG_OUT,SINDEX ret;
                   1456:
                   1457: SET_SRC_MODE   M_DFF1;
                   1458: SET_DST_MODE   M_DFF1;
                   1459: disable_ccsgen:
                   1460:        test    SG_STATE, FETCH_INPROG jz disable_ccsgen_fetch_done;
                   1461:        clr     CCSGCTL;
                   1462: disable_ccsgen_fetch_done:
                   1463:        clr     SG_STATE ret;
                   1464:
                   1465: service_fifo:
                   1466:        /*
                   1467:         * Do we have any prefetch left???
                   1468:         */
                   1469:        test    SG_STATE, SEGS_AVAIL jnz idle_sg_avail;
                   1470:
                   1471:        /*
                   1472:         * Can this FIFO have access to the S/G cache yet?
                   1473:         */
                   1474:        test    CCSGCTL, SG_CACHE_AVAIL jz return;
                   1475:
                   1476:        /* Did we just finish fetching segs? */
                   1477:        test    CCSGCTL, CCSGDONE jnz idle_sgfetch_complete;
                   1478:
                   1479:        /* Are we actively fetching segments? */
                   1480:        test    CCSGCTL, CCSGENACK jnz return;
                   1481:
                   1482:        /*
                   1483:         * Should the other FIFO get the S/G cache first?  If
                   1484:         * both FIFOs have been allocated since we last checked
                   1485:         * any FIFO, it is important that we service a FIFO
                   1486:         * that is not actively on the bus first.  This guarantees
                   1487:         * that a FIFO will be freed to handle snapshot requests for
                   1488:         * any FIFO that is still on the bus.  Chips with RTI do not
                   1489:         * perform snapshots, so don't bother with this test there.
                   1490:         */
                   1491:        if ((ahd->features & AHD_RTI) == 0) {
                   1492:                /*
                   1493:                 * If we're not still receiving SCSI data,
                   1494:                 * it is safe to allocate the S/G cache to
                   1495:                 * this FIFO.
                   1496:                 */
                   1497:                test    DFCNTRL, SCSIEN jz idle_sgfetch_start;
                   1498:
                   1499:                /*
                   1500:                 * Switch to the other FIFO.  Non-RTI chips
                   1501:                 * also have the "set mode" bug, so we must
                   1502:                 * disable interrupts during the switch.
                   1503:                 */
                   1504:                mvi     SEQINTCTL, INTVEC1DSL;
                   1505:                xor     MODE_PTR, MK_MODE(M_DFF1, M_DFF1);
                   1506:
                   1507:                /*
                   1508:                 * If the other FIFO needs loading, then it
                   1509:                 * must not have claimed the S/G cache yet
                   1510:                 * (SG_CACHE_AVAIL would have been cleared in
                   1511:                 * the original FIFO mode and we test this above).
                   1512:                 * Return to the idle loop so we can process the
                   1513:                 * FIFO not currently on the bus first.
                   1514:                 */
                   1515:                test    SG_STATE, LOADING_NEEDED jz idle_sgfetch_okay;
                   1516:                clr     SEQINTCTL ret;
                   1517: idle_sgfetch_okay:
                   1518:                xor     MODE_PTR, MK_MODE(M_DFF1, M_DFF1);
                   1519:                clr     SEQINTCTL;
                   1520:        }
                   1521:
                   1522: idle_sgfetch_start:
                   1523:        /*
                   1524:         * We fetch a "cacheline aligned" and sized amount of data
                   1525:         * so we don't end up referencing a non-existant page.
                   1526:         * Cacheline aligned is in quotes because the kernel will
                   1527:         * set the prefetch amount to a reasonable level if the
                   1528:         * cacheline size is unknown.
                   1529:         */
                   1530:        bmov    SGHADDR, SCB_RESIDUAL_SGPTR, 4;
                   1531:        mvi     SGHCNT, SG_PREFETCH_CNT;
                   1532:        if ((ahd->bugs & AHD_REG_SLOW_SETTLE_BUG) != 0) {
                   1533:                /*
                   1534:                 * Need two instructions between "touches" of SGHADDR.
                   1535:                 */
                   1536:                nop;
                   1537:        }
                   1538:        and     SGHADDR[0], SG_PREFETCH_ALIGN_MASK, SCB_RESIDUAL_SGPTR;
                   1539:        mvi     CCSGCTL, CCSGEN|CCSGRESET;
                   1540:        or      SG_STATE, FETCH_INPROG ret;
                   1541: idle_sgfetch_complete:
                   1542:        /*
                   1543:         * Guard against SG_CACHE_AVAIL activating during sg fetch
                   1544:         * request in the other FIFO.
                   1545:         */
                   1546:        test    SG_STATE, FETCH_INPROG jz return;
                   1547:        clr     CCSGCTL;
                   1548:        and     CCSGADDR, SG_PREFETCH_ADDR_MASK, SCB_RESIDUAL_SGPTR;
                   1549:        mvi     SG_STATE, SEGS_AVAIL|LOADING_NEEDED;
                   1550: idle_sg_avail:
                   1551:        /* Does the hardware have space for another SG entry? */
                   1552:        test    DFSTATUS, PRELOAD_AVAIL jz return;
                   1553:        /*
                   1554:         * On the A, preloading a segment before HDMAENACK
                   1555:         * comes true can clobber the shadow address of the
                   1556:         * first segment in the S/G FIFO.  Wait until it is
                   1557:         * safe to proceed.
                   1558:         */
                   1559:        if ((ahd->features & AHD_NEW_DFCNTRL_OPTS) == 0) {
                   1560:                test    DFCNTRL, HDMAENACK jz return;
                   1561:        }
                   1562:        if ((ahd->flags & AHD_64BIT_ADDRESSING) != 0) {
                   1563:                bmov    HADDR, CCSGRAM, 8;
                   1564:        } else {
                   1565:                bmov    HADDR, CCSGRAM, 4;
                   1566:        }
                   1567:        bmov    HCNT, CCSGRAM, 3;
                   1568:        bmov    SCB_RESIDUAL_DATACNT[3], CCSGRAM, 1;
                   1569:        if ((ahd->flags & AHD_39BIT_ADDRESSING) != 0) {
                   1570:                and     HADDR[4], SG_HIGH_ADDR_BITS, SCB_RESIDUAL_DATACNT[3];
                   1571:        }
                   1572:        if ((ahd->flags & AHD_64BIT_ADDRESSING) != 0) {
                   1573:                /* Skip 4 bytes of pad. */
                   1574:                add     CCSGADDR, 4;
                   1575:        }
                   1576: sg_advance:
                   1577:        clr     A;                      /* add sizeof(struct scatter) */
                   1578:        add     SCB_RESIDUAL_SGPTR[0],SG_SIZEOF;
                   1579:        adc     SCB_RESIDUAL_SGPTR[1],A;
                   1580:        adc     SCB_RESIDUAL_SGPTR[2],A;
                   1581:        adc     SCB_RESIDUAL_SGPTR[3],A;
                   1582:        mov     SINDEX, SCB_RESIDUAL_SGPTR[0];
                   1583:        test    SCB_RESIDUAL_DATACNT[3], SG_LAST_SEG jz . + 3;
                   1584:        or      SINDEX, LAST_SEG;
                   1585:        clr     SG_STATE;
                   1586:        mov     SG_CACHE_PRE, SINDEX;
                   1587:        if ((ahd->features & AHD_NEW_DFCNTRL_OPTS) != 0) {
                   1588:                /*
                   1589:                 * Use SCSIENWRDIS so that SCSIEN is never
                   1590:                 * modified by this operation.
                   1591:                 */
                   1592:                or      DFCNTRL, PRELOADEN|HDMAEN|SCSIENWRDIS;
                   1593:        } else {
                   1594:                or      DFCNTRL, PRELOADEN|HDMAEN;
                   1595:        }
                   1596:        /*
                   1597:         * Do we have another segment in the cache?
                   1598:         */
                   1599:        add     NONE, SG_PREFETCH_CNT_LIMIT, CCSGADDR;
                   1600:        jnc     return;
                   1601:        and     SG_STATE, ~SEGS_AVAIL ret;
                   1602:
                   1603: /*
                   1604:  * Initialize the DMA address and counter from the SCB.
                   1605:  */
                   1606: load_first_seg:
                   1607:        bmov    HADDR, SCB_DATAPTR, 11;
                   1608:        and     REG_ISR, ~SG_FULL_RESID, SCB_SGPTR[0];
                   1609:        test    SCB_DATACNT[3], SG_LAST_SEG jz . + 2;
                   1610:        or      REG_ISR, LAST_SEG;
                   1611:        mov     SG_CACHE_PRE, REG_ISR;
                   1612:        mvi     DFCNTRL, (PRELOADEN|SCSIEN|HDMAEN);
                   1613:        /*
                   1614:         * Since we've are entering a data phase, we will
                   1615:         * rely on the SCB_RESID* fields.  Initialize the
                   1616:         * residual and clear the full residual flag.
                   1617:         */
                   1618:        and     SCB_SGPTR[0], ~SG_FULL_RESID;
                   1619:        bmov    SCB_RESIDUAL_DATACNT[3], SCB_DATACNT[3], 5;
                   1620:        /* If we need more S/G elements, tell the idle loop */
                   1621:        test    SCB_RESIDUAL_DATACNT[3], SG_LAST_SEG jnz . + 2;
                   1622:        mvi     SG_STATE, LOADING_NEEDED ret;
                   1623:        clr     SG_STATE ret;
                   1624:
                   1625: p_data_handle_xfer:
                   1626:        call    setjmp;
                   1627:        test    SG_STATE, LOADING_NEEDED jnz service_fifo;
                   1628: p_data_clear_handler:
                   1629:        or      LONGJMP_ADDR[1], INVALID_ADDR ret;
                   1630:
                   1631: p_data:
                   1632:        test    SEQ_FLAGS, NOT_IDENTIFIED|NO_CDB_SENT   jz p_data_allowed;
                   1633:        SET_SEQINTCODE(PROTO_VIOLATION)
                   1634: p_data_allowed:
                   1635:
                   1636:        test    SEQ_FLAGS, DPHASE       jz data_phase_initialize;
                   1637:
                   1638:        /*
                   1639:         * If we re-enter the data phase after going through another
                   1640:         * phase, our transfer location has almost certainly been
                   1641:         * corrupted by the interveining, non-data, transfers.  Ask
                   1642:         * the host driver to fix us up based on the transfer residual
                   1643:         * unless we already know that we should be bitbucketing.
                   1644:         */
                   1645:        test    SCB_RESIDUAL_SGPTR[0], SG_LIST_NULL jnz p_data_bitbucket;
                   1646:        SET_SEQINTCODE(PDATA_REINIT)
                   1647:        jmp     data_phase_inbounds;
                   1648:
                   1649: p_data_bitbucket:
                   1650:        /*
                   1651:         * Turn on `Bit Bucket' mode, wait until the target takes
                   1652:         * us to another phase, and then notify the host.
                   1653:         */
                   1654:        mov     SAVED_MODE, MODE_PTR;
                   1655:        test    MODE_PTR, ~(MK_MODE(M_DFF1, M_DFF1))
                   1656:                jnz bitbucket_not_m_dff;
                   1657:        /*
                   1658:         * Ensure that any FIFO contents are cleared out and the
                   1659:         * FIFO free'd prior to starting the BITBUCKET.  BITBUCKET
                   1660:         * doesn't discard data already in the FIFO.
                   1661:         */
                   1662:        mvi     DFFSXFRCTL, RSTCHN|CLRSHCNT;
                   1663:        SET_MODE(M_SCSI, M_SCSI)
                   1664: bitbucket_not_m_dff:
                   1665:        or      SXFRCTL1,BITBUCKET;
                   1666:        /* Wait for non-data phase. */
                   1667:        test    SCSIPHASE, ~DATA_PHASE_MASK jz .;
                   1668:        and     SXFRCTL1, ~BITBUCKET;
                   1669:        RESTORE_MODE(SAVED_MODE)
                   1670: SET_SRC_MODE   M_DFF1;
                   1671: SET_DST_MODE   M_DFF1;
                   1672:        SET_SEQINTCODE(DATA_OVERRUN)
                   1673:        jmp     ITloop;
                   1674:
                   1675: data_phase_initialize:
                   1676:        test    SCB_SGPTR[0], SG_LIST_NULL jnz p_data_bitbucket;
                   1677:        call    load_first_seg;
                   1678: data_phase_inbounds:
                   1679:        /* We have seen a data phase at least once. */
                   1680:        or      SEQ_FLAGS, DPHASE;
                   1681:        mov     SAVED_MODE, MODE_PTR;
                   1682:        test    SG_STATE, LOADING_NEEDED jz data_group_dma_loop;
                   1683:        call    p_data_handle_xfer;
                   1684: data_group_dma_loop:
                   1685:        /*
                   1686:         * The transfer is complete if either the last segment
                   1687:         * completes or the target changes phase.  Both conditions
                   1688:         * will clear SCSIEN.
                   1689:         */
                   1690:        call    idle_loop_service_fifos;
                   1691:        call    idle_loop_cchan;
                   1692:        call    idle_loop_gsfifo;
                   1693:        RESTORE_MODE(SAVED_MODE)
                   1694:        test    DFCNTRL, SCSIEN jnz data_group_dma_loop;
                   1695:
                   1696: data_group_dmafinish:
                   1697:        /*
                   1698:         * The transfer has terminated either due to a phase
                   1699:         * change, and/or the completion of the last segment.
                   1700:         * We have two goals here.  Do as much other work
                   1701:         * as possible while the data fifo drains on a read
                   1702:         * and respond as quickly as possible to the standard
                   1703:         * messages (save data pointers/disconnect and command
                   1704:         * complete) that usually follow a data phase.
                   1705:         */
                   1706:        call    calc_residual;
                   1707:
                   1708:        /*
                   1709:         * Go ahead and shut down the DMA engine now.
                   1710:         */
                   1711:        test    DFCNTRL, DIRECTION jnz data_phase_finish;
                   1712: data_group_fifoflush:
                   1713:        if ((ahd->bugs & AHD_AUTOFLUSH_BUG) != 0) {
                   1714:                or      DFCNTRL, FIFOFLUSH;
                   1715:        }
                   1716:        /*
                   1717:         * We have enabled the auto-ack feature.  This means
                   1718:         * that the controller may have already transferred
                   1719:         * some overrun bytes into the data FIFO and acked them
                   1720:         * on the bus.  The only way to detect this situation is
                   1721:         * to wait for LAST_SEG_DONE to come true on a completed
                   1722:         * transfer and then test to see if the data FIFO is
                   1723:         * non-empty.  We know there is more data yet to transfer
                   1724:         * if SG_LIST_NULL is not yet set, thus there cannot be
                   1725:         * an overrun.
                   1726:         */
                   1727:        test    SCB_RESIDUAL_SGPTR[0], SG_LIST_NULL jz data_phase_finish;
                   1728:        test    SG_CACHE_SHADOW, LAST_SEG_DONE jz .;
                   1729:        test    DFSTATUS, FIFOEMP jnz data_phase_finish;
                   1730:        /* Overrun */
                   1731:        jmp     p_data;
                   1732: data_phase_finish:
                   1733:        /*
                   1734:         * If the target has left us in data phase, loop through
                   1735:         * the dma code again.  We will only loop if there is a
                   1736:         * data overrun.
                   1737:         */
                   1738:        if ((ahd->flags & AHD_TARGETROLE) != 0) {
                   1739:                test    SSTAT0, TARGET jnz data_phase_done;
                   1740:        }
                   1741:        if ((ahd->flags & AHD_INITIATORROLE) != 0) {
                   1742:                test    SSTAT1, REQINIT jz .;
                   1743:                test    SCSIPHASE, DATA_PHASE_MASK jnz p_data;
                   1744:        }
                   1745:
                   1746: data_phase_done:
                   1747:        /* Kill off any pending prefetch */
                   1748:        call    disable_ccsgen;
                   1749:        or      LONGJMP_ADDR[1], INVALID_ADDR;
                   1750:
                   1751:        if ((ahd->flags & AHD_TARGETROLE) != 0) {
                   1752:                test    SEQ_FLAGS, DPHASE_PENDING jz ITloop;
                   1753:                /*
                   1754:                and     SEQ_FLAGS, ~DPHASE_PENDING;
                   1755:                 * For data-in phases, wait for any pending acks from the
                   1756:                 * initiator before changing phase.  We only need to
                   1757:                 * send Ignore Wide Residue messages for data-in phases.
                   1758:                test    DFCNTRL, DIRECTION jz target_ITloop;
                   1759:                test    SSTAT1, REQINIT jnz .;
                   1760:                test    SCB_TASK_ATTRIBUTE, SCB_XFERLEN_ODD jz target_ITloop;
                   1761:                SET_MODE(M_SCSI, M_SCSI)
                   1762:                test    NEGCONOPTS, WIDEXFER jz target_ITloop;
                   1763:                 */
                   1764:                /*
                   1765:                 * Issue an Ignore Wide Residue Message.
                   1766:                mvi     P_MESGIN|BSYO call change_phase;
                   1767:                mvi     MSG_IGN_WIDE_RESIDUE call target_outb;
                   1768:                mvi     1 call target_outb;
                   1769:                jmp     target_ITloop;
                   1770:                 */
                   1771:        } else {
                   1772:                jmp     ITloop;
                   1773:        }
                   1774:
                   1775: /*
                   1776:  * We assume that, even though data may still be
                   1777:  * transferring to the host, that the SCSI side of
                   1778:  * the DMA engine is now in a static state.  This
                   1779:  * allows us to update our notion of where we are
                   1780:  * in this transfer.
                   1781:  *
                   1782:  * If, by chance, we stopped before being able
                   1783:  * to fetch additional segments for this transfer,
                   1784:  * yet the last S/G was completely exhausted,
                   1785:  * call our idle loop until it is able to load
                   1786:  * another segment.  This will allow us to immediately
                   1787:  * pickup on the next segment on the next data phase.
                   1788:  *
                   1789:  * If we happened to stop on the last segment, then
                   1790:  * our residual information is still correct from
                   1791:  * the idle loop and there is no need to perform
                   1792:  * any fixups.
                   1793:  */
                   1794: residual_before_last_seg:
                   1795:        test    MDFFSTAT, SHVALID       jnz sgptr_fixup;
                   1796:        /*
                   1797:         * Can never happen from an interrupt as the packetized
                   1798:         * hardware will only interrupt us once SHVALID or
                   1799:         * LAST_SEG_DONE.
                   1800:         */
                   1801:        call    idle_loop_service_fifos;
                   1802:        RESTORE_MODE(SAVED_MODE)
                   1803:        /* FALLTHROUGH */
                   1804: calc_residual:
                   1805:        test    SG_CACHE_SHADOW, LAST_SEG jz residual_before_last_seg;
                   1806:        /* Record if we've consumed all S/G entries */
                   1807:        test    MDFFSTAT, SHVALID       jz . + 2;
                   1808:        bmov    SCB_RESIDUAL_DATACNT, SHCNT, 3 ret;
                   1809:        or      SCB_RESIDUAL_SGPTR[0], SG_LIST_NULL ret;
                   1810:
                   1811: sgptr_fixup:
                   1812:        /*
                   1813:         * Fixup the residual next S/G pointer.  The S/G preload
                   1814:         * feature of the chip allows us to load two elements
                   1815:         * in addition to the currently active element.  We
                   1816:         * store the bottom byte of the next S/G pointer in
                   1817:         * the SG_CACHE_PTR register so we can restore the
                   1818:         * correct value when the DMA completes.  If the next
                   1819:         * sg ptr value has advanced to the point where higher
                   1820:         * bytes in the address have been affected, fix them
                   1821:         * too.
                   1822:         */
                   1823:        test    SG_CACHE_SHADOW, 0x80 jz sgptr_fixup_done;
                   1824:        test    SCB_RESIDUAL_SGPTR[0], 0x80 jnz sgptr_fixup_done;
                   1825:        add     SCB_RESIDUAL_SGPTR[1], -1;
                   1826:        adc     SCB_RESIDUAL_SGPTR[2], -1;
                   1827:        adc     SCB_RESIDUAL_SGPTR[3], -1;
                   1828: sgptr_fixup_done:
                   1829:        and     SCB_RESIDUAL_SGPTR[0], SG_ADDR_MASK, SG_CACHE_SHADOW;
                   1830:        clr     SCB_RESIDUAL_DATACNT[3]; /* We are not the last seg */
                   1831:        bmov    SCB_RESIDUAL_DATACNT, SHCNT, 3 ret;
                   1832:
                   1833: export timer_isr:
                   1834:        call    issue_cmdcmplt;
                   1835:        mvi     CLRSEQINTSTAT, CLRSEQ_SWTMRTO;
                   1836:        if ((ahd->bugs & AHD_SET_MODE_BUG) != 0) {
                   1837:                /*
                   1838:                 * In H2A4, the mode pointer is not saved
                   1839:                 * for intvec2, but is restored on iret.
                   1840:                 * This can lead to the restoration of a
                   1841:                 * bogus mode ptr.  Manually clear the
                   1842:                 * intmask bits and do a normal return
                   1843:                 * to compensate.
                   1844:                 */
                   1845:                and     SEQINTCTL, ~(INTMASK2|INTMASK1) ret;
                   1846:        } else {
                   1847:                or      SEQINTCTL, IRET ret;
                   1848:        }
                   1849:
                   1850: export seq_isr:
                   1851:        if ((ahd->features & AHD_RTI) == 0) {
                   1852:                /*
                   1853:                 * On RevA Silicon, if the target returns us to data-out
                   1854:                 * after we have already trained for data-out, it is
                   1855:                 * possible for us to transition the free running clock to
                   1856:                 * data-valid before the required 100ns P1 setup time (8 P1
                   1857:                 * assertions in fast-160 mode).  This will only happen if
                   1858:                 * this L-Q is a continuation of a data transfer for which
                   1859:                 * we have already prefetched data into our FIFO (LQ/Data
                   1860:                 * followed by LQ/Data for the same write transaction).
                   1861:                 * This can cause some target implementations to miss the
                   1862:                 * first few data transfers on the bus.  We detect this
                   1863:                 * situation by noticing that this is the first data transfer
                   1864:                 * after an LQ (LQIWORKONLQ true), that the data transfer is
                   1865:                 * a continuation of a transfer already setup in our FIFO
                   1866:                 * (SAVEPTRS interrupt), and that the transaction is a write
                   1867:                 * (DIRECTION set in DFCNTRL). The delay is performed by
                   1868:                 * disabling SCSIEN until we see the first REQ from the
                   1869:                 * target.
                   1870:                 *
                   1871:                 * First instruction in an ISR cannot be a branch on
                   1872:                 * Rev A.  Snapshot LQISTAT2 so the status is not missed
                   1873:                 * and deffer the test by one instruction.
                   1874:                 */
                   1875:                mov     REG_ISR, LQISTAT2;
                   1876:                test    REG_ISR, LQIWORKONLQ jz main_isr;
                   1877:                test    SEQINTSRC, SAVEPTRS  jz main_isr;
                   1878:                test    LONGJMP_ADDR[1], INVALID_ADDR jz saveptr_active_fifo;
                   1879:                /*
                   1880:                 * Switch to the active FIFO after clearing the snapshot
                   1881:                 * savepointer in the current FIFO.  We do this so that
                   1882:                 * a pending CTXTDONE or SAVEPTR is visible in the active
                   1883:                 * FIFO.  This status is the only way we can detect if we
                   1884:                 * have lost the race (e.g. host paused us) and our attempts
                   1885:                 * to disable the channel occurred after all REQs were
                   1886:                 * already seen and acked (REQINIT never comes true).
                   1887:                 */
                   1888:                mvi     DFFSXFRCTL, CLRCHN;
                   1889:                xor     MODE_PTR, MK_MODE(M_DFF1, M_DFF1);
                   1890:                test    DFCNTRL, DIRECTION jz interrupt_return;
                   1891:                and     DFCNTRL, ~SCSIEN;
                   1892: snapshot_wait_data_valid:
                   1893:                test    SEQINTSRC, (CTXTDONE|SAVEPTRS) jnz interrupt_return;
                   1894:                test    SSTAT1, REQINIT jz snapshot_wait_data_valid;
                   1895: snapshot_data_valid:
                   1896:                or      DFCNTRL, SCSIEN;
                   1897:                or      SEQINTCTL, IRET ret;
                   1898: snapshot_saveptr:
                   1899:                mvi     DFFSXFRCTL, CLRCHN;
                   1900:                or      SEQINTCTL, IRET ret;
                   1901: main_isr:
                   1902:        }
                   1903:        test    SEQINTSRC, CFG4DATA     jnz cfg4data_intr;
                   1904:        test    SEQINTSRC, CFG4ISTAT    jnz cfg4istat_intr;
                   1905:        test    SEQINTSRC, SAVEPTRS     jnz saveptr_intr;
                   1906:        test    SEQINTSRC, CFG4ICMD     jnz cfg4icmd_intr;
                   1907:        SET_SEQINTCODE(INVALID_SEQINT)
                   1908:
                   1909: /*
                   1910:  * There are two types of save pointers interrupts:
                   1911:  * The first is a snapshot save pointers where the current FIFO is not
                   1912:  * active and contains a snapshot of the current pointer information.
                   1913:  * This happens between packets in a stream for a single L_Q.  Since we
                   1914:  * are not performing a pointer save, we can safely clear the channel
                   1915:  * so it can be used for other transactions.  On RTI capable controllers,
                   1916:  * where snapshots can be, and are, disabled, the code to handle this type
                   1917:  * of snapshot is not active.
                   1918:  *
                   1919:  * The second case is a save pointers on an active FIFO which occurs
                   1920:  * if the target changes to a new L_Q or busfrees/QASes and the transfer
                   1921:  * has a residual.  This should occur coincident with a ctxtdone.  We
                   1922:  * disable the interrupt and allow our active routine to handle the
                   1923:  * save.
                   1924:  */
                   1925: saveptr_intr:
                   1926:        if ((ahd->features & AHD_RTI) == 0) {
                   1927:                test    LONGJMP_ADDR[1], INVALID_ADDR jnz snapshot_saveptr;
                   1928:        }
                   1929: saveptr_active_fifo:
                   1930:        and     SEQIMODE, ~ENSAVEPTRS;
                   1931:        or      SEQINTCTL, IRET ret;
                   1932:
                   1933: cfg4data_intr:
                   1934:        test    SCB_SGPTR[0], SG_LIST_NULL jnz pkt_handle_overrun_inc_use_count;
                   1935:        call    load_first_seg;
                   1936:        call    pkt_handle_xfer;
                   1937:        inc     SCB_FIFO_USE_COUNT;
                   1938: interrupt_return:
                   1939:        or      SEQINTCTL, IRET ret;
                   1940:
                   1941: cfg4istat_intr:
                   1942:        call    freeze_queue;
                   1943:        add     NONE, -13, SCB_CDB_LEN;
                   1944:        jnc     cfg4istat_have_sense_addr;
                   1945:        test    SCB_CDB_LEN, SCB_CDB_LEN_PTR jnz cfg4istat_have_sense_addr;
                   1946:        /*
                   1947:         * Host sets up address/count and enables transfer.
                   1948:         */
                   1949:        SET_SEQINTCODE(CFG4ISTAT_INTR)
                   1950:        jmp     cfg4istat_setup_handler;
                   1951: cfg4istat_have_sense_addr:
                   1952:        bmov    HADDR, SCB_SENSE_BUSADDR, 4;
                   1953:        mvi     HCNT[1], (AHD_SENSE_BUFSIZE >> 8);
                   1954:        mvi     SG_CACHE_PRE, LAST_SEG;
                   1955:        mvi     DFCNTRL, PRELOADEN|SCSIEN|HDMAEN;
                   1956: cfg4istat_setup_handler:
                   1957:        /*
                   1958:         * Status pkt is transferring to host.
                   1959:         * Wait in idle loop for transfer to complete.
                   1960:         * If a command completed before an attempted
                   1961:         * task management function completed, notify the host.
                   1962:         */
                   1963:        test    SCB_TASK_MANAGEMENT, 0xFF jz cfg4istat_no_taskmgmt_func;
                   1964:        SET_SEQINTCODE(TASKMGMT_CMD_CMPLT_OKAY)
                   1965: cfg4istat_no_taskmgmt_func:
                   1966:        call    pkt_handle_status;
                   1967:        or      SEQINTCTL, IRET ret;
                   1968:
                   1969: cfg4icmd_intr:
                   1970:        /*
                   1971:         * In the case of DMAing a CDB from the host, the normal
                   1972:         * CDB buffer is formatted with an 8 byte address followed
                   1973:         * by a 1 byte count.
                   1974:         */
                   1975:        bmov    HADDR[0], SCB_HOST_CDB_PTR, 9;
                   1976:        mvi     SG_CACHE_PRE, LAST_SEG;
                   1977:        mvi     DFCNTRL, (PRELOADEN|SCSIEN|HDMAEN);
                   1978:        call    pkt_handle_cdb;
                   1979:        or      SEQINTCTL, IRET ret;
                   1980:
                   1981: /*
                   1982:  * See if the target has gone on in this context creating an
                   1983:  * overrun condition.  For the write case, the hardware cannot
                   1984:  * ack bytes until data are provided.  So, if the target begins
                   1985:  * another  packet without changing contexts, implying we are
                   1986:  * not sitting on a packet boundary, we are in an overrun
                   1987:  * situation.  For the read case, the hardware will continue to
                   1988:  * ack bytes into the FIFO, and may even ack the last overrun packet
                   1989:  * into the FIFO.   If the FIFO should become non-empty, we are in
                   1990:  * a read overrun case.
                   1991:  */
                   1992: #define check_overrun                                                  \
                   1993:        /* Not on a packet boundary. */                                 \
                   1994:        test    MDFFSTAT, DLZERO jz pkt_handle_overrun;                 \
                   1995:        test    DFSTATUS, FIFOEMP jz pkt_handle_overrun
                   1996:
                   1997: pkt_handle_xfer:
                   1998:        test    SG_STATE, LOADING_NEEDED jz pkt_last_seg;
                   1999:        call    setjmp;
                   2000:        test    SEQINTSRC, SAVEPTRS jnz pkt_saveptrs;
                   2001:        test    SCSIPHASE, ~DATA_PHASE_MASK jz . + 2;
                   2002:        test    SCSISIGO, ATNO jnz . + 2;
                   2003:        test    SSTAT2, NONPACKREQ jz pkt_service_fifo;
                   2004:        /*
                   2005:         * Defer handling of this NONPACKREQ until we
                   2006:         * can be sure it pertains to this FIFO.  SAVEPTRS
                   2007:         * will not be asserted if the NONPACKREQ is for us,
                   2008:         * so we must simulate it if shadow is valid.  If
                   2009:         * shadow is not valid, keep running this FIFO until we
                   2010:         * have satisfied the transfer by loading segments and
                   2011:         * waiting for either shadow valid or last_seg_done.
                   2012:         */
                   2013:        test    MDFFSTAT, SHVALID jnz pkt_saveptrs;
                   2014: pkt_service_fifo:
                   2015:        test    SG_STATE, LOADING_NEEDED jnz service_fifo;
                   2016: pkt_last_seg:
                   2017:        call    setjmp;
                   2018:        test    SEQINTSRC, SAVEPTRS jnz pkt_saveptrs;
                   2019:        test    SG_CACHE_SHADOW, LAST_SEG_DONE jnz pkt_last_seg_done;
                   2020:        test    SCSIPHASE, ~DATA_PHASE_MASK jz . + 2;
                   2021:        test    SCSISIGO, ATNO jnz . + 2;
                   2022:        test    SSTAT2, NONPACKREQ jz return;
                   2023:        test    MDFFSTAT, SHVALID jz return;
                   2024:        /* FALLTHROUGH */
                   2025:
                   2026: /*
                   2027:  * Either a SAVEPTRS interrupt condition is pending for this FIFO
                   2028:  * or we have a pending NONPACKREQ for this FIFO.  We differentiate
                   2029:  * between the two by capturing the state of the SAVEPTRS interrupt
                   2030:  * prior to clearing this status and executing the common code for
                   2031:  * these two cases.
                   2032:  */
                   2033: pkt_saveptrs:
                   2034: BEGIN_CRITICAL;
                   2035:        if ((ahd->bugs & AHD_AUTOFLUSH_BUG) != 0) {
                   2036:                or      DFCNTRL, FIFOFLUSH;
                   2037:        }
                   2038:        mov     REG0, SEQINTSRC;
                   2039:        call    calc_residual;
                   2040:        call    save_pointers;
                   2041:        mvi     CLRSEQINTSRC, CLRSAVEPTRS;
                   2042:        call    disable_ccsgen;
                   2043:        or      SEQIMODE, ENSAVEPTRS;
                   2044:        test    DFCNTRL, DIRECTION jnz pkt_saveptrs_check_status;
                   2045:        test    DFSTATUS, FIFOEMP jnz pkt_saveptrs_check_status;
                   2046:        /*
                   2047:         * Keep a handler around for this FIFO until it drains
                   2048:         * to the host to guarantee that we don't complete the
                   2049:         * command to the host before the data arrives.
                   2050:         */
                   2051: pkt_saveptrs_wait_fifoemp:
                   2052:        call    setjmp;
                   2053:        test    DFSTATUS, FIFOEMP jz return;
                   2054: pkt_saveptrs_check_status:
                   2055:        or      LONGJMP_ADDR[1], INVALID_ADDR;
                   2056:        test    REG0, SAVEPTRS jz unexpected_nonpkt_phase;
                   2057:        dec     SCB_FIFO_USE_COUNT;
                   2058:        test    SCB_CONTROL, STATUS_RCVD jnz pkt_complete_scb_if_fifos_idle;
                   2059:        mvi     DFFSXFRCTL, CLRCHN ret;
                   2060:
                   2061: /*
                   2062:  * LAST_SEG_DONE status has been seen in the current FIFO.
                   2063:  * This indicates that all of the allowed data for this
                   2064:  * command has transferred across the SCSI and host buses.
                   2065:  * Check for overrun and see if we can complete this command.
                   2066:  */
                   2067: pkt_last_seg_done:
                   2068:        /*
                   2069:         * Mark transfer as completed.
                   2070:         */
                   2071:        or      SCB_SGPTR, SG_LIST_NULL;
                   2072:
                   2073:        /*
                   2074:         * Wait for the current context to finish to verify that
                   2075:         * no overrun condition has occurred.
                   2076:         */
                   2077:        test    SEQINTSRC, CTXTDONE jnz pkt_ctxt_done;
                   2078:        call    setjmp;
                   2079: pkt_wait_ctxt_done_loop:
                   2080:        test    SEQINTSRC, CTXTDONE jnz pkt_ctxt_done;
                   2081:        /*
                   2082:         * A sufficiently large overrun or a NONPACKREQ may
                   2083:         * prevent CTXTDONE from ever asserting, so we must
                   2084:         * poll for these statuses too.
                   2085:         */
                   2086:        check_overrun;
                   2087:        test    SSTAT2, NONPACKREQ jz return;
                   2088:        test    SEQINTSRC, CTXTDONE jz unexpected_nonpkt_phase;
                   2089:        /* FALLTHROUGH */
                   2090:
                   2091: pkt_ctxt_done:
                   2092:        check_overrun;
                   2093:        or      LONGJMP_ADDR[1], INVALID_ADDR;
                   2094:        /*
                   2095:         * If status has been received, it is safe to skip
                   2096:         * the check to see if another FIFO is active because
                   2097:         * LAST_SEG_DONE has been observed.  However, we check
                   2098:         * the FIFO anyway since it costs us only one extra
                   2099:         * instruction to leverage common code to perform the
                   2100:         * SCB completion.
                   2101:         */
                   2102:        dec     SCB_FIFO_USE_COUNT;
                   2103:        test    SCB_CONTROL, STATUS_RCVD jnz pkt_complete_scb_if_fifos_idle;
                   2104:        mvi     DFFSXFRCTL, CLRCHN ret;
                   2105: END_CRITICAL;
                   2106:
                   2107: /*
                   2108:  * Must wait until CDB xfer is over before issuing the
                   2109:  * clear channel.
                   2110:  */
                   2111: pkt_handle_cdb:
                   2112:        call    setjmp;
                   2113:        test    SG_CACHE_SHADOW, LAST_SEG_DONE jz return;
                   2114:        or      LONGJMP_ADDR[1], INVALID_ADDR;
                   2115:        mvi     DFFSXFRCTL, CLRCHN ret;
                   2116:
                   2117: /*
                   2118:  * Watch over the status transfer.  Our host sense buffer is
                   2119:  * large enough to take the maximum allowed status packet.
                   2120:  * None-the-less, we must still catch and report overruns to
                   2121:  * the host.  Additionally, properly catch unexpected non-packet
                   2122:  * phases that are typically caused by CRC errors in status packet
                   2123:  * transmission.
                   2124:  */
                   2125: pkt_handle_status:
                   2126:        call    setjmp;
                   2127:        test    SG_CACHE_SHADOW, LAST_SEG_DONE jnz pkt_status_check_overrun;
                   2128:        test    SEQINTSRC, CTXTDONE jz pkt_status_check_nonpackreq;
                   2129:        test    SG_CACHE_SHADOW, LAST_SEG_DONE jnz pkt_status_check_overrun;
                   2130: pkt_status_IU_done:
                   2131:        if ((ahd->bugs & AHD_AUTOFLUSH_BUG) != 0) {
                   2132:                or      DFCNTRL, FIFOFLUSH;
                   2133:        }
                   2134:        test    DFSTATUS, FIFOEMP jz return;
                   2135: BEGIN_CRITICAL;
                   2136:        or      LONGJMP_ADDR[1], INVALID_ADDR;
                   2137:        mvi     SCB_SCSI_STATUS, STATUS_PKT_SENSE;
                   2138:        or      SCB_CONTROL, STATUS_RCVD;
                   2139:        jmp     pkt_complete_scb_if_fifos_idle;
                   2140: END_CRITICAL;
                   2141: pkt_status_check_overrun:
                   2142:        /*
                   2143:         * Status PKT overruns are unceremoniously recovered with a
                   2144:         * bus reset.  If we've overrun, let the host know so that
                   2145:         * recovery can be performed.
                   2146:         *
                   2147:         * LAST_SEG_DONE has been observed.  If either CTXTDONE or
                   2148:         * a NONPACKREQ phase change have occurred and the FIFO is
                   2149:         * empty, there is no overrun.
                   2150:         */
                   2151:        test    DFSTATUS, FIFOEMP jz pkt_status_report_overrun;
                   2152:        test    SEQINTSRC, CTXTDONE jz . + 2;
                   2153:        test    DFSTATUS, FIFOEMP jnz pkt_status_IU_done;
                   2154:        test    SCSIPHASE, ~DATA_PHASE_MASK jz return;
                   2155:        test    DFSTATUS, FIFOEMP jnz pkt_status_check_nonpackreq;
                   2156: pkt_status_report_overrun:
                   2157:        SET_SEQINTCODE(STATUS_OVERRUN)
                   2158:        /* SEQUENCER RESTARTED */
                   2159: pkt_status_check_nonpackreq:
                   2160:        /*
                   2161:         * CTXTDONE may be held off if a NONPACKREQ is associated with
                   2162:         * the current context.  If a NONPACKREQ is observed, decide
                   2163:         * if it is for the current context.  If it is for the current
                   2164:         * context, we must defer NONPACKREQ processing until all data
                   2165:         * has transferred to the host.
                   2166:         */
                   2167:        test    SCSIPHASE, ~DATA_PHASE_MASK jz return;
                   2168:        test    SCSISIGO, ATNO jnz . + 2;
                   2169:        test    SSTAT2, NONPACKREQ jz return;
                   2170:        test    SEQINTSRC, CTXTDONE jnz pkt_status_IU_done;
                   2171:        test    DFSTATUS, FIFOEMP jz return;
                   2172:        /*
                   2173:         * The unexpected nonpkt phase handler assumes that any
                   2174:         * data channel use will have a FIFO reference count.  It
                   2175:         * turns out that the status handler doesn't need a reference
                   2176:         * count since the status received flag, and thus completion
                   2177:         * processing, cannot be set until the handler is finished.
                   2178:         * We increment the count here to make the nonpkt handler
                   2179:         * happy.
                   2180:         */
                   2181:        inc     SCB_FIFO_USE_COUNT;
                   2182:        /* FALLTHROUGH */
                   2183:
                   2184: /*
                   2185:  * Nonpackreq is a polled status.  It can come true in three situations:
                   2186:  * we have received an L_Q, we have sent one or more L_Qs, or there is no
                   2187:  * L_Q context associated with this REQ (REQ occurs immediately after a
                   2188:  * (re)selection).  Routines that know that the context responsible for this
                   2189:  * nonpackreq call directly into unexpected_nonpkt_phase.  In the case of the
                   2190:  * top level idle loop, we exhaust all active contexts prior to determining that
                   2191:  * we simply do not have the full I_T_L_Q for this phase.
                   2192:  */
                   2193: unexpected_nonpkt_phase_find_ctxt:
                   2194:        /*
                   2195:         * This nonpackreq is most likely associated with one of the tags
                   2196:         * in a FIFO or an outgoing LQ.  Only treat it as an I_T only
                   2197:         * nonpackreq if we've cleared out the FIFOs and handled any
                   2198:         * pending SELDO.
                   2199:         */
                   2200: SET_SRC_MODE   M_SCSI;
                   2201: SET_DST_MODE   M_SCSI;
                   2202:        and     A, FIFO1FREE|FIFO0FREE, DFFSTAT;
                   2203:        cmp     A, FIFO1FREE|FIFO0FREE jne return;
                   2204:        test    SSTAT0, SELDO jnz return;
                   2205:        mvi     SCBPTR[1], SCB_LIST_NULL;
                   2206: unexpected_nonpkt_phase:
                   2207:        test    MODE_PTR, ~(MK_MODE(M_DFF1, M_DFF1))
                   2208:                jnz unexpected_nonpkt_mode_cleared;
                   2209: SET_SRC_MODE   M_DFF0;
                   2210: SET_DST_MODE   M_DFF0;
                   2211:        or      LONGJMP_ADDR[1], INVALID_ADDR;
                   2212:        dec     SCB_FIFO_USE_COUNT;
                   2213:        mvi     DFFSXFRCTL, CLRCHN;
                   2214: unexpected_nonpkt_mode_cleared:
                   2215:        mvi     CLRSINT2, CLRNONPACKREQ;
                   2216:        if ((ahd->bugs & AHD_BUSFREEREV_BUG) != 0) {
                   2217:                /*
                   2218:                 * Test to ensure that the bus has not
                   2219:                 * already gone free prior to clearing
                   2220:                 * any stale busfree status.  This avoids
                   2221:                 * a window whereby a busfree just after
                   2222:                 * a selection could be missed.
                   2223:                 */
                   2224:                test    SCSISIGI, BSYI jz . + 2;
                   2225:                mvi     CLRSINT1,CLRBUSFREE;
                   2226:                or      SIMODE1, ENBUSFREE;
                   2227:        }
                   2228:        test    SCSIPHASE, ~(MSG_IN_PHASE|MSG_OUT_PHASE) jnz illegal_phase;
                   2229:        SET_SEQINTCODE(ENTERING_NONPACK)
                   2230:        jmp     ITloop;
                   2231:
                   2232: illegal_phase:
                   2233:        SET_SEQINTCODE(ILLEGAL_PHASE)
                   2234:        jmp     ITloop;
                   2235:
                   2236: /*
                   2237:  * We have entered an overrun situation.  If we have working
                   2238:  * BITBUCKET, flip that on and let the hardware eat any overrun
                   2239:  * data.  Otherwise use an overrun buffer in the host to simulate
                   2240:  * BITBUCKET.
                   2241:  */
                   2242: pkt_handle_overrun_inc_use_count:
                   2243:        inc     SCB_FIFO_USE_COUNT;
                   2244: pkt_handle_overrun:
                   2245:        SET_SEQINTCODE(CFG4OVERRUN)
                   2246:        call    freeze_queue;
                   2247:        if ((ahd->bugs & AHD_PKT_BITBUCKET_BUG) == 0) {
                   2248:                or      DFFSXFRCTL, DFFBITBUCKET;
                   2249: SET_SRC_MODE   M_DFF1;
                   2250: SET_DST_MODE   M_DFF1;
                   2251:        } else {
                   2252:                call    load_overrun_buf;
                   2253:                mvi     DFCNTRL, (HDMAEN|SCSIEN|PRELOADEN);
                   2254:        }
                   2255:        call    setjmp;
                   2256:        if ((ahd->bugs & AHD_PKT_BITBUCKET_BUG) != 0) {
                   2257:                test    DFSTATUS, PRELOAD_AVAIL jz overrun_load_done;
                   2258:                call    load_overrun_buf;
                   2259:                or      DFCNTRL, PRELOADEN;
                   2260: overrun_load_done:
                   2261:                test    SEQINTSRC, CTXTDONE jnz pkt_overrun_end;
                   2262:        } else {
                   2263:                test    DFFSXFRCTL, DFFBITBUCKET jz pkt_overrun_end;
                   2264:        }
                   2265:        test    SSTAT2, NONPACKREQ jz return;
                   2266: pkt_overrun_end:
                   2267:        or      SCB_RESIDUAL_SGPTR, SG_OVERRUN_RESID;
                   2268:        test    SEQINTSRC, CTXTDONE jz unexpected_nonpkt_phase;
                   2269:        dec     SCB_FIFO_USE_COUNT;
                   2270:        or      LONGJMP_ADDR[1], INVALID_ADDR;
                   2271:        test    SCB_CONTROL, STATUS_RCVD jnz pkt_complete_scb_if_fifos_idle;
                   2272:        mvi     DFFSXFRCTL, CLRCHN ret;
                   2273:
                   2274: if ((ahd->bugs & AHD_PKT_BITBUCKET_BUG) != 0) {
                   2275: load_overrun_buf:
                   2276:        /*
                   2277:         * Load a dummy segment if preload space is available.
                   2278:         */
                   2279:        mov     HADDR[0], SHARED_DATA_ADDR;
                   2280:        add     HADDR[1], PKT_OVERRUN_BUFOFFSET, SHARED_DATA_ADDR[1];
                   2281:        mov     ACCUM_SAVE, A;
                   2282:        clr     A;
                   2283:        adc     HADDR[2], A, SHARED_DATA_ADDR[2];
                   2284:        adc     HADDR[3], A, SHARED_DATA_ADDR[3];
                   2285:        mov     A, ACCUM_SAVE;
                   2286:        bmov    HADDR[4], ALLZEROS, 4;
                   2287:        /* PKT_OVERRUN_BUFSIZE is a multiple of 256 */
                   2288:        clr     HCNT[0];
                   2289:        mvi     HCNT[1], ((PKT_OVERRUN_BUFSIZE >> 8) & 0xFF);
                   2290:        clr     HCNT[2] ret;
                   2291: }

CVSweb