root/dev/ic/adw.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. adw_enqueue
  2. adw_dequeue
  3. adw_alloc_controls
  4. adw_alloc_carriers
  5. adw_create_ccbs
  6. adw_free_ccb
  7. adw_reset_ccb
  8. adw_init_ccb
  9. adw_get_ccb
  10. adw_ccb_phys_kv
  11. adw_queue_ccb
  12. adw_init
  13. adw_attach
  14. adw_minphys
  15. adw_scsi_cmd
  16. adw_build_req
  17. adw_build_sglist
  18. adw_intr
  19. adw_poll
  20. adw_timeout
  21. adw_reset_bus
  22. adw_print_info
  23. adw_isr_callback
  24. adw_async_callback

    1 /*      $OpenBSD: adw.c,v 1.31 2006/11/28 23:59:45 dlg Exp $ */
    2 /* $NetBSD: adw.c,v 1.23 2000/05/27 18:24:50 dante Exp $         */
    3 
    4 /*
    5  * Generic driver for the Advanced Systems Inc. SCSI controllers
    6  *
    7  * Copyright (c) 1998, 1999, 2000 The NetBSD Foundation, Inc.
    8  * All rights reserved.
    9  *
   10  * Author: Baldassare Dante Profeta <dante@mclink.it>
   11  *
   12  * Redistribution and use in source and binary forms, with or without
   13  * modification, are permitted provided that the following conditions
   14  * are met:
   15  * 1. Redistributions of source code must retain the above copyright
   16  *    notice, this list of conditions and the following disclaimer.
   17  * 2. Redistributions in binary form must reproduce the above copyright
   18  *    notice, this list of conditions and the following disclaimer in the
   19  *    documentation and/or other materials provided with the distribution.
   20  * 3. All advertising materials mentioning features or use of this software
   21  *    must display the following acknowledgement:
   22  *        This product includes software developed by the NetBSD
   23  *        Foundation, Inc. and its contributors.
   24  * 4. Neither the name of The NetBSD Foundation nor the names of its
   25  *    contributors may be used to endorse or promote products derived
   26  *    from this software without specific prior written permission.
   27  *
   28  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
   29  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   30  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   31  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
   32  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   33  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   34  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   35  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   36  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   37  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   38  * POSSIBILITY OF SUCH DAMAGE.
   39  */
   40 
   41 #include <sys/types.h>
   42 #include <sys/param.h>
   43 #include <sys/systm.h>
   44 #include <sys/kernel.h>
   45 #include <sys/errno.h>
   46 #include <sys/ioctl.h>
   47 #include <sys/device.h>
   48 #include <sys/malloc.h>
   49 #include <sys/buf.h>
   50 #include <sys/proc.h>
   51 #include <sys/user.h>
   52 #include <sys/timeout.h>
   53 
   54 #include <machine/bus.h>
   55 #include <machine/intr.h>
   56 
   57 #include <scsi/scsi_all.h>
   58 #include <scsi/scsiconf.h>
   59 
   60 #include <dev/ic/adwlib.h>
   61 #include <dev/microcode/adw/adwmcode.h>
   62 #include <dev/ic/adw.h>
   63 
   64 #ifndef DDB
   65 #define Debugger()      panic("should call debugger here (adw.c)")
   66 #endif                          /* ! DDB */
   67 
   68 /******************************************************************************/
   69 
   70 
   71 void adw_enqueue(ADW_SOFTC *, struct scsi_xfer *, int);
   72 struct scsi_xfer *adw_dequeue(ADW_SOFTC *);
   73 
   74 int adw_alloc_controls(ADW_SOFTC *);
   75 int adw_alloc_carriers(ADW_SOFTC *);
   76 int adw_create_ccbs(ADW_SOFTC *, ADW_CCB *, int);
   77 void adw_free_ccb(ADW_SOFTC *, ADW_CCB *);
   78 void adw_reset_ccb(ADW_CCB *);
   79 int adw_init_ccb(ADW_SOFTC *, ADW_CCB *);
   80 ADW_CCB *adw_get_ccb(ADW_SOFTC *, int);
   81 int adw_queue_ccb(ADW_SOFTC *, ADW_CCB *, int);
   82 
   83 int adw_scsi_cmd(struct scsi_xfer *);
   84 int adw_build_req(struct scsi_xfer *, ADW_CCB *, int);
   85 void adw_build_sglist(ADW_CCB *, ADW_SCSI_REQ_Q *, ADW_SG_BLOCK *);
   86 void adw_minphys(struct buf *);
   87 void adw_isr_callback(ADW_SOFTC *, ADW_SCSI_REQ_Q *);
   88 void adw_async_callback(ADW_SOFTC *, u_int8_t);
   89 
   90 void adw_print_info(ADW_SOFTC *, int);
   91 
   92 int adw_poll(ADW_SOFTC *, struct scsi_xfer *, int);
   93 void adw_timeout(void *);
   94 void adw_reset_bus(ADW_SOFTC *);
   95 
   96 
   97 /******************************************************************************/
   98 
   99 
  100 struct cfdriver adw_cd = {
  101         NULL, "adw", DV_DULL
  102 };
  103 
  104 /* the below structure is so we have a default dev struct for our link struct */
  105 struct scsi_device adw_dev =
  106 {
  107         NULL,                   /* Use default error handler */
  108         NULL,                   /* have a queue, served by this */
  109         NULL,                   /* have no async handler */
  110         NULL,                   /* Use default 'done' routine */
  111 };
  112 
  113 
  114 /******************************************************************************/
  115 /* scsi_xfer queue routines                                                   */
  116 /******************************************************************************/
  117 
  118 /*
  119  * Insert a scsi_xfer into the software queue.  We overload xs->free_list
  120  * to avoid having to allocate additional resources (since we're used
  121  * only during resource shortages anyhow.
  122  */
  123 void
  124 adw_enqueue(sc, xs, infront)
  125         ADW_SOFTC      *sc;
  126         struct scsi_xfer *xs;
  127         int             infront;
  128 {
  129 
  130         if (infront || LIST_EMPTY(&sc->sc_queue)) {
  131                 if (LIST_EMPTY(&sc->sc_queue))
  132                         sc->sc_queuelast = xs;
  133                 LIST_INSERT_HEAD(&sc->sc_queue, xs, free_list);
  134                 return;
  135         }
  136         LIST_INSERT_AFTER(sc->sc_queuelast, xs, free_list);
  137         sc->sc_queuelast = xs;
  138 }
  139 
  140 
  141 /*
  142  * Pull a scsi_xfer off the front of the software queue.
  143  */
  144 struct scsi_xfer *
  145 adw_dequeue(sc)
  146         ADW_SOFTC      *sc;
  147 {
  148         struct scsi_xfer *xs;
  149 
  150         xs = LIST_FIRST(&sc->sc_queue);
  151         LIST_REMOVE(xs, free_list);
  152 
  153         if (LIST_EMPTY(&sc->sc_queue))
  154                 sc->sc_queuelast = NULL;
  155 
  156         return (xs);
  157 }
  158 
  159 /******************************************************************************/
  160 /*                       DMA Mapping for Control Blocks                       */
  161 /******************************************************************************/
  162 
  163 
  164 int
  165 adw_alloc_controls(sc)
  166         ADW_SOFTC      *sc;
  167 {
  168         bus_dma_segment_t seg;
  169         int             error, rseg;
  170 
  171         /*
  172          * Allocate the control structure.
  173          */
  174         if ((error = bus_dmamem_alloc(sc->sc_dmat, sizeof(struct adw_control),
  175                            NBPG, 0, &seg, 1, &rseg, BUS_DMA_NOWAIT)) != 0) {
  176                 printf("%s: unable to allocate control structures,"
  177                        " error = %d\n", sc->sc_dev.dv_xname, error);
  178                 return (error);
  179         }
  180         if ((error = bus_dmamem_map(sc->sc_dmat, &seg, rseg,
  181                    sizeof(struct adw_control), (caddr_t *) & sc->sc_control,
  182                                  BUS_DMA_NOWAIT | BUS_DMA_COHERENT)) != 0) {
  183                 printf("%s: unable to map control structures, error = %d\n",
  184                        sc->sc_dev.dv_xname, error);
  185                 return (error);
  186         }
  187 
  188         /*
  189          * Create and load the DMA map used for the control blocks.
  190          */
  191         if ((error = bus_dmamap_create(sc->sc_dmat, sizeof(struct adw_control),
  192                            1, sizeof(struct adw_control), 0, BUS_DMA_NOWAIT,
  193                                        &sc->sc_dmamap_control)) != 0) {
  194                 printf("%s: unable to create control DMA map, error = %d\n",
  195                        sc->sc_dev.dv_xname, error);
  196                 return (error);
  197         }
  198         if ((error = bus_dmamap_load(sc->sc_dmat, sc->sc_dmamap_control,
  199                            sc->sc_control, sizeof(struct adw_control), NULL,
  200                                      BUS_DMA_NOWAIT)) != 0) {
  201                 printf("%s: unable to load control DMA map, error = %d\n",
  202                        sc->sc_dev.dv_xname, error);
  203                 return (error);
  204         }
  205 
  206         return (0);
  207 }
  208 
  209 
  210 int
  211 adw_alloc_carriers(sc)
  212         ADW_SOFTC      *sc;
  213 {
  214         bus_dma_segment_t seg;
  215         int             error, rseg;
  216 
  217         /*
  218          * Allocate the control structure.
  219          */
  220         sc->sc_control->carriers = 
  221                 malloc(sizeof(ADW_CARRIER) * ADW_MAX_CARRIER, M_DEVBUF, 
  222                        M_NOWAIT);
  223         if (sc->sc_control->carriers == NULL)
  224                 return (ENOMEM);
  225 
  226 
  227         if ((error = bus_dmamem_alloc(sc->sc_dmat,
  228                         sizeof(ADW_CARRIER) * ADW_MAX_CARRIER,
  229                         0x10, 0, &seg, 1, &rseg, BUS_DMA_NOWAIT)) != 0) {
  230                 printf("%s: unable to allocate carrier structures,"
  231                        " error = %d\n", sc->sc_dev.dv_xname, error);
  232                 return (error);
  233         }
  234         if ((error = bus_dmamem_map(sc->sc_dmat, &seg, rseg,
  235                         sizeof(ADW_CARRIER) * ADW_MAX_CARRIER,
  236                         (caddr_t *) &sc->sc_control->carriers,
  237                         BUS_DMA_NOWAIT | BUS_DMA_COHERENT)) != 0) {
  238                 printf("%s: unable to map carrier structures,"
  239                         " error = %d\n", sc->sc_dev.dv_xname, error);
  240                 return (error);
  241         }
  242 
  243         /*
  244          * Create and load the DMA map used for the control blocks.
  245          */
  246         if ((error = bus_dmamap_create(sc->sc_dmat,
  247                         sizeof(ADW_CARRIER) * ADW_MAX_CARRIER, 1,
  248                         sizeof(ADW_CARRIER) * ADW_MAX_CARRIER, 0,BUS_DMA_NOWAIT,
  249                         &sc->sc_dmamap_carrier)) != 0) {
  250                 printf("%s: unable to create carriers DMA map,"
  251                         " error = %d\n", sc->sc_dev.dv_xname, error);
  252                 return (error);
  253         }
  254         if ((error = bus_dmamap_load(sc->sc_dmat,
  255                         sc->sc_dmamap_carrier, sc->sc_control->carriers,
  256                         sizeof(ADW_CARRIER) * ADW_MAX_CARRIER, NULL,
  257                         BUS_DMA_NOWAIT)) != 0) {
  258                 printf("%s: unable to load carriers DMA map,"
  259                         " error = %d\n", sc->sc_dev.dv_xname, error);
  260                 return (error);
  261         }
  262 
  263         return (0);
  264 }
  265 
  266 
  267 /******************************************************************************/
  268 /*                           Control Blocks routines                          */
  269 /******************************************************************************/
  270 
  271 
  272 /*
  273  * Create a set of ccbs and add them to the free list.  Called once
  274  * by adw_init().  We return the number of CCBs successfully created.
  275  */
  276 int
  277 adw_create_ccbs(sc, ccbstore, count)
  278         ADW_SOFTC      *sc;
  279         ADW_CCB        *ccbstore;
  280         int             count;
  281 {
  282         ADW_CCB        *ccb;
  283         int             i, error;
  284 
  285         for (i = 0; i < count; i++) {
  286                 ccb = &ccbstore[i];
  287                 if ((error = adw_init_ccb(sc, ccb)) != 0) {
  288                         printf("%s: unable to initialize ccb, error = %d\n",
  289                                sc->sc_dev.dv_xname, error);
  290                         return (i);
  291                 }
  292                 TAILQ_INSERT_TAIL(&sc->sc_free_ccb, ccb, chain);
  293         }
  294 
  295         return (i);
  296 }
  297 
  298 
  299 /*
  300  * A ccb is put onto the free list.
  301  */
  302 void
  303 adw_free_ccb(sc, ccb)
  304         ADW_SOFTC      *sc;
  305         ADW_CCB        *ccb;
  306 {
  307         int             s;
  308 
  309         s = splbio();
  310 
  311         adw_reset_ccb(ccb);
  312         TAILQ_INSERT_HEAD(&sc->sc_free_ccb, ccb, chain);
  313 
  314         /*
  315          * If there were none, wake anybody waiting for one to come free,
  316          * starting with queued entries.
  317          */
  318         if (TAILQ_NEXT(ccb, chain) == NULL)
  319                 wakeup(&sc->sc_free_ccb);
  320 
  321         splx(s);
  322 }
  323 
  324 
  325 void
  326 adw_reset_ccb(ccb)
  327         ADW_CCB        *ccb;
  328 {
  329 
  330         ccb->flags = 0;
  331 }
  332 
  333 
  334 int
  335 adw_init_ccb(sc, ccb)
  336         ADW_SOFTC      *sc;
  337         ADW_CCB        *ccb;
  338 {
  339         int     hashnum, error;
  340 
  341         /*
  342          * Create the DMA map for this CCB.
  343          */
  344         error = bus_dmamap_create(sc->sc_dmat,
  345                                   (ADW_MAX_SG_LIST - 1) * PAGE_SIZE,
  346                          ADW_MAX_SG_LIST, (ADW_MAX_SG_LIST - 1) * PAGE_SIZE,
  347                    0, BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &ccb->dmamap_xfer);
  348         if (error) {
  349                 printf("%s: unable to create CCB DMA map, error = %d\n",
  350                        sc->sc_dev.dv_xname, error);
  351                 return (error);
  352         }
  353 
  354         /*
  355          * put in the phystokv hash table
  356          * Never gets taken out.
  357          */
  358         ccb->hashkey = sc->sc_dmamap_control->dm_segs[0].ds_addr +
  359             ADW_CCB_OFF(ccb);
  360         hashnum = CCB_HASH(ccb->hashkey);
  361         ccb->nexthash = sc->sc_ccbhash[hashnum];
  362         sc->sc_ccbhash[hashnum] = ccb;
  363         adw_reset_ccb(ccb);
  364         return (0);
  365 }
  366 
  367 
  368 /*
  369  * Get a free ccb
  370  *
  371  * If there are none, see if we can allocate a new one
  372  */
  373 ADW_CCB *
  374 adw_get_ccb(sc, flags)
  375         ADW_SOFTC      *sc;
  376         int             flags;
  377 {
  378         ADW_CCB        *ccb = 0;
  379         int             s;
  380 
  381         s = splbio();
  382 
  383         /*
  384          * If we can and have to, sleep waiting for one to come free
  385          * but only if we can't allocate a new one.
  386          */
  387         for (;;) {
  388                 ccb = TAILQ_FIRST(&sc->sc_free_ccb);
  389                 if (ccb) {
  390                         TAILQ_REMOVE(&sc->sc_free_ccb, ccb, chain);
  391                         break;
  392                 }
  393                 if ((flags & SCSI_NOSLEEP) != 0)
  394                         goto out;
  395 
  396                 tsleep(&sc->sc_free_ccb, PRIBIO, "adwccb", 0);
  397         }
  398 
  399         ccb->flags |= CCB_ALLOC;
  400 
  401 out:
  402         splx(s);
  403         return (ccb);
  404 }
  405 
  406 
  407 /*
  408  * Given a physical address, find the ccb that it corresponds to.
  409  */
  410 ADW_CCB *
  411 adw_ccb_phys_kv(sc, ccb_phys)
  412         ADW_SOFTC       *sc;
  413         u_int32_t       ccb_phys;
  414 {
  415         int hashnum = CCB_HASH(ccb_phys);
  416         ADW_CCB *ccb = sc->sc_ccbhash[hashnum];
  417 
  418         while (ccb) {
  419                 if (ccb->hashkey == ccb_phys)
  420                         break;
  421                 ccb = ccb->nexthash;
  422         }
  423         return (ccb);
  424 }
  425 
  426 
  427 /*
  428  * Queue a CCB to be sent to the controller, and send it if possible.
  429  */
  430 int
  431 adw_queue_ccb(sc, ccb, retry)
  432         ADW_SOFTC      *sc;
  433         ADW_CCB        *ccb;
  434         int             retry;
  435 {
  436         int             errcode = ADW_SUCCESS;
  437 
  438         if(!retry) {
  439                 TAILQ_INSERT_TAIL(&sc->sc_waiting_ccb, ccb, chain);
  440         }
  441 
  442         while ((ccb = TAILQ_FIRST(&sc->sc_waiting_ccb)) != NULL) {
  443 
  444                 errcode = AdwExeScsiQueue(sc, &ccb->scsiq);
  445                 switch(errcode) {
  446                 case ADW_SUCCESS:
  447                         break;
  448 
  449                 case ADW_BUSY:
  450                         printf("ADW_BUSY\n");
  451                         return(ADW_BUSY);
  452 
  453                 case ADW_ERROR:
  454                         printf("ADW_ERROR\n");
  455                         TAILQ_REMOVE(&sc->sc_waiting_ccb, ccb, chain);
  456                         return(ADW_ERROR);
  457                 }
  458 
  459                 TAILQ_REMOVE(&sc->sc_waiting_ccb, ccb, chain);
  460                 TAILQ_INSERT_TAIL(&sc->sc_pending_ccb, ccb, chain);
  461 
  462                 /* ALWAYS initialize stimeout, lest it contain garbage! */
  463                 timeout_set(&ccb->xs->stimeout, adw_timeout, ccb);
  464                 if ((ccb->xs->flags & SCSI_POLL) == 0)
  465                         timeout_add(&ccb->xs->stimeout, (ccb->timeout * hz) / 1000);
  466         }
  467 
  468         return(errcode);
  469 }
  470 
  471 
  472 /******************************************************************************/
  473 /*                       SCSI layer interfacing routines                      */
  474 /******************************************************************************/
  475 
  476 
  477 int
  478 adw_init(sc)
  479         ADW_SOFTC      *sc;
  480 {
  481         u_int16_t       warn_code;
  482 
  483 
  484         sc->cfg.lib_version = (ADW_LIB_VERSION_MAJOR << 8) |
  485                 ADW_LIB_VERSION_MINOR;
  486         sc->cfg.chip_version =
  487                 ADW_GET_CHIP_VERSION(sc->sc_iot, sc->sc_ioh, sc->bus_type);
  488 
  489         /*
  490          * Reset the chip to start and allow register writes.
  491          */
  492         if (ADW_FIND_SIGNATURE(sc->sc_iot, sc->sc_ioh) == 0) {
  493                 panic("adw_init: adw_find_signature failed");
  494         } else {
  495                 AdwResetChip(sc->sc_iot, sc->sc_ioh);
  496 
  497                 warn_code = AdwInitFromEEPROM(sc);
  498 
  499                 if (warn_code & ADW_WARN_EEPROM_CHKSUM)
  500                         printf("%s: Bad checksum found. "
  501                                "Setting default values\n",
  502                                sc->sc_dev.dv_xname);
  503                 if (warn_code & ADW_WARN_EEPROM_TERMINATION)
  504                         printf("%s: Bad bus termination setting."
  505                                "Using automatic termination.\n",
  506                                sc->sc_dev.dv_xname);
  507         }
  508 
  509         sc->isr_callback = (ADW_CALLBACK) adw_isr_callback;
  510         sc->async_callback = (ADW_CALLBACK) adw_async_callback;
  511 
  512         return 0;
  513 }
  514 
  515 
  516 void
  517 adw_attach(sc)
  518         ADW_SOFTC      *sc;
  519 {
  520         struct scsibus_attach_args      saa;
  521         int                             i, error;
  522 
  523 
  524         TAILQ_INIT(&sc->sc_free_ccb);
  525         TAILQ_INIT(&sc->sc_waiting_ccb);
  526         TAILQ_INIT(&sc->sc_pending_ccb);
  527         LIST_INIT(&sc->sc_queue);
  528 
  529 
  530         /*
  531          * Allocate the Control Blocks.
  532          */
  533         error = adw_alloc_controls(sc);
  534         if (error)
  535                 return; /* (error) */ ;
  536 
  537         bzero(sc->sc_control, sizeof(struct adw_control));
  538 
  539         /*
  540          * Create and initialize the Control Blocks.
  541          */
  542         i = adw_create_ccbs(sc, sc->sc_control->ccbs, ADW_MAX_CCB);
  543         if (i == 0) {
  544                 printf("%s: unable to create Control Blocks\n",
  545                        sc->sc_dev.dv_xname);
  546                 return; /* (ENOMEM) */ ;
  547         } else if (i != ADW_MAX_CCB) {
  548                 printf("%s: WARNING: only %d of %d Control Blocks"
  549                        " created\n",
  550                        sc->sc_dev.dv_xname, i, ADW_MAX_CCB);
  551         }
  552 
  553         /*
  554          * Create and initialize the Carriers.
  555          */
  556         error = adw_alloc_carriers(sc);
  557         if (error)
  558                 return; /* (error) */ ;
  559 
  560         /*
  561          * Zero's the freeze_device status
  562          */
  563          bzero(sc->sc_freeze_dev, sizeof(sc->sc_freeze_dev));
  564 
  565         /*
  566          * Initialize the adapter
  567          */
  568         switch (AdwInitDriver(sc)) {
  569         case ADW_IERR_BIST_PRE_TEST:
  570                 panic("%s: BIST pre-test error",
  571                       sc->sc_dev.dv_xname);
  572                 break;
  573 
  574         case ADW_IERR_BIST_RAM_TEST:
  575                 panic("%s: BIST RAM test error",
  576                       sc->sc_dev.dv_xname);
  577                 break;
  578 
  579         case ADW_IERR_MCODE_CHKSUM:
  580                 panic("%s: Microcode checksum error",
  581                       sc->sc_dev.dv_xname);
  582                 break;
  583 
  584         case ADW_IERR_ILLEGAL_CONNECTION:
  585                 panic("%s: All three connectors are in use",
  586                       sc->sc_dev.dv_xname);
  587                 break;
  588 
  589         case ADW_IERR_REVERSED_CABLE:
  590                 panic("%s: Cable is reversed",
  591                       sc->sc_dev.dv_xname);
  592                 break;
  593 
  594         case ADW_IERR_HVD_DEVICE:
  595                 panic("%s: HVD attached to LVD connector",
  596                       sc->sc_dev.dv_xname);
  597                 break;
  598 
  599         case ADW_IERR_SINGLE_END_DEVICE:
  600                 panic("%s: single-ended device is attached to"
  601                       " one of the connectors",
  602                       sc->sc_dev.dv_xname);
  603                 break;
  604 
  605         case ADW_IERR_NO_CARRIER:
  606                 panic("%s: unable to create Carriers",
  607                       sc->sc_dev.dv_xname);
  608                 break;
  609 
  610         case ADW_WARN_BUSRESET_ERROR:
  611                 printf("%s: WARNING: Bus Reset Error\n",
  612                       sc->sc_dev.dv_xname);
  613                 break;
  614         }
  615 
  616         /*
  617          * Fill in the adapter.
  618          */
  619         sc->sc_adapter.scsi_cmd = adw_scsi_cmd;
  620         sc->sc_adapter.scsi_minphys = adw_minphys;
  621 
  622         /*
  623          * fill in the prototype scsi_link.
  624          */
  625         sc->sc_link.adapter_softc = sc;
  626         sc->sc_link.adapter_target = sc->chip_scsi_id;
  627         sc->sc_link.adapter = &sc->sc_adapter;
  628         sc->sc_link.device = &adw_dev;
  629         sc->sc_link.openings = 4;
  630         sc->sc_link.adapter_buswidth = ADW_MAX_TID+1;
  631 
  632         bzero(&saa, sizeof(saa));
  633         saa.saa_sc_link = &sc->sc_link;
  634 
  635         config_found(&sc->sc_dev, &saa, scsiprint);
  636 }
  637 
  638 
  639 void
  640 adw_minphys(bp)
  641         struct buf     *bp;
  642 {
  643 
  644         if (bp->b_bcount > ((ADW_MAX_SG_LIST - 1) * PAGE_SIZE))
  645                 bp->b_bcount = ((ADW_MAX_SG_LIST - 1) * PAGE_SIZE);
  646         minphys(bp);
  647 }
  648 
  649 
  650 /*
  651  * start a scsi operation given the command and the data address.
  652  * Also needs the unit, target and lu.
  653  */
  654 int
  655 adw_scsi_cmd(xs)
  656         struct scsi_xfer *xs;
  657 {
  658         struct scsi_link *sc_link = xs->sc_link;
  659         ADW_SOFTC      *sc = sc_link->adapter_softc;
  660         ADW_CCB        *ccb;
  661         int             s, fromqueue = 1, dontqueue = 0, nowait = 0, retry = 0;
  662         int             flags;
  663 
  664         s = splbio();           /* protect the queue */
  665 
  666         /*
  667          * If we're running the queue from adw_done(), we've been
  668          * called with the first queue entry as our argument.
  669          */
  670         if (xs == LIST_FIRST(&sc->sc_queue)) {
  671                 if(sc->sc_freeze_dev[xs->sc_link->target]) {
  672                         splx(s);
  673                         return (TRY_AGAIN_LATER);
  674                 }
  675                 xs = adw_dequeue(sc);
  676                 fromqueue = 1;
  677                 nowait = 1;
  678         } else {
  679                 if(sc->sc_freeze_dev[xs->sc_link->target]) {
  680                         splx(s);
  681                         return (TRY_AGAIN_LATER);
  682                 }
  683 
  684                 /* Polled requests can't be queued for later. */
  685                 dontqueue = xs->flags & SCSI_POLL;
  686 
  687                 /*
  688                  * If there are jobs in the queue, run them first.
  689                  */
  690                 if (!LIST_EMPTY(&sc->sc_queue)) {
  691                         /*
  692                          * If we can't queue, we have to abort, since
  693                          * we have to preserve order.
  694                          */
  695                         if (dontqueue) {
  696                                 splx(s);
  697                                 return (TRY_AGAIN_LATER);
  698                         }
  699                         /*
  700                          * Swap with the first queue entry.
  701                          */
  702                         adw_enqueue(sc, xs, 0);
  703                         xs = adw_dequeue(sc);
  704                         fromqueue = 1;
  705                 }
  706         }
  707 
  708 
  709         /*
  710          * get a ccb to use. If the transfer
  711          * is from a buf (possibly from interrupt time)
  712          * then we can't allow it to sleep
  713          */
  714 
  715         flags = xs->flags;
  716         if (nowait)
  717                 flags |= SCSI_NOSLEEP;
  718         if ((ccb = adw_get_ccb(sc, flags)) == NULL) {
  719                 /*
  720                  * If we can't queue, we lose.
  721                  */
  722                 if (dontqueue) {
  723                         splx(s);
  724                         return (TRY_AGAIN_LATER);
  725                 }
  726                 /*
  727                  * Stuff ourselves into the queue, in front
  728                  * if we came off in the first place.
  729                  */
  730                 adw_enqueue(sc, xs, fromqueue);
  731                 splx(s);
  732                 return (SUCCESSFULLY_QUEUED);
  733         }
  734         splx(s);                /* done playing with the queue */
  735 
  736         ccb->xs = xs;
  737         ccb->timeout = xs->timeout;
  738 
  739         if (adw_build_req(xs, ccb, flags)) {
  740 retryagain:
  741                 s = splbio();
  742                 retry = adw_queue_ccb(sc, ccb, retry);
  743                 splx(s);
  744 
  745                 switch(retry) {
  746                 case ADW_BUSY:
  747                         goto retryagain;
  748 
  749                 case ADW_ERROR:
  750                         xs->error = XS_DRIVER_STUFFUP;
  751                         return (COMPLETE);
  752                 }
  753 
  754                 /*
  755                  * Usually return SUCCESSFULLY QUEUED
  756                  */
  757                 if ((xs->flags & SCSI_POLL) == 0)
  758                         return (SUCCESSFULLY_QUEUED);
  759 
  760                 /*
  761                  * If we can't use interrupts, poll on completion
  762                  */
  763                 if (adw_poll(sc, xs, ccb->timeout)) {
  764                         adw_timeout(ccb);
  765                         if (adw_poll(sc, xs, ccb->timeout))
  766                                 adw_timeout(ccb);
  767                 }
  768         }
  769         return (COMPLETE);
  770 }
  771 
  772 
  773 /*
  774  * Build a request structure for the Wide Boards.
  775  */
  776 int
  777 adw_build_req(xs, ccb, flags)
  778         struct scsi_xfer *xs;
  779         ADW_CCB        *ccb;
  780         int             flags;
  781 {
  782         struct scsi_link *sc_link = xs->sc_link;
  783         ADW_SOFTC      *sc = sc_link->adapter_softc;
  784         bus_dma_tag_t   dmat = sc->sc_dmat;
  785         ADW_SCSI_REQ_Q *scsiqp;
  786         int             error;
  787 
  788         scsiqp = &ccb->scsiq;
  789         bzero(scsiqp, sizeof(ADW_SCSI_REQ_Q));
  790 
  791         /*
  792          * Set the ADW_SCSI_REQ_Q 'ccb_ptr' to point to the
  793          * physical CCB structure.
  794          */
  795         scsiqp->ccb_ptr = ccb->hashkey;
  796 
  797         /*
  798          * Build the ADW_SCSI_REQ_Q request.
  799          */
  800 
  801         /*
  802          * Set CDB length and copy it to the request structure.
  803          * For wide  boards a CDB length maximum of 16 bytes
  804          * is supported.
  805          */
  806         bcopy(xs->cmd, &scsiqp->cdb, ((scsiqp->cdb_len = xs->cmdlen) <= 12)?
  807                         xs->cmdlen : 12 );
  808         if(xs->cmdlen > 12)
  809                 bcopy(&(xs->cmd[12]),  &scsiqp->cdb16, xs->cmdlen - 12);
  810 
  811         scsiqp->target_id = sc_link->target;
  812         scsiqp->target_lun = sc_link->lun;
  813 
  814         scsiqp->vsense_addr = &ccb->scsi_sense;
  815         scsiqp->sense_addr = sc->sc_dmamap_control->dm_segs[0].ds_addr +
  816                         ADW_CCB_OFF(ccb) + offsetof(struct adw_ccb, scsi_sense);
  817         scsiqp->sense_len = sizeof(struct scsi_sense_data);
  818 
  819         /*
  820          * Build ADW_SCSI_REQ_Q for a scatter-gather buffer command.
  821          */
  822         if (xs->datalen) {
  823                 /*
  824                  * Map the DMA transfer.
  825                  */
  826 #ifdef TFS
  827                 if (xs->flags & SCSI_DATA_UIO) {
  828                         error = bus_dmamap_load_uio(dmat,
  829                                 ccb->dmamap_xfer, (struct uio *) xs->data,
  830                                 (flags & SCSI_NOSLEEP) ?
  831                                 BUS_DMA_NOWAIT : BUS_DMA_WAITOK);
  832                 } else
  833 #endif          /* TFS */
  834                 {
  835                         error = bus_dmamap_load(dmat,
  836                               ccb->dmamap_xfer, xs->data, xs->datalen, NULL,
  837                                 (flags & SCSI_NOSLEEP) ?
  838                                 BUS_DMA_NOWAIT : BUS_DMA_WAITOK);
  839                 }
  840 
  841                 if (error) {
  842                         if (error == EFBIG) {
  843                                 printf("%s: adw_scsi_cmd, more than %d dma"
  844                                        " segments\n",
  845                                        sc->sc_dev.dv_xname, ADW_MAX_SG_LIST);
  846                         } else {
  847                                 printf("%s: adw_scsi_cmd, error %d loading"
  848                                        " dma map\n",
  849                                        sc->sc_dev.dv_xname, error);
  850                         }
  851 
  852                         xs->error = XS_DRIVER_STUFFUP;
  853                         adw_free_ccb(sc, ccb);
  854                         return (0);
  855                 }
  856                 bus_dmamap_sync(dmat, ccb->dmamap_xfer,
  857                     0, ccb->dmamap_xfer->dm_mapsize,
  858                     (xs->flags & SCSI_DATA_IN) ?
  859                     BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE);
  860 
  861                 /*
  862                  * Build scatter-gather list.
  863                  */
  864                 scsiqp->data_cnt = xs->datalen;
  865                 scsiqp->vdata_addr = xs->data;
  866                 scsiqp->data_addr = ccb->dmamap_xfer->dm_segs[0].ds_addr;
  867                 bzero(ccb->sg_block, sizeof(ADW_SG_BLOCK) * ADW_NUM_SG_BLOCK);
  868                 adw_build_sglist(ccb, scsiqp, ccb->sg_block);
  869         } else {
  870                 /*
  871                  * No data xfer, use non S/G values.
  872                  */
  873                 scsiqp->data_cnt = 0;
  874                 scsiqp->vdata_addr = 0;
  875                 scsiqp->data_addr = 0;
  876         }
  877 
  878         return (1);
  879 }
  880 
  881 
  882 /*
  883  * Build scatter-gather list for Wide Boards.
  884  */
  885 void
  886 adw_build_sglist(ccb, scsiqp, sg_block)
  887         ADW_CCB        *ccb;
  888         ADW_SCSI_REQ_Q *scsiqp;
  889         ADW_SG_BLOCK   *sg_block;
  890 {
  891         u_long          sg_block_next_addr;     /* block and its next */
  892         u_int32_t       sg_block_physical_addr;
  893         int             i;      /* how many SG entries */
  894         bus_dma_segment_t *sg_list = &ccb->dmamap_xfer->dm_segs[0];
  895         int             sg_elem_cnt = ccb->dmamap_xfer->dm_nsegs;
  896 
  897 
  898         sg_block_next_addr = (u_long) sg_block; /* allow math operation */
  899         sg_block_physical_addr = ccb->hashkey +
  900             offsetof(struct adw_ccb, sg_block[0]);
  901         scsiqp->sg_real_addr = sg_block_physical_addr;
  902 
  903         /*
  904          * If there are more than NO_OF_SG_PER_BLOCK dma segments (hw sg-list)
  905          * then split the request into multiple sg-list blocks.
  906          */
  907 
  908         do {
  909                 for (i = 0; i < NO_OF_SG_PER_BLOCK; i++) {
  910                         sg_block->sg_list[i].sg_addr = sg_list->ds_addr;
  911                         sg_block->sg_list[i].sg_count = sg_list->ds_len;
  912 
  913                         if (--sg_elem_cnt == 0) {
  914                                 /* last entry, get out */
  915                                 sg_block->sg_cnt = i + 1;
  916                                 sg_block->sg_ptr = NULL; /* next link = NULL */
  917                                 return;
  918                         }
  919                         sg_list++;
  920                 }
  921                 sg_block_next_addr += sizeof(ADW_SG_BLOCK);
  922                 sg_block_physical_addr += sizeof(ADW_SG_BLOCK);
  923 
  924                 sg_block->sg_cnt = NO_OF_SG_PER_BLOCK;
  925                 sg_block->sg_ptr = sg_block_physical_addr;
  926                 sg_block = (ADW_SG_BLOCK *) sg_block_next_addr; /* virt. addr */
  927         } while (1);
  928 }
  929 
  930 
  931 /******************************************************************************/
  932 /*                       Interrupts and TimeOut routines                      */
  933 /******************************************************************************/
  934 
  935 
  936 int
  937 adw_intr(arg)
  938         void           *arg;
  939 {
  940         ADW_SOFTC      *sc = arg;
  941         struct scsi_xfer *xs;
  942 
  943 
  944         if(AdwISR(sc) != ADW_FALSE) {
  945                 /*
  946                  * If there are queue entries in the software queue, try to
  947                  * run the first one.  We should be more or less guaranteed
  948                  * to succeed, since we just freed a CCB.
  949                  *
  950                  * NOTE: adw_scsi_cmd() relies on our calling it with
  951                  * the first entry in the queue.
  952                  */
  953                 if ((xs = LIST_FIRST(&sc->sc_queue)) != NULL)
  954                         (void) adw_scsi_cmd(xs);
  955 
  956                 return (1);
  957         }
  958 
  959         return (0);
  960 }
  961 
  962 
  963 /*
  964  * Poll a particular unit, looking for a particular xs
  965  */
  966 int
  967 adw_poll(sc, xs, count)
  968         ADW_SOFTC      *sc;
  969         struct scsi_xfer *xs;
  970         int             count;
  971 {
  972 
  973         /* timeouts are in msec, so we loop in 1000 usec cycles */
  974         while (count > 0) {
  975                 adw_intr(sc);
  976                 if (xs->flags & ITSDONE) {
  977                         if ((xs->cmd->opcode == INQUIRY)
  978                             && (xs->sc_link->lun == 0)
  979                             && (xs->error == XS_NOERROR))
  980                                 adw_print_info(sc, xs->sc_link->target);
  981                         return (0);
  982                 }
  983                 delay(1000);    /* only happens in boot so ok */
  984                 count--;
  985         }
  986         return (1);
  987 }
  988 
  989 
  990 void
  991 adw_timeout(arg)
  992         void           *arg;
  993 {
  994         ADW_CCB        *ccb = arg;
  995         struct scsi_xfer *xs = ccb->xs;
  996         struct scsi_link *sc_link = xs->sc_link;
  997         ADW_SOFTC      *sc = sc_link->adapter_softc;
  998         int             s;
  999 
 1000         sc_print_addr(sc_link);
 1001         printf("timed out");
 1002 
 1003         s = splbio();
 1004 
 1005         if (ccb->flags & CCB_ABORTED) {
 1006         /*
 1007          * Abort Timed Out
 1008          *
 1009          * No more opportunities. Lets try resetting the bus and
 1010          * reinitialize the host adapter.
 1011          */
 1012                 timeout_del(&xs->stimeout);
 1013                 printf(" AGAIN. Resetting SCSI Bus\n");
 1014                 adw_reset_bus(sc);
 1015                 splx(s);
 1016                 return;
 1017         } else if (ccb->flags & CCB_ABORTING) {
 1018         /*
 1019          * Abort the operation that has timed out.
 1020          *
 1021          * Second opportunity.
 1022          */
 1023                 printf("\n");
 1024                 xs->error = XS_TIMEOUT;
 1025                 ccb->flags |= CCB_ABORTED;
 1026 #if 0
 1027                 /*
 1028                  * - XXX - 3.3a microcode is BROKEN!!!
 1029                  *
 1030                  * We cannot abort a CCB, so we can only hope the command
 1031                  * get completed before the next timeout, otherwise a
 1032                  * Bus Reset will arrive inexorably.
 1033                  */
 1034                 /*
 1035                  * ADW_ABORT_CCB() makes the board to generate an interrupt
 1036                  *
 1037                  * - XXX - The above assertion MUST be verified (and this
 1038                  *         code changed as well [callout_*()]), when the
 1039                  *         ADW_ABORT_CCB will be working again
 1040                  */
 1041                 ADW_ABORT_CCB(sc, ccb);
 1042 #endif
 1043                 /*
 1044                  * waiting for multishot callout_reset() let's restart it
 1045                  * by hand so the next time a timeout event will occur
 1046                  * we will reset the bus.
 1047                  */
 1048                 timeout_add(&xs->stimeout, (ccb->timeout * hz) / 1000);
 1049         } else {
 1050         /*
 1051          * Abort the operation that has timed out.
 1052          *
 1053          * First opportunity.
 1054          */
 1055                 printf("\n");
 1056                 xs->error = XS_TIMEOUT;
 1057                 ccb->flags |= CCB_ABORTING;
 1058 #if 0
 1059                 /*
 1060                  * - XXX - 3.3a microcode is BROKEN!!!
 1061                  *
 1062                  * We cannot abort a CCB, so we can only hope the command
 1063                  * get completed before the next 2 timeout, otherwise a
 1064                  * Bus Reset will arrive inexorably.
 1065                  */
 1066                 /*
 1067                  * ADW_ABORT_CCB() makes the board to generate an interrupt
 1068                  *
 1069                  * - XXX - The above assertion MUST be verified (and this
 1070                  *         code changed as well [callout_*()]), when the
 1071                  *         ADW_ABORT_CCB will be working again
 1072                  */
 1073                 ADW_ABORT_CCB(sc, ccb);
 1074 #endif
 1075                 /*
 1076                  * waiting for multishot callout_reset() let's restart it
 1077                  * by hand so to give a second opportunity to the command
 1078                  * which timed-out.
 1079                  */
 1080                 timeout_add(&xs->stimeout, (ccb->timeout * hz) / 1000);
 1081         }
 1082 
 1083         splx(s);
 1084 }
 1085 
 1086 
 1087 void
 1088 adw_reset_bus(sc) 
 1089         ADW_SOFTC               *sc;
 1090 {
 1091         ADW_CCB *ccb;
 1092         int      s;
 1093 
 1094         s = splbio();
 1095         AdwResetSCSIBus(sc); /* XXX - should check return value? */
 1096         while((ccb = TAILQ_LAST(&sc->sc_pending_ccb,
 1097                         adw_pending_ccb)) != NULL) {
 1098                 timeout_del(&ccb->xs->stimeout);
 1099                 TAILQ_REMOVE(&sc->sc_pending_ccb, ccb, chain);
 1100                 TAILQ_INSERT_HEAD(&sc->sc_waiting_ccb, ccb, chain);
 1101         }
 1102 
 1103         bzero(sc->sc_freeze_dev, sizeof(sc->sc_freeze_dev));
 1104         adw_queue_ccb(sc, TAILQ_FIRST(&sc->sc_waiting_ccb), 1);
 1105 
 1106         splx(s);
 1107 }
 1108 
 1109 
 1110 /******************************************************************************/
 1111 /*              Host Adapter and Peripherals Information Routines             */
 1112 /******************************************************************************/
 1113 
 1114 
 1115 void
 1116 adw_print_info(sc, tid)
 1117         ADW_SOFTC       *sc;
 1118         int              tid;
 1119 {
 1120         bus_space_handle_t ioh = sc->sc_ioh;
 1121         bus_space_tag_t iot = sc->sc_iot;
 1122         u_int16_t hshk_cfg, able_mask, period = 0;
 1123 
 1124         /* hshk/HSHK means 'handskake' */
 1125 
 1126         ADW_READ_WORD_LRAM(iot, ioh,
 1127             ADW_MC_DEVICE_HSHK_CFG_TABLE + (2 * tid), hshk_cfg);
 1128 
 1129         ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_WDTR_ABLE, able_mask);
 1130         if ((able_mask & ADW_TID_TO_TIDMASK(tid)) == 0)
 1131                 hshk_cfg &= ~HSHK_CFG_WIDE_XFR;
 1132 
 1133         ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_SDTR_ABLE, able_mask);
 1134         if ((able_mask & ADW_TID_TO_TIDMASK(tid)) == 0)
 1135                 hshk_cfg &= ~HSHK_CFG_OFFSET;
 1136 
 1137         printf("%s: target %d using %d bit ", sc->sc_dev.dv_xname, tid,
 1138             (hshk_cfg & HSHK_CFG_WIDE_XFR) ? 16 : 8);
 1139 
 1140         if ((hshk_cfg & HSHK_CFG_OFFSET) == 0)
 1141                 printf("async ");
 1142         else {
 1143                 period = (hshk_cfg & 0x1f00) >> 8;
 1144                 switch (period) {
 1145                 case 0x11: 
 1146                         printf("80.0 ");
 1147                         break;
 1148                 case 0x10:
 1149                         printf("40.0 ");
 1150                         break;
 1151                 default:
 1152                         period = (period * 25) + 50;
 1153                         printf("%d.%d ", 1000/period, ADW_TENTHS(1000, period));
 1154                         break;
 1155                 }
 1156                 printf("MHz %d REQ/ACK offset ", hshk_cfg & HSHK_CFG_OFFSET);
 1157         }
 1158 
 1159         printf("xfers\n");
 1160 }       
 1161 
 1162 
 1163 /******************************************************************************/
 1164 /*                        WIDE boards Interrupt callbacks                     */
 1165 /******************************************************************************/
 1166 
 1167 
 1168 /*
 1169  * adw_isr_callback() - Second Level Interrupt Handler called by AdwISR()
 1170  *
 1171  * Interrupt callback function for the Wide SCSI Adw Library.
 1172  *
 1173  * Notice:
 1174  * Interrupts are disabled by the caller (AdwISR() function), and will be
 1175  * enabled at the end of the caller.
 1176  */
 1177 void
 1178 adw_isr_callback(sc, scsiq)
 1179         ADW_SOFTC      *sc;
 1180         ADW_SCSI_REQ_Q *scsiq;
 1181 {
 1182         bus_dma_tag_t   dmat;
 1183         ADW_CCB        *ccb;
 1184         struct scsi_xfer *xs;
 1185         struct scsi_sense_data *s1, *s2;
 1186 
 1187 
 1188         ccb = adw_ccb_phys_kv(sc, scsiq->ccb_ptr);
 1189         TAILQ_REMOVE(&sc->sc_pending_ccb, ccb, chain);
 1190 
 1191         if ((ccb->flags & CCB_ALLOC) == 0) {
 1192                 printf("%s: unallocated ccb found on pending list!\n",
 1193                     sc->sc_dev.dv_xname);
 1194                 Debugger();
 1195                 adw_free_ccb(sc, ccb);
 1196                 return;
 1197         }
 1198 
 1199         xs = ccb->xs;
 1200         timeout_del(&xs->stimeout);
 1201 
 1202         /*
 1203          * If we were a data transfer, unload the map that described
 1204          * the data buffer.
 1205          */
 1206         dmat = sc->sc_dmat;
 1207         if (xs->datalen) {
 1208                 bus_dmamap_sync(dmat, ccb->dmamap_xfer,
 1209                     0, ccb->dmamap_xfer->dm_mapsize,
 1210                     ((xs->flags & SCSI_DATA_IN) ?
 1211                         BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE));
 1212                 bus_dmamap_unload(dmat, ccb->dmamap_xfer);
 1213         }
 1214 
 1215         /*
 1216          * 'done_status' contains the command's ending status.
 1217          * 'host_status' contains the host adapter status.
 1218          * 'scsi_status' contains the scsi peripheral status.
 1219          */
 1220 
 1221         sc->sc_freeze_dev[scsiq->target_id] = 0;
 1222         xs->status = scsiq->scsi_status;
 1223 
 1224         switch (scsiq->done_status) {
 1225         case QD_NO_ERROR: /* (scsi_status == 0) && (host_status == 0) */
 1226 NO_ERROR:
 1227                 xs->resid = scsiq->data_cnt;
 1228                 xs->error = XS_NOERROR;
 1229                 break;
 1230 
 1231         case QD_WITH_ERROR:
 1232                 switch (scsiq->host_status) {
 1233                 case QHSTA_NO_ERROR:
 1234                         switch (scsiq->scsi_status) {
 1235                         case SCSI_COND_MET:
 1236                         case SCSI_INTERM:
 1237                         case SCSI_INTERM_COND_MET:
 1238                                 /*
 1239                                  * These non-zero status values are 
 1240                                  * not really error conditions.
 1241                                  *
 1242                                  * XXX - would it be too paranoid to 
 1243                                  *       add SCSI_OK here in
 1244                                  *       case the docs are wrong re
 1245                                  *       QD_NO_ERROR?
 1246                                  */
 1247                                 goto NO_ERROR;
 1248 
 1249                         case SCSI_CHECK:
 1250                         case SCSI_TERMINATED:
 1251                         case SCSI_ACA_ACTIVE:
 1252                                 s1 = &ccb->scsi_sense;
 1253                                 s2 = &xs->sense;
 1254                                 *s2 = *s1;
 1255                                 xs->error = XS_SENSE;
 1256                                 break;
 1257 
 1258                         case SCSI_BUSY:
 1259                         case SCSI_QUEUE_FULL:
 1260                         case SCSI_RESV_CONFLICT:
 1261                                 sc->sc_freeze_dev[scsiq->target_id] = 1;
 1262                                 xs->error = XS_BUSY;
 1263                                 break;
 1264                 
 1265                         default: /* scsiq->scsi_status value */
 1266                                 printf("%s: bad scsi_status: 0x%02x.\n"
 1267                                     ,sc->sc_dev.dv_xname
 1268                                     ,scsiq->scsi_status);
 1269                                 xs->error = XS_DRIVER_STUFFUP;
 1270                                 break;
 1271                         }
 1272                         break;
 1273                 
 1274                 case QHSTA_M_SEL_TIMEOUT:
 1275                         xs->error = XS_SELTIMEOUT;
 1276                         break;
 1277 
 1278                 case QHSTA_M_DIRECTION_ERR:
 1279                 case QHSTA_M_SXFR_OFF_UFLW:
 1280                 case QHSTA_M_SXFR_OFF_OFLW:
 1281                 case QHSTA_M_SXFR_XFR_OFLW:
 1282                 case QHSTA_M_QUEUE_ABORTED:
 1283                 case QHSTA_M_INVALID_DEVICE:
 1284                 case QHSTA_M_SGBACKUP_ERROR:
 1285                 case QHSTA_M_SXFR_DESELECTED:
 1286                 case QHSTA_M_SXFR_XFR_PH_ERR:
 1287                 case QHSTA_M_BUS_DEVICE_RESET:
 1288                 case QHSTA_M_NO_AUTO_REQ_SENSE:
 1289                 case QHSTA_M_BAD_CMPL_STATUS_IN:
 1290                 case QHSTA_M_SXFR_UNKNOWN_ERROR:
 1291                 case QHSTA_M_AUTO_REQ_SENSE_FAIL:
 1292                 case QHSTA_M_UNEXPECTED_BUS_FREE:
 1293                         printf("%s: host adapter error 0x%02x."
 1294                                " See adw(4).\n"
 1295                             ,sc->sc_dev.dv_xname, scsiq->host_status);
 1296                         xs->error = XS_DRIVER_STUFFUP;
 1297                         break;
 1298 
 1299                 case QHSTA_M_RDMA_PERR:
 1300                 case QHSTA_M_SXFR_WD_TMO:
 1301                 case QHSTA_M_WTM_TIMEOUT:
 1302                 case QHSTA_M_FROZEN_TIDQ:
 1303                 case QHSTA_M_SXFR_SDMA_ERR:
 1304                 case QHSTA_M_SXFR_SXFR_PERR:
 1305                 case QHSTA_M_SCSI_BUS_RESET:
 1306                 case QHSTA_M_DIRECTION_ERR_HUNG:
 1307                 case QHSTA_M_SCSI_BUS_RESET_UNSOL:
 1308                         /*
 1309                          * XXX - are all these cases really asking
 1310                          *       for a card reset? _BUS_RESET and
 1311                          *       _BUS_RESET_UNSOL added just to make
 1312                          *       sure the pending queue is cleared out
 1313                          *       in case card has lost track of them.
 1314                          */
 1315                         printf("%s: host adapter error 0x%02x,"
 1316                                " resetting bus. See adw(4).\n"
 1317                             ,sc->sc_dev.dv_xname, scsiq->host_status);
 1318                         adw_reset_bus(sc);
 1319                         xs->error = XS_RESET;
 1320                         break;
 1321                         
 1322                 default: /* scsiq->host_status value */
 1323                         /*
 1324                          * XXX - is a panic really appropriate here? If
 1325                          *       not, would it be better to make the 
 1326                          *       XS_DRIVER_STUFFUP case above the 
 1327                          *       default behaviour? Or XS_RESET?
 1328                          */
 1329                         panic("%s: bad host_status: 0x%02x"
 1330                             ,sc->sc_dev.dv_xname, scsiq->host_status);
 1331                         break;      
 1332                 }
 1333                 break;
 1334 
 1335         case QD_ABORTED_BY_HOST:
 1336                 xs->error = XS_DRIVER_STUFFUP;
 1337                 break;
 1338 
 1339         default: /* scsiq->done_status value */
 1340                 /*
 1341                  * XXX - would QD_NO_STATUS really mean the I/O is not
 1342                  *       done? and would that mean it should somehow be
 1343                  *       put back as a pending I/O?
 1344                  */
 1345                 printf("%s: bad done_status: 0x%02x"
 1346                        " (host_status: 0x%02x, scsi_status: 0x%02x)\n"
 1347                     ,sc->sc_dev.dv_xname
 1348                     ,scsiq->done_status
 1349                     ,scsiq->host_status
 1350                     ,scsiq->scsi_status);
 1351                 xs->error = XS_DRIVER_STUFFUP;
 1352                 break;
 1353         }
 1354 
 1355         adw_free_ccb(sc, ccb);
 1356 
 1357         xs->flags |= ITSDONE;
 1358         scsi_done(xs);
 1359 }
 1360 
 1361 
 1362 /*
 1363  * adw_async_callback() - Adw Library asynchronous event callback function.
 1364  */
 1365 void
 1366 adw_async_callback(sc, code)
 1367         ADW_SOFTC       *sc;
 1368         u_int8_t        code;
 1369 {
 1370         switch (code) {
 1371         case ADW_ASYNC_SCSI_BUS_RESET_DET:
 1372                 /* The firmware detected a SCSI Bus reset. */
 1373                 printf("%s: SCSI Bus reset detected\n", sc->sc_dev.dv_xname);
 1374                 break;
 1375 
 1376         case ADW_ASYNC_RDMA_FAILURE:
 1377                 /*
 1378                  * Handle RDMA failure by resetting the SCSI Bus and
 1379                  * possibly the chip if it is unresponsive.
 1380                  */
 1381                 printf("%s: RDMA failure. Resetting the SCSI Bus and"
 1382                                 " the adapter\n", sc->sc_dev.dv_xname);
 1383                 adw_reset_bus(sc);
 1384                 break;
 1385 
 1386         case ADW_HOST_SCSI_BUS_RESET:
 1387                 /* Host generated SCSI bus reset occurred. */
 1388                 printf("%s: Host generated SCSI bus reset occurred\n",
 1389                                 sc->sc_dev.dv_xname);
 1390                 break;
 1391 
 1392 
 1393         case ADW_ASYNC_CARRIER_READY_FAILURE:
 1394                 /* 
 1395                  * Carrier Ready failure.
 1396                  *
 1397                  * A warning only - RISC too busy to realize it's been 
 1398                  * tickled. Occurs in normal operation under heavy
 1399                  * load, so a message is printed only when ADW_DEBUG'ing
 1400                  */
 1401 #ifdef ADW_DEBUG
 1402                 printf("%s: Carrier Ready failure!\n", sc->sc_dev.dv_xname);
 1403 #endif
 1404                 break;
 1405 
 1406         default:
 1407                 printf("%s: Unknown Async callback code (ignored): 0x%02x\n",
 1408                     sc->sc_dev.dv_xname, code);
 1409                 break;
 1410         }
 1411 }

/* [<][>][^][v][top][bottom][index][help] */