[BACK]Return to ncr5380.c CVS log [TXT][DIR] Up to [local] / sys / arch / mac68k / dev

Annotation of sys/arch/mac68k/dev/ncr5380.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: ncr5380.c,v 1.31 2007/04/24 16:48:43 miod Exp $       */
                      2: /*     $NetBSD: ncr5380.c,v 1.38 1996/12/19 21:48:18 scottr Exp $      */
                      3:
                      4: /*
                      5:  * Copyright (c) 1995 Leo Weppelman.
                      6:  * All rights reserved.
                      7:  *
                      8:  * Redistribution and use in source and binary forms, with or without
                      9:  * modification, are permitted provided that the following conditions
                     10:  * are met:
                     11:  * 1. Redistributions of source code must retain the above copyright
                     12:  *    notice, this list of conditions and the following disclaimer.
                     13:  * 2. Redistributions in binary form must reproduce the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer in the
                     15:  *    documentation and/or other materials provided with the distribution.
                     16:  * 3. All advertising materials mentioning features or use of this software
                     17:  *    must display the following acknowledgement:
                     18:  *      This product includes software developed by Leo Weppelman.
                     19:  * 4. The name of the author may not be used to endorse or promote products
                     20:  *    derived from this software without specific prior written permission
                     21:  *
                     22:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     23:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     24:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     25:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     26:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     27:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     28:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     29:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     30:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     31:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     32:  */
                     33:
                     34: /*
                     35:  * Bit mask of targets you want debugging to be shown
                     36:  */
                     37: u_char dbg_target_mask = 0x7f;
                     38:
                     39: /*
                     40:  * Set bit for target when parity checking must be disabled.
                     41:  * My (LWP) Maxtor 7245S  seems to generate parity errors on about 50%
                     42:  * of all transfers while the data is correct!?
                     43:  */
                     44: u_char ncr5380_no_parchk = 0xff;
                     45:
                     46: /*
                     47:  * Flags to allow binpatching of which devices to allow or disallow
                     48:  * issuance of linked commands.  disallowance is favored over allowance,
                     49:  * so if the same bit is set in either, the driver will not issue linked
                     50:  * commands to the corresponding target.
                     51:  * SCSI-2 devices can report whether or not they will accept linked
                     52:  * commands.  If that reports that a device supports linked commands,
                     53:  * then it is treated as if the corresponding bit in ncr5380_allow_linked
                     54:  * is set.
                     55:  */
                     56: u_char ncr5380_allow_linked = 0x80;
                     57: u_char ncr5380_disallow_linked = 0x80;
                     58:
                     59: /*
                     60:  * This is the default sense-command we send.
                     61:  */
                     62: static u_char  sense_cmd[] = {
                     63:                REQUEST_SENSE, 0, 0, 0, sizeof(struct scsi_sense_data), 0
                     64: };
                     65:
                     66: /*
                     67:  * True if the main co-routine is running
                     68:  */
                     69: static volatile int    main_running = 0;
                     70:
                     71: /*
                     72:  * Mask of targets selected
                     73:  */
                     74: static u_char  busy;
                     75:
                     76: static void    ncr5380_minphys(struct buf *bp);
                     77: static int     mac68k_ncr5380_scsi_cmd(struct scsi_xfer *xs);
                     78: static void    ncr5380_show_scsi_cmd(struct scsi_xfer *xs);
                     79:
                     80: struct scsi_adapter ncr5380_switch = {
                     81:        mac68k_ncr5380_scsi_cmd,        /* scsi_cmd()                   */
                     82:        ncr5380_minphys,                /* scsi_minphys()               */
                     83:        0,                              /* open_target_lu()             */
                     84:        0                               /* close_target_lu()            */
                     85: };
                     86:
                     87: struct scsi_device ncr5380_dev = {
                     88:        NULL,           /* use default error handler            */
                     89:        NULL,           /* do not have a start functio          */
                     90:        NULL,           /* have no async handler                */
                     91:        NULL            /* Use default done routine             */
                     92: };
                     93:
                     94:
                     95: static SC_REQ  req_queue[NREQ];
                     96: static SC_REQ  *free_head = NULL;      /* Free request structures      */
                     97:
                     98:
                     99: /*
                    100:  * Inline functions:
                    101:  */
                    102:
                    103: /*
                    104:  * Determine the size of a SCSI command.
                    105:  */
                    106: extern __inline__ int command_size(opcode)
                    107: u_char opcode;
                    108: {
                    109:        switch ((opcode >> 4) & 0xf) {
                    110:                case 0:
                    111:                case 1:
                    112:                        return (6);
                    113:                case 2:
                    114:                case 3:
                    115:                        return (10);
                    116:        }
                    117:        return (12);
                    118: }
                    119:
                    120:
                    121: /*
                    122:  * Wait for request-line to become active. When it doesn't return 0.
                    123:  * Otherwise return != 0.
                    124:  * The timeouts in the 'wait_req_*' functions are arbitrary and rather
                    125:  * large. In 99% of the invocations nearly no timeout is needed but in
                    126:  * some cases (especially when using my tapedrive, a Tandberg 3600) the
                    127:  * device is busy internally and the first SCSI-phase will be delayed.
                    128:  *
                    129:  * -- A sleeping Fujitsu M2512 is even worse; try 2.5 sec     -hf 20 Jun
                    130:  */
                    131: extern __inline__ int wait_req_true(void)
                    132: {
                    133:        int     timeout = 2500000;
                    134:
                    135:        while (!(GET_5380_REG(NCR5380_IDSTAT) & SC_S_REQ) && --timeout)
                    136:                delay(1);
                    137:        return (GET_5380_REG(NCR5380_IDSTAT) & SC_S_REQ);
                    138: }
                    139:
                    140: /*
                    141:  * Wait for request-line to become inactive. When it doesn't return 0.
                    142:  * Otherwise return != 0.
                    143:  */
                    144: extern __inline__ int wait_req_false(void)
                    145: {
                    146:        int     timeout = 2500000;
                    147:
                    148:        while ((GET_5380_REG(NCR5380_IDSTAT) & SC_S_REQ) && --timeout)
                    149:                delay(1);
                    150:        return (!(GET_5380_REG(NCR5380_IDSTAT) & SC_S_REQ));
                    151: }
                    152:
                    153: extern __inline__ void ack_message()
                    154: {
                    155:        SET_5380_REG(NCR5380_ICOM, 0);
                    156: }
                    157:
                    158: extern __inline__ void nack_message(SC_REQ *reqp, u_char msg)
                    159: {
                    160:        SET_5380_REG(NCR5380_ICOM, SC_A_ATN);
                    161:        reqp->msgout = msg;
                    162: }
                    163:
                    164: extern __inline__ void finish_req(SC_REQ *reqp)
                    165: {
                    166:        int                     sps;
                    167:        struct scsi_xfer        *xs = reqp->xs;
                    168:
                    169: #ifdef REAL_DMA
                    170:        /*
                    171:         * If we bounced, free the bounce buffer
                    172:         */
                    173:        if (reqp->dr_flag & DRIVER_BOUNCING)
                    174:                free_bounceb(reqp->bounceb);
                    175: #endif /* REAL_DMA */
                    176: #ifdef DBG_REQ
                    177:        if (dbg_target_mask & (1 << reqp->targ_id))
                    178:                show_request(reqp, "DONE");
                    179: #endif
                    180: #ifdef DBG_ERR_RET
                    181:        if (reqp->xs->error != 0)
                    182:                show_request(reqp, "ERR_RET");
                    183: #endif
                    184:        /*
                    185:         * Return request to free-q
                    186:         */
                    187:        sps = splbio();
                    188:        reqp->next = free_head;
                    189:        free_head  = reqp;
                    190:
                    191:        xs->flags |= ITSDONE;
                    192:        if (!(reqp->dr_flag & DRIVER_LINKCHK))
                    193:                scsi_done(xs);
                    194:        splx(sps);
                    195: }
                    196:
                    197: /*
                    198:  * Auto config stuff....
                    199:  */
                    200: void   ncr_attach(struct device *, struct device *, void *);
                    201: int    ncr_match(struct device *, void *, void *);
                    202:
                    203: /*
                    204:  * Tricks to make driver-name configurable
                    205:  */
                    206: #define CFNAME(n)      __CONCAT(n,_cd)
                    207: #define CANAME(n)      __CONCAT(n,_ca)
                    208: #define CFSTRING(n)    __STRING(n)
                    209:
                    210: struct cfattach CANAME(DRNAME) = {
                    211:        sizeof(struct ncr_softc), ncr_match, ncr_attach
                    212: };
                    213:
                    214: struct cfdriver CFNAME(DRNAME) = {
                    215:        NULL, CFSTRING(DRNAME), DV_DULL
                    216: };
                    217:
                    218: int
                    219: ncr_match(parent, cf, aux)
                    220:        struct device *parent;
                    221:        void *cf;
                    222:        void *aux;
                    223: {
                    224:        return (machine_match(parent,
                    225:                                (struct cfdata *) cf, aux, &CFNAME(DRNAME)));
                    226: }
                    227:
                    228: void
                    229: ncr_attach(pdp, dp, auxp)
                    230: struct device  *pdp, *dp;
                    231: void           *auxp;
                    232: {
                    233:        struct ncr_softc        *sc;
                    234:        struct scsibus_attach_args saa;
                    235:        int                     i;
                    236:
                    237:        sc = (struct ncr_softc *)dp;
                    238:
                    239:        sc->sc_link.adapter_softc   = sc;
                    240:        sc->sc_link.adapter_target  = 7;
                    241:        sc->sc_link.adapter         = &ncr5380_switch;
                    242:        sc->sc_link.device          = &ncr5380_dev;
                    243:        sc->sc_link.openings        = NREQ - 1;
                    244:
                    245:        /*
                    246:         * bitmasks
                    247:         */
                    248:        sc->sc_noselatn = 0;
                    249:        sc->sc_selected = 0;
                    250:
                    251:        /*
                    252:         * Initialize machine-type specific things...
                    253:         */
                    254:        scsi_mach_init(sc);
                    255:        printf("\n");
                    256:
                    257:        /*
                    258:         * Initialize request queue freelist.
                    259:         */
                    260:        for (i = 0; i < NREQ; i++) {
                    261:                req_queue[i].next = free_head;
                    262:                free_head = &req_queue[i];
                    263:        }
                    264:
                    265:        /*
                    266:         * Initialize the host adapter
                    267:         */
                    268:        scsi_idisable();
                    269:        ENABLE_NCR5380(sc);
                    270:        SET_5380_REG(NCR5380_ICOM, 0);
                    271:        SET_5380_REG(NCR5380_MODE, IMODE_BASE);
                    272:        SET_5380_REG(NCR5380_TCOM, 0);
                    273:        SET_5380_REG(NCR5380_IDSTAT, 0);
                    274:        scsi_ienable();
                    275:
                    276:        bzero(&saa, sizeof(saa));
                    277:        saa.saa_sc_link = &sc->sc_link;
                    278:
                    279:        /*
                    280:         * attach all scsi units on us
                    281:         */
                    282:        config_found(dp, &saa, scsiprint);
                    283: }
                    284:
                    285: /*
                    286:  * End of auto config stuff....
                    287:  */
                    288:
                    289: /*
                    290:  * Carry out a request from the high level driver.
                    291:  */
                    292: static int
                    293: mac68k_ncr5380_scsi_cmd(struct scsi_xfer *xs)
                    294: {
                    295:        int     sps;
                    296:        SC_REQ  *reqp, *link, *tmp;
                    297:        int     flags = xs->flags;
                    298:
                    299:        /*
                    300:         * We do not queue RESET commands
                    301:         */
                    302:        if (flags & SCSI_RESET) {
                    303:                scsi_reset_verbose(xs->sc_link->adapter_softc,
                    304:                                   "Got reset-command");
                    305:                return (COMPLETE);
                    306:        }
                    307:
                    308:        /*
                    309:         * Get a request block
                    310:         */
                    311:        sps = splbio();
                    312:        if ((reqp = free_head) == 0) {
                    313:                splx(sps);
                    314:                return (TRY_AGAIN_LATER);
                    315:        }
                    316:        free_head  = reqp->next;
                    317:        reqp->next = NULL;
                    318:        splx(sps);
                    319:
                    320:        /*
                    321:         * Initialize our private fields
                    322:         */
                    323:        reqp->dr_flag   = (flags & SCSI_POLL) ? DRIVER_NOINT : 0;
                    324:        reqp->phase     = NR_PHASE;
                    325:        reqp->msgout    = MSG_NOOP;
                    326:        reqp->status    = SCSGOOD;
                    327:        reqp->message   = 0xff;
                    328:        reqp->link      = NULL;
                    329:        reqp->xs        = xs;
                    330:        reqp->targ_id   = xs->sc_link->target;
                    331:        reqp->targ_lun  = xs->sc_link->lun;
                    332:        reqp->xdata_ptr = (u_char *)xs->data;
                    333:        reqp->xdata_len = xs->datalen;
                    334:        memcpy(&reqp->xcmd, xs->cmd, sizeof(struct scsi_generic));
                    335:        reqp->xcmd.bytes[0] |= reqp->targ_lun << 5;
                    336:
                    337:        /*
                    338:         * Sanity check on flags...
                    339:         */
                    340:        if (flags & ITSDONE) {
                    341:                ncr_tprint(reqp, "scsi_cmd: command already done.....\n");
                    342:                xs->flags &= ~ITSDONE;
                    343:        }
                    344:
                    345: #ifdef REAL_DMA
                    346:        /*
                    347:         * Check if DMA can be used on this request
                    348:         */
                    349:        if (scsi_dmaok(reqp))
                    350:                reqp->dr_flag |= DRIVER_DMAOK;
                    351: #endif /* REAL_DMA */
                    352:
                    353:        /*
                    354:         * Insert the command into the issue queue. Note that 'REQUEST SENSE'
                    355:         * commands are inserted at the head of the queue since any command
                    356:         * will clear the existing contingent allegience condition and the sense
                    357:         * data is only valid while the condition exists.
                    358:         * When possible, link the command to a previous command to the same
                    359:         * target. This is not very sensible when AUTO_SENSE is not defined!
                    360:         * Interrupts are disabled while we are fiddling with the issue-queue.
                    361:         */
                    362:        sps = splbio();
                    363:        link = NULL;
                    364:        if ((issue_q == NULL) || (reqp->xcmd.opcode == REQUEST_SENSE)) {
                    365:                reqp->next = issue_q;
                    366:                issue_q    = reqp;
                    367:        }
                    368:        else {
                    369:                tmp  = issue_q;
                    370:                do {
                    371:                    if (!link && (tmp->targ_id == reqp->targ_id) && !tmp->link)
                    372:                                link = tmp;
                    373:                } while (tmp->next && (tmp = tmp->next));
                    374:                tmp->next = reqp;
                    375: #ifdef AUTO_SENSE
                    376:                if (link && ((xs->sc_link->inqdata.flags & SID_Linked)
                    377:                             || ((1<<reqp->targ_id) & ncr5380_allow_linked))
                    378:                         && !((1<<reqp->targ_id) & ncr5380_disallow_linked)) {
                    379:                        link->link = reqp;
                    380:                        link->xcmd.bytes[link->xs->cmdlen-2] |= 1;
                    381:                }
                    382: #endif
                    383:        }
                    384:        splx(sps);
                    385:
                    386: #ifdef DBG_REQ
                    387:        if (dbg_target_mask & (1 << reqp->targ_id))
                    388:                show_request(reqp, (reqp->xcmd.opcode == REQUEST_SENSE) ?
                    389:                                                                "HEAD":"TAIL");
                    390: #endif
                    391:
                    392:        run_main(xs->sc_link->adapter_softc);
                    393:
                    394:        if (xs->flags & (SCSI_POLL|ITSDONE))
                    395:                return (COMPLETE); /* We're booting or run_main has completed */
                    396:        return (SUCCESSFULLY_QUEUED);
                    397: }
                    398:
                    399: static void
                    400: ncr5380_minphys(struct buf *bp)
                    401: {
                    402:     if (bp->b_bcount > MIN_PHYS)
                    403:        bp->b_bcount = MIN_PHYS;
                    404:     minphys(bp);
                    405: }
                    406: #undef MIN_PHYS
                    407:
                    408: static void
                    409: ncr5380_show_scsi_cmd(struct scsi_xfer *xs)
                    410: {
                    411:        u_char  *b = (u_char *) xs->cmd;
                    412:        int     i  = 0;
                    413:
                    414:        if (!(xs->flags & SCSI_RESET)) {
                    415:                printf("(%d:%d:%d,0x%x)-", xs->sc_link->scsibus,
                    416:                    xs->sc_link->target, xs->sc_link->lun, xs->sc_link->flags);
                    417:                while (i < xs->cmdlen) {
                    418:                        if (i)
                    419:                                printf(",");
                    420:                        printf("%x",b[i++]);
                    421:                }
                    422:                printf("-\n");
                    423:        }
                    424:        else {
                    425:                printf("(%d:%d:%d)-RESET-\n",
                    426:                    xs->sc_link->scsibus,xs->sc_link->target, xs->sc_link->lun);
                    427:        }
                    428: }
                    429:
                    430: /*
                    431:  * The body of the driver.
                    432:  */
                    433: static void
                    434: scsi_main(sc)
                    435: struct ncr_softc *sc;
                    436: {
                    437:        SC_REQ  *req, *prev;
                    438:        int     itype;
                    439:        int     sps;
                    440:
                    441:        /*
                    442:         * While running in the driver SCSI-interrupts are disabled.
                    443:         */
                    444:        scsi_idisable();
                    445:        ENABLE_NCR5380(sc);
                    446:
                    447:        PID("scsi_main1");
                    448:        for (;;) {
                    449:            sps = splbio();
                    450:            if (!connected) {
                    451:                /*
                    452:                 * Check if it is fair keep any exclusive access to DMA
                    453:                 * claimed. If not, stop queueing new jobs so the discon_q
                    454:                 * will be eventually drained and DMA can be given up.
                    455:                 */
                    456:                if (!fair_to_keep_dma())
                    457:                        goto main_exit;
                    458:
                    459:                /*
                    460:                 * Search through the issue-queue for a command
                    461:                 * destined for a target that isn't busy.
                    462:                 */
                    463:                prev = NULL;
                    464:                for (req=issue_q; req != NULL; prev = req, req = req->next) {
                    465:                        if (!(busy & (1 << req->targ_id))) {
                    466:                                /*
                    467:                                 * Found one, remove it from the issue queue
                    468:                                 */
                    469:                                if (prev == NULL)
                    470:                                        issue_q = req->next;
                    471:                                else prev->next = req->next;
                    472:                                req->next = NULL;
                    473:                                break;
                    474:                        }
                    475:                }
                    476:
                    477:                /*
                    478:                 * When a request has just ended, we get here before an other
                    479:                 * device detects that the bus is free and that it can
                    480:                 * reconnect. The problem is that when this happens, we always
                    481:                 * baffle the device because our (initiator) id is higher. This
                    482:                 * can cause a sort of starvation on slow devices. So we check
                    483:                 * for a pending reselection here.
                    484:                 * Note that 'connected' will be non-null if the reselection
                    485:                 * succeeds.
                    486:                 */
                    487:                if ((GET_5380_REG(NCR5380_IDSTAT) & (SC_S_SEL|SC_S_IO))
                    488:                                                == (SC_S_SEL|SC_S_IO)){
                    489:                        if (req != NULL) {
                    490:                                req->next = issue_q;
                    491:                                issue_q = req;
                    492:                        }
                    493:                        splx(sps);
                    494:
                    495:                        reselect(sc);
                    496:                        scsi_clr_ipend();
                    497:                        goto connected;
                    498:                }
                    499:
                    500:                /*
                    501:                 * The host is not connected and there is no request
                    502:                 * pending, exit.
                    503:                 */
                    504:                if (req == NULL) {
                    505:                        PID("scsi_main2");
                    506:                        goto main_exit;
                    507:                }
                    508:
                    509:                /*
                    510:                 * Re-enable interrupts before handling the request.
                    511:                 */
                    512:                splx(sps);
                    513:
                    514: #ifdef DBG_REQ
                    515:                if (dbg_target_mask & (1 << req->targ_id))
                    516:                        show_request(req, "TARGET");
                    517: #endif
                    518:                /*
                    519:                 * We found a request. Try to connect to the target. If the
                    520:                 * initiator fails arbitration, the command is put back in the
                    521:                 * issue queue.
                    522:                 */
                    523:                if (scsi_select(req, 0)) {
                    524:                        sps = splbio();
                    525:                        req->next = issue_q;
                    526:                        issue_q = req;
                    527:                        splx(sps);
                    528: #ifdef DBG_REQ
                    529:                        if (dbg_target_mask & (1 << req->targ_id))
                    530:                                ncr_tprint(req, "Select failed\n");
                    531: #endif
                    532:                }
                    533:            }
                    534:            else splx(sps);
                    535: connected:
                    536:            if (connected) {
                    537:                /*
                    538:                 * If the host is currently connected but a 'real-dma' transfer
                    539:                 * is in progress, the 'end-of-dma' interrupt restarts main.
                    540:                 * So quit.
                    541:                 */
                    542:                sps = splbio();
                    543:                if (connected && (connected->dr_flag & DRIVER_IN_DMA)) {
                    544:                        PID("scsi_main3");
                    545:                        goto main_exit;
                    546:                }
                    547:                splx(sps);
                    548:
                    549:                /*
                    550:                 * Let the target guide us through the bus-phases
                    551:                 */
                    552:                while (information_transfer(sc) == -1)
                    553:                        ;
                    554:            }
                    555:        }
                    556:        /* NEVER TO REACH HERE */
                    557:        panic("ncr5380-SCSI: not designed to come here");
                    558:
                    559: main_exit:
                    560:        /*
                    561:         * We enter here with interrupts disabled. We are about to exit main
                    562:         * so interrupts should be re-enabled. Because interrupts are edge
                    563:         * triggered, we could already have missed the interrupt. Therefore
                    564:         * we check the IRQ-line here and re-enter when we really missed a
                    565:         * valid interrupt.
                    566:         */
                    567:        PID("scsi_main4");
                    568:        scsi_ienable();
                    569:
                    570:        /*
                    571:         * If we're not currently connected, enable reselection
                    572:         * interrupts.
                    573:         */
                    574:        if (!connected)
                    575:                SET_5380_REG(NCR5380_IDSTAT, SC_HOST_ID);
                    576:
                    577:        if (scsi_ipending()) {
                    578:                if ((itype = check_intr(sc)) != INTR_SPURIOUS) {
                    579:                        scsi_idisable();
                    580:                        splx(sps);
                    581:
                    582:                        if (itype == INTR_RESEL)
                    583:                                reselect(sc);
                    584: #ifdef REAL_DMA
                    585:                        else dma_ready();
                    586: #else
                    587:                        else {
                    588:                                if (pdma_ready())
                    589:                                        goto connected;
                    590:                                panic("Got DMA interrupt without DMA");
                    591:                        }
                    592: #endif
                    593:                        scsi_clr_ipend();
                    594:                        goto connected;
                    595:                }
                    596:        }
                    597:        reconsider_dma();
                    598:
                    599:        main_running = 0;
                    600:        splx(sps);
                    601:        PID("scsi_main5");
                    602: }
                    603:
                    604: #ifdef REAL_DMA
                    605: /*
                    606:  * The SCSI-DMA interrupt.
                    607:  * This interrupt can only be triggered when running in non-polled DMA
                    608:  * mode. When DMA is not active, it will be silently ignored, it is usually
                    609:  * too late because the EOP interrupt of the controller happens just a tiny
                    610:  * bit earlier. It might become usefull when scatter/gather is implemented,
                    611:  * because in that case only part of the DATAIN/DATAOUT transfer is taken
                    612:  * out of a single buffer.
                    613:  */
                    614: static void
                    615: ncr_dma_intr(sc)
                    616: struct ncr_softc *sc;
                    617: {
                    618:        SC_REQ  *reqp;
                    619:        int     dma_done;
                    620:
                    621:        PID("ncr_dma_intr");
                    622:        if ((reqp = connected) && (reqp->dr_flag & DRIVER_IN_DMA)) {
                    623:                scsi_idisable();
                    624:                if (!(dma_done = dma_ready())) {
                    625:                        transfer_dma(reqp, reqp->phase, 0);
                    626:                        return;
                    627:                }
                    628:                run_main(sc);
                    629:        }
                    630: }
                    631: #endif /* REAL_DMA */
                    632:
                    633: /*
                    634:  * The SCSI-controller interrupt. This interrupt occurs on reselections and
                    635:  * at the end of non-polled DMA-interrupts. It is assumed to be called from
                    636:  * the machine-dependent hardware interrupt.
                    637:  */
                    638: static void
                    639: ncr_ctrl_intr(sc)
                    640: struct ncr_softc *sc;
                    641: {
                    642:        int     itype;
                    643:
                    644:        while (scsi_ipending()) {
                    645:                scsi_idisable();
                    646:                if ((itype = check_intr(sc)) != INTR_SPURIOUS) {
                    647:                        if (itype == INTR_RESEL)
                    648:                                reselect(sc);
                    649:                        else {
                    650: #ifdef REAL_DMA
                    651:                            int dma_done;
                    652:                            if (!(dma_done = dma_ready())) {
                    653:                                transfer_dma(connected, connected->phase, 0);
                    654:                                return;
                    655:                            }
                    656: #else
                    657:                            if (pdma_ready())
                    658:                                return;
                    659:                            panic("Got DMA interrupt without DMA");
                    660: #endif
                    661:                        }
                    662:                        scsi_clr_ipend();
                    663:                }
                    664:                run_main(sc);
                    665:                return;
                    666:        }
                    667:        PID("ncr_ctrl_intr1");
                    668: }
                    669:
                    670: /*
                    671:  * Initiate a connection path between the host and the target. The function
                    672:  * first goes into arbitration for the SCSI-bus. When this succeeds, the target
                    673:  * is selected and an 'IDENTIFY' message is send.
                    674:  * Returns -1 when the arbitration failed. Otherwise 0 is returned. When
                    675:  * the target does not respond (to either selection or 'MESSAGE OUT') the
                    676:  * 'done' function is executed.
                    677:  * The result code given by the driver can be influenced by setting 'code'
                    678:  * to a non-zero value. This is the case when 'select' is called by abort.
                    679:  */
                    680: static int
                    681: scsi_select(reqp, code)
                    682: SC_REQ *reqp;
                    683: int    code;
                    684: {
                    685:        u_char                  tmp[1];
                    686:        u_char                  phase;
                    687:        u_long                  cnt;
                    688:        int                     sps;
                    689:        u_int8_t                atn_flag;
                    690:        u_int8_t                targ_bit;
                    691:        struct ncr_softc        *sc;
                    692:
                    693:        sc = reqp->xs->sc_link->adapter_softc;
                    694:        DBG_SELPRINT ("Starting arbitration\n", 0);
                    695:        PID("scsi_select1");
                    696:
                    697:        sps = splbio();
                    698:
                    699:        /*
                    700:         * Prevent a race condition here. If a reslection interrupt occurred
                    701:         * between the decision to pick a new request and the call to select,
                    702:         * we abort the selection.
                    703:         * Interrupts are lowered when the 5380 is setup to arbitrate for the
                    704:         * bus.
                    705:         */
                    706:        if (connected) {
                    707:                splx(sps);
                    708:                PID("scsi_select2");
                    709:                return (-1);
                    710:        }
                    711:
                    712:        /*
                    713:         * Set phase bits to 0, otherwise the 5380 won't drive the bus during
                    714:         * selection.
                    715:         */
                    716:        SET_5380_REG(NCR5380_TCOM, 0);
                    717:        SET_5380_REG(NCR5380_ICOM, 0);
                    718:
                    719:        /*
                    720:         * Arbitrate for the bus.
                    721:         */
                    722:        SET_5380_REG(NCR5380_DATA, SC_HOST_ID);
                    723:        SET_5380_REG(NCR5380_MODE, SC_ARBIT);
                    724:
                    725:        splx(sps);
                    726:
                    727:        cnt = 10;
                    728:        while (!(GET_5380_REG(NCR5380_ICOM) & SC_AIP) && --cnt)
                    729:                delay(1);
                    730:
                    731:        if (!(GET_5380_REG(NCR5380_ICOM) & SC_AIP)) {
                    732:                SET_5380_REG(NCR5380_MODE, IMODE_BASE);
                    733:                SET_5380_REG(NCR5380_ICOM, 0);
                    734:                DBG_SELPRINT ("Arbitration lost, bus not free\n",0);
                    735:                PID("scsi_select3");
                    736:                return (-1);
                    737:        }
                    738:
                    739:        /* The arbitration delay is 2.2 usecs */
                    740:        delay(3);
                    741:
                    742:        /*
                    743:         * Check the result of the arbitration. If we failed, return -1.
                    744:         */
                    745:        if (GET_5380_REG(NCR5380_ICOM) & SC_LA) {
                    746:                SET_5380_REG(NCR5380_MODE, IMODE_BASE);
                    747:                SET_5380_REG(NCR5380_ICOM, 0);
                    748:                PID("scsi_select4");
                    749:                return (-1);
                    750:        }
                    751:
                    752:        /*
                    753:         * The spec requires that we should read the data register to
                    754:         * check for higher id's and check the SC_LA again.
                    755:         */
                    756:        tmp[0] = GET_5380_REG(NCR5380_DATA);
                    757:        if (tmp[0] & ~((SC_HOST_ID << 1) - 1)) {
                    758:                SET_5380_REG(NCR5380_MODE, IMODE_BASE);
                    759:                SET_5380_REG(NCR5380_ICOM, 0);
                    760:                DBG_SELPRINT ("Arbitration lost, higher id present\n",0);
                    761:                PID("scsi_select5");
                    762:                return (-1);
                    763:        }
                    764:        if (GET_5380_REG(NCR5380_ICOM) & SC_LA) {
                    765:                SET_5380_REG(NCR5380_MODE, IMODE_BASE);
                    766:                SET_5380_REG(NCR5380_ICOM, 0);
                    767:                DBG_SELPRINT ("Arbitration lost,deassert SC_ARBIT\n",0);
                    768:                PID("scsi_select6");
                    769:                return (-1);
                    770:        }
                    771:        SET_5380_REG(NCR5380_ICOM, SC_A_SEL | SC_A_BSY);
                    772:        if (GET_5380_REG(NCR5380_ICOM) & SC_LA) {
                    773:                SET_5380_REG(NCR5380_MODE, IMODE_BASE);
                    774:                SET_5380_REG(NCR5380_ICOM, 0);
                    775:                DBG_SELPRINT ("Arbitration lost, deassert SC_A_SEL\n", 0);
                    776:                PID("scsi_select7");
                    777:                return (-1);
                    778:        }
                    779:        /* Bus settle delay + Bus clear delay = 1.2 usecs */
                    780:        delay(2);
                    781:        DBG_SELPRINT ("Arbitration complete\n", 0);
                    782:
                    783:        /*
                    784:         * Now that we won the arbitration, start the selection.
                    785:         */
                    786:        targ_bit = 1 << reqp->targ_id;
                    787:        SET_5380_REG(NCR5380_DATA, SC_HOST_ID | targ_bit);
                    788:
                    789:        if (sc->sc_noselatn & targ_bit)
                    790:                atn_flag = 0;
                    791:        else
                    792:                atn_flag = SC_A_ATN;
                    793:
                    794:        /*
                    795:         * Raise ATN while SEL is true before BSY goes false from arbitration,
                    796:         * since this is the only way to guarantee that we'll get a MESSAGE OUT
                    797:         * phase immediately after the selection.
                    798:         */
                    799:        SET_5380_REG(NCR5380_ICOM, SC_A_BSY | SC_A_SEL | atn_flag | SC_ADTB);
                    800:        SET_5380_REG(NCR5380_MODE, IMODE_BASE);
                    801:
                    802:        /*
                    803:         * Turn off reselection interrupts
                    804:         */
                    805:        SET_5380_REG(NCR5380_IDSTAT, 0);
                    806:
                    807:        /*
                    808:         * Reset BSY. The delay following it, surpresses a glitch in the
                    809:         * 5380 which causes us to see our own BSY signal instead of that of
                    810:         * the target.
                    811:         */
                    812:        SET_5380_REG(NCR5380_ICOM, SC_A_SEL | atn_flag | SC_ADTB);
                    813:        delay(1);
                    814:
                    815:        /*
                    816:         * Wait for the target to react, the specs call for a timeout of
                    817:         * 250 ms.
                    818:         */
                    819:        cnt = 25000;
                    820:        while (!(GET_5380_REG(NCR5380_IDSTAT) & SC_S_BSY) && --cnt)
                    821:                delay(10);
                    822:
                    823:        if (!(GET_5380_REG(NCR5380_IDSTAT) & SC_S_BSY)) {
                    824:                /*
                    825:                 * There is no reaction from the target, start the selection
                    826:                 * timeout procedure. We release the databus but keep SEL
                    827:                 * asserted. After that we wait a 'selection abort time' (200
                    828:                 * usecs) and 2 deskew delays (90 ns) and check BSY again.
                    829:                 * When BSY is asserted, we assume the selection succeeded,
                    830:                 * otherwise we release the bus.
                    831:                 */
                    832:                SET_5380_REG(NCR5380_ICOM, SC_A_SEL | atn_flag);
                    833:                delay(201);
                    834:                if (!(GET_5380_REG(NCR5380_IDSTAT) & SC_S_BSY)) {
                    835:                        SET_5380_REG(NCR5380_ICOM, 0);
                    836:                        reqp->xs->error      = code ? code : XS_SELTIMEOUT;
                    837:                        DBG_SELPRINT ("Target %d not responding to sel\n",
                    838:                                                                reqp->targ_id);
                    839:                        finish_req(reqp);
                    840:                        PID("scsi_select8");
                    841:                        return (0);
                    842:                }
                    843:        }
                    844:        SET_5380_REG(NCR5380_ICOM, atn_flag);
                    845:
                    846:        DBG_SELPRINT ("Target %d responding to select.\n", reqp->targ_id);
                    847:
                    848:        /*
                    849:         * The SCSI-interrupts are disabled while a request is being handled.
                    850:         */
                    851:        scsi_idisable();
                    852:
                    853:        /*
                    854:         * If we did not request ATN, then don't try to send IDENTIFY.
                    855:         */
                    856:        if (atn_flag == 0) {
                    857:                reqp->phase = PH_CMD;
                    858:                goto identify_failed;
                    859:        }
                    860:
                    861:        /*
                    862:         * Here we prepare to send an 'IDENTIFY' message.
                    863:         * Allow disconnect only when interrupts are allowed.
                    864:         */
                    865:        tmp[0] = MSG_IDENTIFY(reqp->targ_lun,
                    866:                        (reqp->dr_flag & DRIVER_NOINT) ? 0 : 1);
                    867:        cnt    = 1;
                    868:        phase  = PH_MSGOUT;
                    869:
                    870:        /*
                    871:         * Since we followed the SCSI-spec and raised ATN while SEL was true
                    872:         * but before BSY was false during the selection, a 'MESSAGE OUT'
                    873:         * phase should follow.  Unfortunately, this does not happen on
                    874:         * all targets (Asante ethernet devices, for example), so we must
                    875:         * check the actual mode if the message transfer fails--if the
                    876:         * new phase is PH_CMD and has never been successfully selected
                    877:         * w/ATN in the past, then we assume that it is an old device
                    878:         * that doesn't support select w/ATN.
                    879:         */
                    880:        if (transfer_pio(&phase, tmp, &cnt, 0) || cnt) {
                    881:
                    882:                if ((phase == PH_CMD) && !(sc->sc_selected & targ_bit)) {
                    883:                        DBG_SELPRINT ("Target %d: not responding to ATN.\n",
                    884:                                                        reqp->targ_id);
                    885:                        sc->sc_noselatn |= targ_bit;
                    886:                        reqp->phase = PH_CMD;
                    887:                        goto identify_failed;
                    888:                }
                    889:
                    890:                DBG_SELPRINT ("Target %d: failed to send identify\n",
                    891:                                                        reqp->targ_id);
                    892:                /*
                    893:                 * Try to disconnect from the target.  We cannot leave
                    894:                 * it just hanging here.
                    895:                 */
                    896:                if (!reach_msg_out(sc, sizeof(struct scsi_generic))) {
                    897:                        u_long  len   = 1;
                    898:                        u_char  phase = PH_MSGOUT;
                    899:                        u_char  msg   = MSG_ABORT;
                    900:
                    901:                        transfer_pio(&phase, &msg, &len, 0);
                    902:                }
                    903:                else scsi_reset_verbose(sc, "Connected to unidentified target");
                    904:
                    905:                SET_5380_REG(NCR5380_ICOM, 0);
                    906:                reqp->xs->error = code ? code : XS_DRIVER_STUFFUP;
                    907:                finish_req(reqp);
                    908:                PID("scsi_select9");
                    909:                return (0);
                    910:        }
                    911:        reqp->phase = PH_MSGOUT;
                    912:
                    913: identify_failed:
                    914:        sc->sc_selected |= targ_bit;
                    915:
                    916: #ifdef notyet /* LWP: Do we need timeouts in the driver? */
                    917:        /*
                    918:         * Command is connected, start timer ticking.
                    919:         */
                    920:        ccb_p->xtimeout = ccb_p->timeout + Lbolt;
                    921: #endif
                    922:
                    923:        connected  = reqp;
                    924:        busy      |= targ_bit;
                    925:        PID("scsi_select10");
                    926:        return (0);
                    927: }
                    928:
                    929: /*
                    930:  * Return codes:
                    931:  *      0: Job has finished or disconnected, find something else
                    932:  *     -1: keep on calling information_transfer() from scsi_main()
                    933:  */
                    934: static int
                    935: information_transfer(sc)
                    936: struct ncr_softc *sc;
                    937: {
                    938:        SC_REQ  *reqp = connected;
                    939:        u_char  tmp, phase;
                    940:        u_long  len;
                    941:
                    942:        PID("info_transf1");
                    943:        /*
                    944:         * Clear pending interrupts from 5380-chip.
                    945:         */
                    946:        scsi_clr_ipend();
                    947:
                    948:        /*
                    949:         * The SCSI-spec requires BSY to be true while connected to a target,
                    950:         * loosing it means we lost the target...
                    951:         * Also REQ needs to be asserted here to indicate that the bus-phase
                    952:         * is valid. When the target does not supply REQ within a 'reasonable'
                    953:         * amount of time, it's probably lost in its own maze of twisting
                    954:         * passages, we have to reset the bus to free it.
                    955:         */
                    956:        if (GET_5380_REG(NCR5380_IDSTAT) & SC_S_BSY)
                    957:                wait_req_true();
                    958:        tmp = GET_5380_REG(NCR5380_IDSTAT);
                    959:
                    960:
                    961:        if ((tmp & (SC_S_BSY|SC_S_REQ)) != (SC_S_BSY|SC_S_REQ)) {
                    962:                busy           &= ~(1 << reqp->targ_id);
                    963:                connected       = NULL;
                    964:                reqp->xs->error = XS_TIMEOUT;
                    965:                finish_req(reqp);
                    966:                if (!(tmp & SC_S_REQ))
                    967:                        scsi_reset_verbose(sc,
                    968:                                           "Timeout waiting for phase-change");
                    969:                PID("info_transf2");
                    970:                return (0);
                    971:        }
                    972:
                    973:        phase = (tmp >> 2) & 7;
                    974:        if (phase != reqp->phase) {
                    975:                reqp->phase = phase;
                    976:                DBG_INFPRINT(show_phase, reqp, phase);
                    977:        }
                    978:        else {
                    979:                /*
                    980:                 * Same data-phase. If same error give up
                    981:                 */
                    982:                if ((reqp->msgout == MSG_ABORT)
                    983:                     && ((phase == PH_DATAOUT) || (phase == PH_DATAIN))) {
                    984:                        busy     &= ~(1 << reqp->targ_id);
                    985:                        connected = NULL;
                    986:                        finish_req(reqp);
                    987:                        scsi_reset_verbose(sc, "Failure to abort command");
                    988:                        return (0);
                    989:                }
                    990:        }
                    991:
                    992:        switch (phase) {
                    993:            case PH_DATAOUT:
                    994: #ifdef DBG_NOWRITE
                    995:                ncr_tprint(reqp, "NOWRITE set -- write attempt aborted.");
                    996:                reqp->msgout = MSG_ABORT;
                    997:                SET_5380_REG(NCR5380_ICOM, SC_A_ATN);
                    998:                return (-1);
                    999: #endif /* DBG_NOWRITE */
                   1000:                /*
                   1001:                 * If this is the first write using DMA, fill
                   1002:                 * the bounce buffer.
                   1003:                 */
                   1004:                if (reqp->xdata_ptr == reqp->xs->data) { /* XXX */
                   1005:                    if (reqp->dr_flag & DRIVER_BOUNCING)
                   1006:                        bcopy(reqp->xdata_ptr, reqp->bounceb, reqp->xdata_len);
                   1007:                }
                   1008:
                   1009:           case PH_DATAIN:
                   1010:                if (reqp->xdata_len <= 0) {
                   1011:                        /*
                   1012:                         * Target keeps requesting data. Try to get into
                   1013:                         * message-out phase by feeding/taking 100 byte.
                   1014:                         */
                   1015:                        ncr_tprint(reqp, "Target requests too much data\n");
                   1016:                        reqp->msgout = MSG_ABORT;
                   1017:                        SET_5380_REG(NCR5380_ICOM, SC_A_ATN);
                   1018:                        reach_msg_out(sc, 100);
                   1019:                        return (-1);
                   1020:                }
                   1021: #ifdef REAL_DMA
                   1022:                if (reqp->dr_flag & DRIVER_DMAOK) {
                   1023:                        int poll = REAL_DMA_POLL|(reqp->dr_flag & DRIVER_NOINT);
                   1024:                        transfer_dma(reqp, phase, poll);
                   1025:                        if (!poll)
                   1026:                                return (0);
                   1027:                }
                   1028:                else
                   1029: #endif
                   1030:                {
                   1031:                        PID("info_transf3");
                   1032:                        len = reqp->xdata_len;
                   1033: #ifdef USE_PDMA
                   1034:                        if (transfer_pdma(&phase, reqp->xdata_ptr, &len) == 0)
                   1035:                                return (0);
                   1036: #else
                   1037:                        transfer_pio(&phase, reqp->xdata_ptr, &len, 0);
                   1038: #endif
                   1039:                        reqp->xdata_ptr += reqp->xdata_len - len;
                   1040:                        reqp->xdata_len  = len;
                   1041:                }
                   1042:                return (-1);
                   1043:           case PH_MSGIN:
                   1044:                /*
                   1045:                 * We only expect single byte messages here.
                   1046:                 */
                   1047:                len = 1;
                   1048:                transfer_pio(&phase, &tmp, &len, 1);
                   1049:                reqp->message = tmp;
                   1050:                return (handle_message(reqp, tmp));
                   1051:           case PH_MSGOUT:
                   1052:                len = 1;
                   1053:                transfer_pio(&phase, &reqp->msgout, &len, 0);
                   1054:                if (reqp->msgout == MSG_ABORT) {
                   1055:                        busy     &= ~(1 << reqp->targ_id);
                   1056:                        connected = NULL;
                   1057:                        if (!reqp->xs->error)
                   1058:                                reqp->xs->error = XS_DRIVER_STUFFUP;
                   1059:                        finish_req(reqp);
                   1060:                        PID("info_transf4");
                   1061:                        return (0);
                   1062:                }
                   1063:                reqp->msgout = MSG_NOOP;
                   1064:                return (-1);
                   1065:           case PH_CMD :
                   1066:                len = command_size(reqp->xcmd.opcode);
                   1067:                transfer_pio(&phase, (u_char *)&reqp->xcmd, &len, 0);
                   1068:                PID("info_transf5");
                   1069:                return (-1);
                   1070:           case PH_STATUS:
                   1071:                len = 1;
                   1072:                transfer_pio(&phase, &tmp, &len, 0);
                   1073:                reqp->status = tmp;
                   1074:                PID("info_transf6");
                   1075:                return (-1);
                   1076:           default :
                   1077:                ncr_tprint(reqp, "Unknown phase\n");
                   1078:        }
                   1079:        PID("info_transf7");
                   1080:        return (-1);
                   1081: }
                   1082:
                   1083: /*
                   1084:  * Handle the message 'msg' send to us by the target.
                   1085:  * Return values:
                   1086:  *      0 : The current command has completed.
                   1087:  *     -1 : Get on to the next phase.
                   1088:  */
                   1089: static int
                   1090: handle_message(reqp, msg)
                   1091: SC_REQ *reqp;
                   1092: u_int  msg;
                   1093: {
                   1094:        int     sps;
                   1095:        SC_REQ  *prev, *req;
                   1096:
                   1097:        PID("hmessage1");
                   1098:        switch (msg) {
                   1099:                /*
                   1100:                 * Linking lets us reduce the time required to get
                   1101:                 * the next command to the device, skipping the arbitration
                   1102:                 * and selection time. In the current implementation,
                   1103:                 * we merely have to start the next command pointed
                   1104:                 * to by 'next_link'.
                   1105:                 */
                   1106:                case MSG_LINK_CMD_COMPLETE:
                   1107:                case MSG_LINK_CMD_COMPLETEF:
                   1108:                        if (reqp->link == NULL) {
                   1109:                                ncr_tprint(reqp, "No link for linked command");
                   1110:                                nack_message(reqp, MSG_ABORT);
                   1111:                                PID("hmessage2");
                   1112:                                return (-1);
                   1113:                        }
                   1114:                        ack_message();
                   1115:                        if (!(reqp->dr_flag & DRIVER_AUTOSEN)) {
                   1116:                                reqp->xs->resid = reqp->xdata_len;
                   1117:                                reqp->xs->error = 0;
                   1118:                        }
                   1119:
                   1120: #ifdef AUTO_SENSE
                   1121:                        if (check_autosense(reqp, 1) == -1)
                   1122:                                return (-1);
                   1123: #endif /* AUTO_SENSE */
                   1124:
                   1125: #ifdef DBG_REQ
                   1126:                        if (dbg_target_mask & (1 << reqp->targ_id))
                   1127:                                show_request(reqp->link, "LINK");
                   1128: #endif
                   1129:                        connected = reqp->link;
                   1130:
                   1131:                        /*
                   1132:                         * Unlink the 'linked' request from the issue_q
                   1133:                         */
                   1134:                        sps  = splbio();
                   1135:                        prev = NULL;
                   1136:                        req  = issue_q;
                   1137:                        for (; req != NULL; prev = req, req = req->next) {
                   1138:                                if (req == connected)
                   1139:                                        break;
                   1140:                        }
                   1141:                        if (req == NULL)
                   1142:                                panic("Inconsistent issue_q");
                   1143:                        if (prev == NULL)
                   1144:                                issue_q = req->next;
                   1145:                        else prev->next = req->next;
                   1146:                        req->next = NULL;
                   1147:                        splx(sps);
                   1148:
                   1149:                        finish_req(reqp);
                   1150:                        PID("hmessage3");
                   1151:                        return (-1);
                   1152:                case MSG_ABORT:
                   1153:                case MSG_CMDCOMPLETE:
                   1154:                        ack_message();
                   1155:                        connected = NULL;
                   1156:                        busy     &= ~(1 << reqp->targ_id);
                   1157:                        if (!(reqp->dr_flag & DRIVER_AUTOSEN)) {
                   1158:                                reqp->xs->resid = reqp->xdata_len;
                   1159:                                reqp->xs->error = 0;
                   1160:                        }
                   1161:
                   1162: #ifdef AUTO_SENSE
                   1163:                        if (check_autosense(reqp, 0) == -1) {
                   1164:                                PID("hmessage4");
                   1165:                                return (0);
                   1166:                        }
                   1167: #endif /* AUTO_SENSE */
                   1168:
                   1169:                        finish_req(reqp);
                   1170:                        PID("hmessage5");
                   1171:                        return (0);
                   1172:                case MSG_MESSAGE_REJECT:
                   1173:                        ack_message();
                   1174:                        PID("hmessage6");
                   1175:                        return (-1);
                   1176:                case MSG_DISCONNECT:
                   1177:                        ack_message();
                   1178: #ifdef DBG_REQ
                   1179:                        if (dbg_target_mask & (1 << reqp->targ_id))
                   1180:                                show_request(reqp, "DISCON");
                   1181: #endif
                   1182:                        sps = splbio();
                   1183:                        connected  = NULL;
                   1184:                        reqp->next = discon_q;
                   1185:                        discon_q   = reqp;
                   1186:                        splx(sps);
                   1187:                        PID("hmessage7");
                   1188:                        return (0);
                   1189:                case MSG_SAVEDATAPOINTER:
                   1190:                case MSG_RESTOREPOINTERS:
                   1191:                        /*
                   1192:                         * We save pointers implicitely at disconnect.
                   1193:                         * So we can ignore these messages.
                   1194:                         */
                   1195:                        ack_message();
                   1196:                        PID("hmessage8");
                   1197:                        return (-1);
                   1198:                case MSG_EXTENDED:
                   1199:                        nack_message(reqp, MSG_MESSAGE_REJECT);
                   1200:                        PID("hmessage9");
                   1201:                        return (-1);
                   1202:                default:
                   1203:                        if ((msg & 0x80) && !(msg & 0x18)) {    /* IDENTIFY */
                   1204:                                PID("hmessage10");
                   1205:                                ack_message();
                   1206:                                return (0);
                   1207:                        } else {
                   1208:                                ncr_tprint(reqp,
                   1209:                                           "Unknown message %x.  Rejecting.\n",
                   1210:                                           msg);
                   1211:                                nack_message(reqp, MSG_MESSAGE_REJECT);
                   1212:                        }
                   1213:                        return (-1);
                   1214:        }
                   1215:        PID("hmessage11");
                   1216:        return (-1);
                   1217: }
                   1218:
                   1219: /*
                   1220:  * Handle reselection. If a valid reconnection occurs, connected
                   1221:  * points at the reconnected command. The command is removed from the
                   1222:  * disconnected queue.
                   1223:  */
                   1224: static void
                   1225: reselect(sc)
                   1226: struct ncr_softc *sc;
                   1227: {
                   1228:        u_char  phase;
                   1229:        u_long  len;
                   1230:        u_char  msg;
                   1231:        u_char  target_mask;
                   1232:        int     abort = 0;
                   1233:        SC_REQ  *tmp, *prev;
                   1234:
                   1235:        PID("reselect1");
                   1236:        target_mask = GET_5380_REG(NCR5380_DATA) & ~SC_HOST_ID;
                   1237:
                   1238:        /*
                   1239:         * At this point, we have detected that our SCSI-id is on the bus,
                   1240:         * SEL is true and BSY was false for at least one bus settle
                   1241:         * delay (400 ns.).
                   1242:         * We must assert BSY ourselves, until the target drops the SEL signal.
                   1243:         * The SCSI-spec specifies no maximum time for this, so we have to
                   1244:         * choose something long enough to suit all targets.
                   1245:         */
                   1246:        SET_5380_REG(NCR5380_ICOM, SC_A_BSY);
                   1247:        len = 250000;
                   1248:        while ((GET_5380_REG(NCR5380_IDSTAT) & SC_S_SEL) && (len > 0)) {
                   1249:                delay(1);
                   1250:                len--;
                   1251:        }
                   1252:        if (GET_5380_REG(NCR5380_IDSTAT) & SC_S_SEL) {
                   1253:                /* Damn SEL isn't dropping */
                   1254:                scsi_reset_verbose(sc, "Target won't drop SEL during Reselect");
                   1255:                return;
                   1256:        }
                   1257:
                   1258:        SET_5380_REG(NCR5380_ICOM, 0);
                   1259:
                   1260:        /*
                   1261:         * Check if the reselection is still valid. Check twice because
                   1262:         * of possible line glitches - cheaper than delay(1) and we need
                   1263:         * only a few nanoseconds.
                   1264:         */
                   1265:        if (!(GET_5380_REG(NCR5380_IDSTAT) & SC_S_BSY)) {
                   1266:            if (!(GET_5380_REG(NCR5380_IDSTAT) & SC_S_BSY)) {
                   1267:                ncr_aprint(sc, "Stepped into the reselection timeout\n");
                   1268:                return;
                   1269:            }
                   1270:        }
                   1271:
                   1272:        /*
                   1273:         * Get the expected identify message.
                   1274:         */
                   1275:        phase = PH_MSGIN;
                   1276:        len   = 1;
                   1277:        transfer_pio(&phase, &msg, &len, 0);
                   1278:        if (len || !MSG_ISIDENTIFY(msg)) {
                   1279:                ncr_aprint(sc, "Expecting IDENTIFY, got 0x%x\n", msg);
                   1280:                abort = 1;
                   1281:                tmp = NULL;
                   1282:        }
                   1283:        else {
                   1284:            /*
                   1285:             * Find the command reconnecting
                   1286:             */
                   1287:            for (tmp = discon_q, prev = NULL; tmp; prev = tmp, tmp = tmp->next){
                   1288:                if (target_mask == (1 << tmp->targ_id)) {
                   1289:                        if (prev)
                   1290:                                prev->next = tmp->next;
                   1291:                        else discon_q = tmp->next;
                   1292:                        tmp->next = NULL;
                   1293:                        break;
                   1294:                }
                   1295:            }
                   1296:            if (tmp == NULL) {
                   1297:                ncr_aprint(sc, "No disconnected job for targetmask %x\n",
                   1298:                                                                target_mask);
                   1299:                abort = 1;
                   1300:            }
                   1301:        }
                   1302:        if (abort) {
                   1303:                msg   = MSG_ABORT;
                   1304:                len   = 1;
                   1305:                phase = PH_MSGOUT;
                   1306:
                   1307:                SET_5380_REG(NCR5380_ICOM, SC_A_ATN);
                   1308:                if (transfer_pio(&phase, &msg, &len, 0) || len)
                   1309:                        scsi_reset_verbose(sc, "Failure to abort reselection");
                   1310:        }
                   1311:        else {
                   1312:                connected = tmp;
                   1313: #ifdef DBG_REQ
                   1314:                if (dbg_target_mask & (1 << tmp->targ_id))
                   1315:                        show_request(tmp, "RECON");
                   1316: #endif
                   1317:        }
                   1318:        PID("reselect2");
                   1319: }
                   1320:
                   1321: /*
                   1322:  * Transfer data in a given phase using programmed I/O.
                   1323:  * Returns -1 when a different phase is entered without transferring the
                   1324:  * maximum number of bytes, 0 if all bytes transferred or exit is in the same
                   1325:  * phase.
                   1326:  */
                   1327: static int
                   1328: transfer_pio(phase, data, len, dont_drop_ack)
                   1329: u_char *phase;
                   1330: u_char *data;
                   1331: u_long *len;
                   1332: int    dont_drop_ack;
                   1333: {
                   1334:        u_int   cnt = *len;
                   1335:        u_char  ph  = *phase;
                   1336:        u_char  tmp, new_icom;
                   1337:
                   1338:        DBG_PIOPRINT ("SCSI: transfer_pio start: phase: %d, len: %d\n", ph,cnt);
                   1339:        PID("tpio1");
                   1340:        SET_5380_REG(NCR5380_TCOM, ph);
                   1341:        do {
                   1342:            if (!wait_req_true()) {
                   1343:                DBG_PIOPRINT ("SCSI: transfer_pio: missing REQ\n", 0, 0);
                   1344:                break;
                   1345:            }
                   1346:            if (((GET_5380_REG(NCR5380_IDSTAT) >> 2) & 7) != ph) {
                   1347:                DBG_PIOPRINT ("SCSI: transfer_pio: phase mismatch\n", 0, 0);
                   1348:                break;
                   1349:            }
                   1350:            if (PH_IN(ph)) {
                   1351:                *data++ = GET_5380_REG(NCR5380_DATA);
                   1352:                SET_5380_REG(NCR5380_ICOM, SC_A_ACK);
                   1353:                if ((cnt == 1) && dont_drop_ack)
                   1354:                        new_icom = SC_A_ACK;
                   1355:                else new_icom = 0;
                   1356:            }
                   1357:            else {
                   1358:                SET_5380_REG(NCR5380_DATA, *data++);
                   1359:
                   1360:                /*
                   1361:                 * The SCSI-standard suggests that in the 'MESSAGE OUT' phase,
                   1362:                 * the initiator should drop ATN on the last byte of the
                   1363:                 * message phase after REQ has been asserted for the handshake
                   1364:                 * but before the initiator raises ACK.
                   1365:                 */
                   1366:                if (!( (ph == PH_MSGOUT) && (cnt > 1) )) {
                   1367:                        SET_5380_REG(NCR5380_ICOM, SC_ADTB);
                   1368:                        SET_5380_REG(NCR5380_ICOM, SC_ADTB | SC_A_ACK);
                   1369:                        new_icom = 0;
                   1370:                }
                   1371:                else {
                   1372:                        SET_5380_REG(NCR5380_ICOM, SC_ADTB | SC_A_ATN);
                   1373:                        SET_5380_REG(NCR5380_ICOM, SC_ADTB|SC_A_ATN|SC_A_ACK);
                   1374:                        new_icom = SC_A_ATN;
                   1375:                }
                   1376:            }
                   1377:            if (!wait_req_false()) {
                   1378:                DBG_PIOPRINT ("SCSI: transfer_pio - REQ not dropping\n", 0, 0);
                   1379:                break;
                   1380:            }
                   1381:            SET_5380_REG(NCR5380_ICOM, new_icom);
                   1382:
                   1383:        } while (--cnt);
                   1384:
                   1385:        if ((tmp = GET_5380_REG(NCR5380_IDSTAT)) & SC_S_REQ)
                   1386:                *phase = (tmp >> 2) & 7;
                   1387:        else *phase = NR_PHASE;
                   1388:        *len = cnt;
                   1389:        DBG_PIOPRINT ("SCSI: transfer_pio done: phase: %d, len: %d\n",
                   1390:                                                                *phase, cnt);
                   1391:        PID("tpio2");
                   1392:        if (!cnt || (*phase == ph))
                   1393:                return (0);
                   1394:        return (-1);
                   1395: }
                   1396:
                   1397: #ifdef REAL_DMA
                   1398: /*
                   1399:  * Start a DMA-transfer on the device using the current pointers.
                   1400:  * If 'poll' is true, the function busy-waits until DMA has completed.
                   1401:  */
                   1402: static void
                   1403: transfer_dma(reqp, phase, poll)
                   1404: SC_REQ *reqp;
                   1405: u_int  phase;
                   1406: int    poll;
                   1407: {
                   1408:        int     dma_done;
                   1409:        u_char  mbase = 0;
                   1410:        int     sps;
                   1411:
                   1412: again:
                   1413:        PID("tdma1");
                   1414:
                   1415:        /*
                   1416:         * We should be in phase, otherwise we are not allowed to
                   1417:         * drive the bus.
                   1418:         */
                   1419:        SET_5380_REG(NCR5380_TCOM, phase);
                   1420:
                   1421:        /*
                   1422:         * Defer interrupts until DMA is fully running.
                   1423:         */
                   1424:        sps = splbio();
                   1425:
                   1426:        /*
                   1427:         * Clear pending interrupts and parity errors.
                   1428:         */
                   1429:        scsi_clr_ipend();
                   1430:
                   1431:        if (!poll) {
                   1432:                /*
                   1433:                 * Enable SCSI interrupts and set IN_DMA flag, set 'mbase'
                   1434:                 * to the interrupts we want enabled.
                   1435:                 */
                   1436:                scsi_ienable();
                   1437:                reqp->dr_flag |= DRIVER_IN_DMA;
                   1438:                mbase = SC_E_EOPI | SC_MON_BSY;
                   1439:        }
                   1440:        else scsi_idisable();
                   1441:        mbase |=  IMODE_BASE | SC_M_DMA;
                   1442:        scsi_dma_setup(reqp, phase, mbase);
                   1443:
                   1444:        splx(sps);
                   1445:
                   1446:        if (poll) {
                   1447:                /*
                   1448:                 * On polled-dma transfers, we wait here until the
                   1449:                 * 'end-of-dma' condition occurs.
                   1450:                 */
                   1451:                poll_edma(reqp);
                   1452:                if (!(dma_done = dma_ready()))
                   1453:                        goto again;
                   1454:        }
                   1455:        PID("tdma2");
                   1456: }
                   1457:
                   1458: /*
                   1459:  * Check results of a DMA data-transfer.
                   1460:  */
                   1461: static int
                   1462: dma_ready()
                   1463: {
                   1464:        SC_REQ  *reqp = connected;
                   1465:        int     dmstat, is_edma;
                   1466:        long    bytes_left, bytes_done;
                   1467:
                   1468:        is_edma = get_dma_result(reqp, &bytes_left);
                   1469:        dmstat  = GET_5380_REG(NCR5380_DMSTAT);
                   1470:
                   1471:        /*
                   1472:         * Check if the call is sensible and not caused by any spurious
                   1473:         * interrupt.
                   1474:         */
                   1475:        if (!is_edma && !(dmstat & (SC_END_DMA|SC_BSY_ERR))
                   1476:                     && (dmstat & SC_PHS_MTCH) ) {
                   1477:                ncr_tprint(reqp, "dma_ready: spurious call "
                   1478:                                 "(dm:%x,last_hit: %s)\n",
                   1479: #ifdef DBG_PID
                   1480:                                        dmstat, last_hit[DBG_PID-1]);
                   1481: #else
                   1482:                                        dmstat, "unknown");
                   1483: #endif
                   1484:                return (0);
                   1485:        }
                   1486:
                   1487:        /*
                   1488:         * Clear all (pending) interrupts.
                   1489:         */
                   1490:        scsi_clr_ipend();
                   1491:
                   1492:        /*
                   1493:         * Update various transfer-pointers/lengths
                   1494:         */
                   1495:        bytes_done = reqp->dm_cur->dm_count - bytes_left;
                   1496:
                   1497:        if ((reqp->dr_flag & DRIVER_BOUNCING) && (PH_IN(reqp->phase))) {
                   1498:                /*
                   1499:                 * Copy the bytes read until now from the bounce buffer
                   1500:                 * to the 'real' destination. Flush the data-cache
                   1501:                 * before copying.
                   1502:                 */
                   1503:                PCIA();
                   1504:                bcopy(reqp->bouncerp, reqp->xdata_ptr, bytes_done);
                   1505:                reqp->bouncerp += bytes_done;
                   1506:        }
                   1507:
                   1508:        reqp->xdata_ptr  = &reqp->xdata_ptr[bytes_done];        /* XXX */
                   1509:        reqp->xdata_len -= bytes_done;                          /* XXX */
                   1510:        if ((reqp->dm_cur->dm_count -= bytes_done) == 0)
                   1511:                reqp->dm_cur++;
                   1512:        else reqp->dm_cur->dm_addr += bytes_done;
                   1513:
                   1514:        if (PH_IN(reqp->phase) && (dmstat & SC_PAR_ERR)) {
                   1515:                if (!(ncr5380_no_parchk & (1 << reqp->targ_id))) {
                   1516:                        ncr_tprint(reqp, "parity error in data-phase\n");
                   1517:                        reqp->xs->error = XS_TIMEOUT;
                   1518:                }
                   1519:        }
                   1520:
                   1521:        /*
                   1522:         * DMA mode should always be reset even when we will continue with the
                   1523:         * next chain. It is also essential to clear the MON_BUSY because
                   1524:         * when LOST_BUSY is unexpectedly set, we will not be able to drive
                   1525:         * the bus....
                   1526:         */
                   1527:        SET_5380_REG(NCR5380_MODE, IMODE_BASE);
                   1528:
                   1529:
                   1530:        if ((dmstat & SC_BSY_ERR) || !(dmstat & SC_PHS_MTCH)
                   1531:                 || (reqp->dm_cur > reqp->dm_last) || (reqp->xs->error)) {
                   1532:
                   1533:                /*
                   1534:                 * Tell interrupt functions DMA mode has ended.
                   1535:                 */
                   1536:                reqp->dr_flag &= ~DRIVER_IN_DMA;
                   1537:
                   1538:                /*
                   1539:                 * Clear mode and icom
                   1540:                 */
                   1541:                SET_5380_REG(NCR5380_MODE, IMODE_BASE);
                   1542:                SET_5380_REG(NCR5380_ICOM, 0);
                   1543:
                   1544:                if (dmstat & SC_BSY_ERR) {
                   1545:                        if (!reqp->xs->error)
                   1546:                                reqp->xs->error = XS_TIMEOUT;
                   1547:                        finish_req(reqp);
                   1548:                        PID("dma_ready1");
                   1549:                        return (1);
                   1550:                }
                   1551:
                   1552:                if (reqp->xs->error != 0) {
                   1553: ncr_tprint(reqp, "dma-ready: code = %d\n", reqp->xs->error); /* LWP */
                   1554:                        reqp->msgout = MSG_ABORT;
                   1555:                        SET_5380_REG(NCR5380_ICOM, SC_A_ATN);
                   1556:                }
                   1557:                PID("dma_ready2");
                   1558:                return (1);
                   1559:        }
                   1560:        return (0);
                   1561: }
                   1562: #endif /* REAL_DMA */
                   1563:
                   1564: static int
                   1565: check_autosense(reqp, linked)
                   1566: SC_REQ *reqp;
                   1567: int    linked;
                   1568: {
                   1569:        int     sps;
                   1570:
                   1571:        /*
                   1572:         * If we not executing an auto-sense and the status code
                   1573:         * is request-sense, we automatically issue a request
                   1574:         * sense command.
                   1575:         */
                   1576:        PID("cautos1");
                   1577:        if (!(reqp->dr_flag & DRIVER_AUTOSEN)) {
                   1578:                switch (reqp->status & SCSMASK) {
                   1579:                    case SCSCHKC:
                   1580:                        bcopy(sense_cmd, &reqp->xcmd, sizeof(sense_cmd));
                   1581:                        reqp->xdata_ptr = (u_char *)&reqp->xs->sense;
                   1582:                        reqp->xdata_len = sizeof(reqp->xs->sense);
                   1583:                        reqp->dr_flag  |= DRIVER_AUTOSEN;
                   1584:                        reqp->dr_flag  &= ~DRIVER_DMAOK;
                   1585:                        if (!linked) {
                   1586:                                sps = splbio();
                   1587:                                reqp->next = issue_q;
                   1588:                                issue_q    = reqp;
                   1589:                                splx(sps);
                   1590:                        }
                   1591:                        else reqp->xcmd.bytes[sizeof(sense_cmd)-2] |= 1;
                   1592:
                   1593: #ifdef DBG_REQ
                   1594:                        bzero(reqp->xdata_ptr, reqp->xdata_len);
                   1595:                        if (dbg_target_mask & (1 << reqp->targ_id))
                   1596:                                show_request(reqp, "AUTO-SENSE");
                   1597: #endif
                   1598:                        PID("cautos2");
                   1599:                        return (-1);
                   1600:                    case SCSBUSY:
                   1601:                        reqp->xs->error = XS_BUSY;
                   1602:                        return (0);
                   1603:                }
                   1604:        }
                   1605:        else {
                   1606:                /*
                   1607:                 * An auto-sense has finished
                   1608:                 */
                   1609:                if ((reqp->status & SCSMASK) != SCSGOOD)
                   1610:                        reqp->xs->error = XS_DRIVER_STUFFUP; /* SC_E_AUTOSEN; */
                   1611:                else reqp->xs->error = XS_SENSE;
                   1612:                reqp->status = SCSCHKC;
                   1613:        }
                   1614:        PID("cautos3");
                   1615:        return (0);
                   1616: }
                   1617:
                   1618: static int
                   1619: reach_msg_out(sc, len)
                   1620: struct ncr_softc *sc;
                   1621: u_long          len;
                   1622: {
                   1623:        u_char  phase;
                   1624:        u_char  data;
                   1625:        u_long  n = len;
                   1626:
                   1627:        ncr_aprint(sc, "Trying to reach Message-out phase\n");
                   1628:        if ((phase = GET_5380_REG(NCR5380_IDSTAT)) & SC_S_REQ)
                   1629:                phase = (phase >> 2) & 7;
                   1630:        else return (-1);
                   1631:        ncr_aprint(sc, "Trying to reach Message-out phase, now: %d\n", phase);
                   1632:        if (phase == PH_MSGOUT)
                   1633:                return (0);
                   1634:
                   1635:        SET_5380_REG(NCR5380_TCOM, phase);
                   1636:
                   1637:        do {
                   1638:                if (!wait_req_true())
                   1639:                        break;
                   1640:                if (((GET_5380_REG(NCR5380_IDSTAT) >> 2) & 7) != phase)
                   1641:                        break;
                   1642:                if (PH_IN(phase)) {
                   1643:                        data = GET_5380_REG(NCR5380_DATA);
                   1644:                        SET_5380_REG(NCR5380_ICOM, SC_A_ACK | SC_A_ATN);
                   1645:                }
                   1646:                else {
                   1647:                        SET_5380_REG(NCR5380_DATA, 0);
                   1648:                        SET_5380_REG(NCR5380_ICOM, SC_ADTB|SC_A_ACK|SC_A_ATN);
                   1649:                }
                   1650:                if (!wait_req_false())
                   1651:                        break;
                   1652:                SET_5380_REG(NCR5380_ICOM, SC_A_ATN);
                   1653:        } while (--n);
                   1654:
                   1655:        if ((phase = GET_5380_REG(NCR5380_IDSTAT)) & SC_S_REQ) {
                   1656:                phase = (phase >> 2) & 7;
                   1657:                if (phase == PH_MSGOUT) {
                   1658:                        ncr_aprint(sc, "Message-out phase reached after "
                   1659:                                        "%ld bytes.\n", len - n);
                   1660:                        return (0);
                   1661:                }
                   1662:        }
                   1663:        return (-1);
                   1664: }
                   1665:
                   1666: void
                   1667: scsi_reset()
                   1668: {
                   1669:        SC_REQ  *tmp, *next;
                   1670:        int     sps;
                   1671:
                   1672:        PID("scsi_reset1");
                   1673:        sps = splbio();
                   1674:        SET_5380_REG(NCR5380_ICOM, SC_A_RST);
                   1675:        delay(100);
                   1676:        SET_5380_REG(NCR5380_ICOM, 0);
                   1677:        scsi_clr_ipend();
                   1678:
                   1679:        /*
                   1680:         * None of the jobs in the discon_q will ever be reconnected,
                   1681:         * notify this to the higher level code.
                   1682:         */
                   1683:        for (tmp = discon_q; tmp ;) {
                   1684:                next = tmp->next;
                   1685:                tmp->next = NULL;
                   1686:                tmp->xs->error = XS_TIMEOUT;
                   1687:                busy &= ~(1 << tmp->targ_id);
                   1688:                finish_req(tmp);
                   1689:                tmp = next;
                   1690:        }
                   1691:        discon_q = NULL;
                   1692:
                   1693:        /*
                   1694:         * The current job will never finish either.
                   1695:         * The problem is that we can't finish the job because an instance
                   1696:         * of main is running on it. Our best guess is that the job is currently
                   1697:         * doing REAL-DMA. In that case 'dma_ready()' should correctly finish
                   1698:         * the job because it detects BSY-loss.
                   1699:         */
                   1700:        if ((tmp = connected) != NULL) {
                   1701:                if (tmp->dr_flag & DRIVER_IN_DMA) {
                   1702:                        tmp->xs->error = XS_DRIVER_STUFFUP;
                   1703: #ifdef REAL_DMA
                   1704:                        dma_ready();
                   1705: #endif
                   1706:                }
                   1707:        }
                   1708:        splx(sps);
                   1709:        PID("scsi_reset2");
                   1710:
                   1711:        /*
                   1712:         * Give the attached devices some time to handle the reset. This
                   1713:         * value is arbitrary but should be relatively long.
                   1714:         */
                   1715:        delay(100000);
                   1716: }
                   1717:
                   1718: static void
                   1719: scsi_reset_verbose(sc, why)
                   1720: struct ncr_softc *sc;
                   1721: const char      *why;
                   1722: {
                   1723:        ncr_aprint(sc, "Resetting SCSI-bus (%s)\n", why);
                   1724:
                   1725:        scsi_reset();
                   1726: }
                   1727:
                   1728: /*
                   1729:  * Check validity of the IRQ set by the 5380. If the interrupt is valid,
                   1730:  * the appropriate action is carried out (reselection or DMA ready) and
                   1731:  * INTR_RESEL or INTR_DMA is returned. Otherwise a console notice is written
                   1732:  * and INTR_SPURIOUS is returned.
                   1733:  */
                   1734: static int
                   1735: check_intr(sc)
                   1736: struct ncr_softc *sc;
                   1737: {
                   1738:        SC_REQ  *reqp;
                   1739:
                   1740:        if ((GET_5380_REG(NCR5380_IDSTAT) & (SC_S_SEL|SC_S_IO))
                   1741:                                                        ==(SC_S_SEL|SC_S_IO))
                   1742:                return (INTR_RESEL);
                   1743:        else {
                   1744:                if ((reqp = connected) && (reqp->dr_flag & DRIVER_IN_DMA)){
                   1745:                        reqp->dr_flag &= ~DRIVER_IN_DMA;
                   1746:                        return (INTR_DMA);
                   1747:                }
                   1748:        }
                   1749:        scsi_clr_ipend();
                   1750:        printf("-->");
                   1751:        scsi_show();
                   1752:        ncr_aprint(sc, "Spurious interrupt.\n");
                   1753:        return (INTR_SPURIOUS);
                   1754: }
                   1755:
                   1756: #ifdef REAL_DMA
                   1757: /*
                   1758:  * Check if DMA can be used for this request. This function also builds
                   1759:  * the dma-chain.
                   1760:  */
                   1761: static int
                   1762: scsi_dmaok(reqp)
                   1763: SC_REQ *reqp;
                   1764: {
                   1765:        u_long                  phy_buf;
                   1766:        u_long                  phy_len;
                   1767:        void                    *req_addr;
                   1768:        u_long                  req_len;
                   1769:        struct dma_chain        *dm;
                   1770:
                   1771:        /*
                   1772:         * Initialize locals and requests' DMA-chain.
                   1773:         */
                   1774:        req_len        = reqp->xdata_len;
                   1775:        req_addr       = (void *)reqp->xdata_ptr;
                   1776:        dm             = reqp->dm_cur = reqp->dm_last = reqp->dm_chain;
                   1777:        dm->dm_count   = dm->dm_addr = 0;
                   1778:        reqp->dr_flag &= ~DRIVER_BOUNCING;
                   1779:
                   1780:        /*
                   1781:         * Do not accept zero length DMA.
                   1782:         */
                   1783:        if (req_len == 0)
                   1784:                return (0);
                   1785:
                   1786:        /*
                   1787:         * LWP: I think that this restriction is not strictly necessary.
                   1788:         */
                   1789:        if ((req_len & 0x1) || ((u_int)req_addr & 0x3))
                   1790:                return (0);
                   1791:
                   1792:        /*
                   1793:         * Build the DMA-chain.
                   1794:         */
                   1795:        dm->dm_addr = phy_buf = kvtop(req_addr);
                   1796:        while (req_len) {
                   1797:                if (req_len < (phy_len = NBPG - m68k_page_offset(req_addr)))
                   1798:                        phy_len = req_len;
                   1799:
                   1800:                req_addr     += phy_len;
                   1801:                req_len      -= phy_len;
                   1802:                dm->dm_count += phy_len;
                   1803:
                   1804:                if (req_len) {
                   1805:                        u_long  tmp = kvtop(req_addr);
                   1806:
                   1807:                        if ((phy_buf + phy_len) != tmp) {
                   1808:                            if (wrong_dma_range(reqp, dm)) {
                   1809:                                if (reqp->dr_flag & DRIVER_BOUNCING)
                   1810:                                        goto bounceit;
                   1811:                                return (0);
                   1812:                            }
                   1813:
                   1814:                            if (++dm >= &reqp->dm_chain[MAXDMAIO]) {
                   1815:                                ncr_tprint(reqp,"dmaok: DMA chain too long!\n");
                   1816:                                return (0);
                   1817:                            }
                   1818:                            dm->dm_count = 0;
                   1819:                            dm->dm_addr  = tmp;
                   1820:                        }
                   1821:                        phy_buf = tmp;
                   1822:                }
                   1823:        }
                   1824:         if (wrong_dma_range(reqp, dm)) {
                   1825:                if (reqp->dr_flag & DRIVER_BOUNCING)
                   1826:                        goto bounceit;
                   1827:                return (0);
                   1828:        }
                   1829:        reqp->dm_last = dm;
                   1830:        return (1);
                   1831:
                   1832: bounceit:
                   1833:        if ((reqp->bounceb = alloc_bounceb(reqp->xdata_len)) == NULL) {
                   1834:                /*
                   1835:                 * If we can't get a bounce buffer, forget DMA
                   1836:                 */
                   1837:                reqp->dr_flag &= ~DRIVER_BOUNCING;
                   1838:                return(0);
                   1839:        }
                   1840:        /*
                   1841:         * Initialize a single DMA-range containing the bounced request
                   1842:         */
                   1843:        dm = reqp->dm_cur = reqp->dm_last = reqp->dm_chain;
                   1844:        dm->dm_addr    = kvtop(reqp->bounceb);
                   1845:        dm->dm_count   = reqp->xdata_len;
                   1846:        reqp->bouncerp = reqp->bounceb;
                   1847:
                   1848:        return (1);
                   1849: }
                   1850: #endif /* REAL_DMA */
                   1851:
                   1852: static void
                   1853: run_main(sc)
                   1854: struct ncr_softc *sc;
                   1855: {
                   1856:        int     sps = splbio();
                   1857:
                   1858:        if (!main_running) {
                   1859:                /*
                   1860:                 * If shared resources are required, claim them
                   1861:                 * before entering 'scsi_main'. If we can't get them
                   1862:                 * now, assume 'run_main' will be called when the resource
                   1863:                 * becomes available.
                   1864:                 */
                   1865:                if (!claimed_dma()) {
                   1866:                        splx(sps);
                   1867:                        return;
                   1868:                }
                   1869:                main_running = 1;
                   1870:                splx(sps);
                   1871:                scsi_main(sc);
                   1872:        }
                   1873:        else splx(sps);
                   1874: }
                   1875:
                   1876: /*
                   1877:  * Prefix message with full target info.
                   1878:  */
                   1879: static void
                   1880: ncr_tprint(SC_REQ *reqp, char *fmt, ...)
                   1881: {
                   1882:        va_list ap;
                   1883:
                   1884:        sc_print_addr(reqp->xs->sc_link);
                   1885:        va_start(ap, fmt);
                   1886:        vprintf(fmt, ap);
                   1887:        va_end(ap);
                   1888: }
                   1889:
                   1890: /*
                   1891:  * Prefix message with adapter info.
                   1892:  */
                   1893: static void
                   1894: ncr_aprint(struct ncr_softc *sc, char *fmt, ...)
                   1895: {
                   1896:        va_list ap;
                   1897:
                   1898:        printf("%s: ", sc->sc_dev.dv_xname);
                   1899:        va_start(ap, fmt);
                   1900:        vprintf(fmt, ap);
                   1901:        va_end(ap);
                   1902: }
                   1903: /****************************************************************************
                   1904:  *             Start Debugging Functions                                   *
                   1905:  ****************************************************************************/
                   1906: static void
                   1907: show_data_sense(xs)
                   1908: struct scsi_xfer       *xs;
                   1909: {
                   1910:        u_char  *p1, *p2;
                   1911:        int     i;
                   1912:        int     sz;
                   1913:
                   1914:        p1 = (u_char *) xs->cmd;
                   1915:        p2 = (u_char *)&xs->sense;
                   1916:        if(*p2 == 0)
                   1917:                return; /* No(n)sense */
                   1918:        printf("cmd[%d,%d]: ", xs->cmdlen, sz = command_size(*p1));
                   1919:        for (i = 0; i < sz; i++)
                   1920:                printf("%x ", p1[i]);
                   1921:        printf("\nsense: ");
                   1922:        for (i = 0; i < sizeof(xs->sense); i++)
                   1923:                printf("%x ", p2[i]);
                   1924:        printf("\n");
                   1925: }
                   1926:
                   1927: static void
                   1928: show_request(reqp, qtxt)
                   1929: SC_REQ *reqp;
                   1930: char   *qtxt;
                   1931: {
                   1932:        printf("REQ-%s: %d %p[%ld] cmd[0]=%x S=%x M=%x R=%x resid=%d dr_flag=%x %s\n",
                   1933:                        qtxt, reqp->targ_id, reqp->xdata_ptr, reqp->xdata_len,
                   1934:                        reqp->xcmd.opcode, reqp->status, reqp->message,
                   1935:                        reqp->xs->error, reqp->xs->resid, reqp->dr_flag,
                   1936:                        reqp->link ? "L":"");
                   1937:        if (reqp->status == SCSCHKC)
                   1938:                show_data_sense(reqp->xs);
                   1939: }
                   1940:
                   1941: static char *sig_names[] = {
                   1942:        "PAR", "SEL", "I/O", "C/D", "MSG", "REQ", "BSY", "RST",
                   1943:        "ACK", "ATN", "LBSY", "PMATCH", "IRQ", "EPAR", "DREQ", "EDMA"
                   1944: };
                   1945:
                   1946: static void
                   1947: show_signals(dmstat, idstat)
                   1948: u_char dmstat, idstat;
                   1949: {
                   1950:        u_short tmp, mask;
                   1951:        int     j, need_pipe;
                   1952:
                   1953:        tmp = idstat | ((dmstat & 3) << 8);
                   1954:        printf("Bus signals (%02x/%02x): ", idstat, dmstat & 3);
                   1955:        for (mask = 1, j = need_pipe = 0; mask <= tmp; mask <<= 1, j++) {
                   1956:                if (tmp & mask)
                   1957:                        printf("%s%s", need_pipe++ ? "|" : "", sig_names[j]);
                   1958:        }
                   1959:        printf("\nDma status (%02x): ", dmstat);
                   1960:        for (mask = 4, j = 10, need_pipe = 0; mask <= dmstat; mask <<= 1, j++) {
                   1961:                if (dmstat & mask)
                   1962:                        printf("%s%s", need_pipe++ ? "|" : "", sig_names[j]);
                   1963:        }
                   1964:        printf("\n");
                   1965: }
                   1966:
                   1967: void
                   1968: scsi_show()
                   1969: {
                   1970:        SC_REQ  *tmp;
                   1971:        int     sps = splhigh();
                   1972:        u_char  idstat, dmstat;
                   1973: #ifdef DBG_PID
                   1974:        int     i;
                   1975: #endif
                   1976:
                   1977:        printf("scsi_show: scsi_main is%s running\n",
                   1978:                main_running ? "" : " not");
                   1979:        for (tmp = issue_q; tmp; tmp = tmp->next)
                   1980:                show_request(tmp, "ISSUED");
                   1981:        for (tmp = discon_q; tmp; tmp = tmp->next)
                   1982:                show_request(tmp, "DISCONNECTED");
                   1983:        if (connected)
                   1984:                show_request(connected, "CONNECTED");
                   1985:        idstat = GET_5380_REG(NCR5380_IDSTAT);
                   1986:        dmstat = GET_5380_REG(NCR5380_DMSTAT);
                   1987:        show_signals(dmstat, idstat);
                   1988:        if (connected)
                   1989:                printf("phase = %d, ", connected->phase);
                   1990:        printf("busy:%x, spl:%04x\n", busy, sps);
                   1991: #ifdef DBG_PID
                   1992:        for (i=0; i<DBG_PID; i++)
                   1993:                printf("\t%d\t%s\n", i, last_hit[i]);
                   1994: #endif
                   1995:
                   1996:        splx(sps);
                   1997: }

CVSweb