root/dev/isa/seagate.c

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

DEFINITIONS

This source file includes following definitions.
  1. BiosSignature
  2. sea_queue_length
  3. seaprobe
  4. seaprint
  5. seaattach
  6. seaintr
  7. sea_init
  8. sea_scsi_cmd
  9. sea_get_scb
  10. sea_send_scb
  11. sea_main
  12. sea_free_scb
  13. sea_timeout
  14. sea_reselect
  15. sea_transfer_pio
  16. sea_select
  17. sea_abort
  18. sea_done
  19. sea_poll
  20. sea_information_transfer

    1 /*      $OpenBSD: seagate.c,v 1.21 2007/06/29 15:17:02 jasper Exp $     */
    2 
    3 /*
    4  * ST01/02, Future Domain TMC-885, TMC-950 SCSI driver
    5  *
    6  * Copyright 1994, Charles Hannum (mycroft@ai.mit.edu)
    7  * Copyright 1994, Kent Palmkvist (kentp@isy.liu.se)
    8  * Copyright 1994, Robert Knier (rknier@qgraph.com)
    9  * Copyright 1992, 1994 Drew Eckhardt (drew@colorado.edu)
   10  * Copyright 1994, Julian Elischer (julian@tfs.com)
   11  *
   12  * Others that has contributed by example code is
   13  *              Glen Overby (overby@cray.com)
   14  *              Tatu Yllnen
   15  *              Brian E Litzinger
   16  *
   17  * Redistribution and use in source and binary forms, with or without
   18  * modification, are permitted provided that the following conditions
   19  * are met:
   20  * 1. Redistributions of source code must retain the above copyright
   21  *    notice, this list of conditions and the following disclaimer.
   22  * 2. Redistributions in binary form must reproduce the above copyright
   23  *    notice, this list of conditions and the following disclaimer in the
   24  *    documentation and/or other materials provided with the distribution.
   25  *
   26  * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND
   27  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   28  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   29  * ARE DISCLAIMED.  IN NO EVENT SHALL THE DEVELOPERS BE LIABLE
   30  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   31  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   32  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   33  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   34  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   35  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   36  * SUCH DAMAGE.
   37  */
   38 
   39 /*
   40  * kentp  940307 alpha version based on newscsi-03 version of Julians SCSI-code
   41  * kentp  940314 Added possibility to not use messages
   42  * rknier 940331 Added fast transfer code
   43  * rknier 940407 Added assembler coded data transfers
   44  */
   45 
   46 /*
   47  * What should really be done:
   48  *
   49  * Add missing tests for timeouts
   50  * Restructure interrupt enable/disable code (runs to long with int disabled)
   51  * Find bug? giving problem with tape status
   52  * Add code to handle Future Domain 840, 841, 880 and 881
   53  * adjust timeouts (startup is very slow)
   54  * add code to use tagged commands in SCSI2
   55  * Add code to handle slow devices better (sleep if device not disconnecting)
   56  * Fix unnecessary interrupts
   57  */
   58 
   59 /*
   60  * Note to users trying to share a disk between DOS and unix:
   61  * The ST01/02 is a translating host-adapter. It is not giving DOS
   62  * the same number of heads/tracks/sectors as specified by the disk.
   63  * It is therefore important to look at what numbers DOS thinks the
   64  * disk has. Use these to disklabel your disk in an appropriate manner
   65  */
   66 
   67 #include <sys/types.h>
   68 #include <sys/param.h>
   69 #include <sys/systm.h>
   70 #include <sys/kernel.h>
   71 #include <sys/errno.h>
   72 #include <sys/ioctl.h>
   73 #include <sys/device.h>
   74 #include <sys/buf.h>
   75 #include <sys/proc.h>
   76 #include <sys/user.h>
   77 #include <sys/queue.h>
   78 #include <sys/malloc.h>
   79 
   80 #include <machine/intr.h>
   81 #include <machine/pio.h>
   82 
   83 #include <scsi/scsi_all.h>
   84 #include <scsi/scsi_message.h>
   85 #include <scsi/scsiconf.h>
   86 
   87 #include <dev/isa/isareg.h>
   88 #include <dev/isa/isavar.h>
   89 #include <i386/isa/isa_machdep.h>       /* XXX USES ISA HOLE DIRECTLY */
   90 
   91 #define SEA_SCB_MAX     32      /* allow maximally 8 scsi control blocks */
   92 #define SCB_TABLE_SIZE  8       /* start with 8 scb entries in table */
   93 #define BLOCK_SIZE      512     /* size of READ/WRITE areas on SCSI card */
   94 
   95 /*
   96  * defining SEA_BLINDTRANSFER will make DATA IN and DATA OUT to be done with
   97  * blind transfers, i.e. no check is done for scsi phase changes. This will
   98  * result in data loss if the scsi device does not send its data using
   99  * BLOCK_SIZE bytes at a time.
  100  * If SEA_BLINDTRANSFER defined and SEA_ASSEMBLER also defined will result in
  101  * the use of blind transfers coded in assembler. SEA_ASSEMBLER is no good
  102  * without SEA_BLINDTRANSFER defined.
  103  */
  104 #define SEA_BLINDTRANSFER       /* do blind transfers */
  105 #define SEA_ASSEMBLER           /* Use assembly code for fast transfers */
  106 
  107 /*
  108  * defining SEA_NOMSGS causes messages not to be used (thereby disabling
  109  * disconnects)
  110  */
  111 #undef  SEA_NOMSGS
  112 
  113 /*
  114  * defining SEA_NODATAOUT makes dataout phase being aborted
  115  */
  116 #undef  SEA_NODATAOUT
  117 
  118 /* Debugging definitions. Should not be used unless you want a lot of
  119    printouts even under normal conditions */
  120 
  121 #undef  SEA_DEBUGQUEUE          /* Display info about queue-lengths */
  122 
  123 /******************************* board definitions **************************/
  124 /*
  125  * CONTROL defines
  126  */
  127 #define CMD_RST         0x01            /* scsi reset */
  128 #define CMD_SEL         0x02            /* scsi select */
  129 #define CMD_BSY         0x04            /* scsi busy */
  130 #define CMD_ATTN        0x08            /* scsi attention */
  131 #define CMD_START_ARB   0x10            /* start arbitration bit */
  132 #define CMD_EN_PARITY   0x20            /* enable scsi parity generation */
  133 #define CMD_INTR        0x40            /* enable scsi interrupts */
  134 #define CMD_DRVR_ENABLE 0x80            /* scsi enable */
  135 
  136 /*
  137  * STATUS
  138  */
  139 #define STAT_BSY        0x01            /* scsi busy */
  140 #define STAT_MSG        0x02            /* scsi msg */
  141 #define STAT_IO         0x04            /* scsi I/O */
  142 #define STAT_CD         0x08            /* scsi C/D */
  143 #define STAT_REQ        0x10            /* scsi req */
  144 #define STAT_SEL        0x20            /* scsi select */
  145 #define STAT_PARITY     0x40            /* parity error bit */
  146 #define STAT_ARB_CMPL   0x80            /* arbitration complete bit */
  147 
  148 /*
  149  * REQUESTS
  150  */
  151 #define PH_DATAOUT      (0)
  152 #define PH_DATAIN       (STAT_IO)
  153 #define PH_CMD          (STAT_CD)
  154 #define PH_STAT         (STAT_CD | STAT_IO)
  155 #define PH_MSGOUT       (STAT_MSG | STAT_CD)
  156 #define PH_MSGIN        (STAT_MSG | STAT_CD | STAT_IO)
  157 
  158 #define PH_MASK         (STAT_MSG | STAT_CD | STAT_IO)
  159 
  160 #define PH_INVALID      0xff
  161 
  162 #define SEA_RAMOFFSET   0x00001800
  163 
  164 #define BASE_CMD        (CMD_INTR | CMD_EN_PARITY)
  165 
  166 #define SEAGATE         1       /* Seagate ST0[12] */
  167 #define FDOMAIN         2       /* Future Domain TMC-{885,950} */
  168 #define FDOMAIN840      3       /* Future Domain TMC-{84[01],88[01]} */
  169 
  170 /******************************************************************************/
  171 
  172 /* scsi control block used to keep info about a scsi command */
  173 struct sea_scb {
  174         u_char *data;                   /* position in data buffer so far */
  175         int datalen;                    /* bytes remaining to transfer */
  176         TAILQ_ENTRY(sea_scb) chain;
  177         struct scsi_xfer *xs;           /* the scsi_xfer for this cmd */
  178         int flags;                      /* status of the instruction */
  179 #define SCB_FREE        0
  180 #define SCB_ACTIVE      1
  181 #define SCB_ABORTED     2
  182 #define SCB_TIMEOUT     4
  183 #define SCB_ERROR       8
  184 };
  185 
  186 /*
  187  * data structure describing current status of the scsi bus. One for each
  188  * controller card.
  189  */
  190 struct sea_softc {
  191         struct device sc_dev;
  192         struct isadev sc_id;
  193         void *sc_ih;
  194 
  195         int type;                       /* board type */
  196         caddr_t maddr;                  /* Base address for card */
  197         caddr_t maddr_cr_sr;            /* Address of control and status reg */
  198         caddr_t maddr_dr;               /* Address of data register */
  199 
  200         struct scsi_link sc_link;       /* prototype for subdevs */
  201         TAILQ_HEAD(, sea_scb) free_list, ready_list, nexus_list;
  202         struct sea_scb *nexus;          /* currently connected command */
  203         int numscbs;                    /* number of scsi control blocks */
  204         struct sea_scb scb[SCB_TABLE_SIZE];
  205 
  206         int our_id;                     /* our scsi id */
  207         u_char our_id_mask;
  208         volatile u_char busy[8];        /* index=target, bit=lun, Keep track of
  209                                            busy luns at device target */
  210 };
  211 
  212 /* flag showing if main routine is running. */
  213 static volatile int main_running = 0;
  214 
  215 #define STATUS  (*(volatile u_char *)sea->maddr_cr_sr)
  216 #define CONTROL STATUS
  217 #define DATA    (*(volatile u_char *)sea->maddr_dr)
  218 
  219 /*
  220  * These are "special" values for the tag parameter passed to sea_select
  221  * Not implemented right now.
  222  */
  223 #define TAG_NEXT        -1      /* Use next free tag */
  224 #define TAG_NONE        -2      /*
  225                                  * Establish I_T_L nexus instead of I_T_L_Q
  226                                  * even on SCSI-II devices.
  227                                  */
  228 
  229 typedef struct {
  230         char *signature;
  231         int offset, length;
  232         int type;
  233 } BiosSignature;
  234 
  235 /*
  236  * Signatures for automatic recognition of board type
  237  */
  238 static const BiosSignature signatures[] = {
  239 {"ST01 v1.7  (C) Copyright 1987 Seagate", 15, 37, SEAGATE},
  240 {"SCSI BIOS 2.00  (C) Copyright 1987 Seagate", 15, 40, SEAGATE},
  241 
  242 /*
  243  * The following two lines are NOT mistakes. One detects ROM revision
  244  * 3.0.0, the other 3.2. Since seagate has only one type of SCSI adapter,
  245  * and this is not going to change, the "SEAGATE" and "SCSI" together
  246  * are probably "good enough"
  247  */
  248 {"SEAGATE SCSI BIOS ", 16, 17, SEAGATE},
  249 {"SEAGATE SCSI BIOS ", 17, 17, SEAGATE},
  250 
  251 /*
  252  * However, future domain makes several incompatible SCSI boards, so specific
  253  * signatures must be used.
  254  */
  255 {"FUTURE DOMAIN CORP. (C) 1986-1989 V5.0C2/14/89", 5, 45, FDOMAIN},
  256 {"FUTURE DOMAIN CORP. (C) 1986-1989 V6.0A7/28/89", 5, 46, FDOMAIN},
  257 {"FUTURE DOMAIN CORP. (C) 1986-1990 V6.0105/31/90",5, 47, FDOMAIN},
  258 {"FUTURE DOMAIN CORP. (C) 1986-1990 V6.0209/18/90",5, 47, FDOMAIN},
  259 {"FUTURE DOMAIN CORP. (C) 1986-1990 V7.009/18/90", 5, 46, FDOMAIN},
  260 {"FUTURE DOMAIN CORP. (C) 1992 V8.00.004/02/92",   5, 44, FDOMAIN},
  261 {"FUTURE DOMAIN TMC-950",                          5, 21, FDOMAIN},
  262 };
  263 
  264 #define nsignatures     (sizeof(signatures) / sizeof(signatures[0]))
  265 
  266 #ifdef notdef
  267 static const char *bases[] = {
  268         (char *) 0xc8000, (char *) 0xca000, (char *) 0xcc000,
  269         (char *) 0xce000, (char *) 0xdc000, (char *) 0xde000
  270 };
  271 
  272 #define nbases          (sizeof(bases) / sizeof(bases[0]))
  273 #endif
  274 
  275 struct          sea_scb *sea_get_scb(struct sea_softc *, int);
  276 int             seaintr(void *);
  277 int             sea_scsi_cmd(struct scsi_xfer *);
  278 int             sea_poll(struct sea_softc *, struct scsi_xfer *, int);
  279 int             sea_select(struct sea_softc *sea, struct sea_scb *scb);
  280 int             sea_transfer_pio(struct sea_softc *sea, u_char *phase,
  281                     int *count, u_char **data);
  282 int             sea_abort(struct sea_softc *, struct sea_scb *scb);
  283 static void     sea_main(void);
  284 static void     sea_information_transfer(struct sea_softc *);
  285 void            sea_timeout(void *);
  286 void            sea_done(struct sea_softc *, struct sea_scb *);
  287 void            sea_free_scb(struct sea_softc *, struct sea_scb *, int);
  288 void            sea_init(struct sea_softc *);
  289 void            sea_send_scb(struct sea_softc *sea, struct sea_scb *scb);
  290 void            sea_reselect(struct sea_softc *sea);
  291 
  292 struct scsi_adapter sea_switch = {
  293         sea_scsi_cmd,
  294         minphys,        /* no special minphys(), since driver uses PIO */
  295         0,
  296         0,
  297 };
  298 
  299 /* the below structure is so we have a default dev struct for our link struct */
  300 struct scsi_device sea_dev = {
  301         NULL,           /* use default error handler */
  302         NULL,           /* have a queue, served by this */
  303         NULL,           /* have no async handler */
  304         NULL,           /* Use default 'done' routine */
  305 };
  306 
  307 int     seaprobe(struct device *, void *, void *);
  308 void    seaattach(struct device *, struct device *, void *);
  309 int     seaprint(void *, const char *);
  310 
  311 struct cfattach sea_ca = {
  312         sizeof(struct sea_softc), seaprobe, seaattach
  313 };
  314 
  315 struct cfdriver sea_cd = {
  316         NULL, "sea", DV_DULL
  317 };
  318 
  319 #ifdef SEA_DEBUGQUEUE
  320 void
  321 sea_queue_length(struct sea_softc *sea)
  322 {
  323         struct sea_scb *scb;
  324         int connected, issued, disconnected;
  325 
  326         connected = sea->nexus ? 1 : 0;
  327         issued = 0;
  328         TAILQ_FOREACH(scb, &sea->ready_list, chain)
  329                 issued++;
  330         disconnected = 0;
  331         TAILQ_FOREACH(scb, &sea->nexus_list, chain)
  332                 disconnected++;
  333         printf("%s: length: %d/%d/%d\n", sea->sc_dev.dv_xname, connected,
  334             issued, disconnected);
  335 }
  336 #endif
  337 
  338 /*
  339  * Check if the device can be found at the port given and if so, detect the
  340  * type the type of board.  Set it up ready for further work. Takes the isa_dev
  341  * structure from autoconf as an argument.
  342  * Returns 1 if card recognized, 0 if errors.
  343  */
  344 int
  345 seaprobe(struct device *parent, void *match, void *aux)
  346 {
  347         struct sea_softc *sea = match;
  348         struct isa_attach_args *ia = aux;
  349         int i;
  350 
  351         /*
  352          * Could try to find a board by looking through all possible addresses.
  353          * This is not done the right way now, because I have not found a way
  354          * to get a boards virtual memory address given its physical.  There is
  355          * a function that returns the physical address for a given virtual
  356          * address, but not the other way around.
  357          */
  358 
  359         if (ia->ia_maddr == MADDRUNK) {
  360                 /* XXX */
  361                 return 0;
  362         } else
  363                 sea->maddr = ISA_HOLE_VADDR(ia->ia_maddr);
  364 
  365         /* check board type */  /* No way to define this through config */
  366         for (i = 0; i < nsignatures; i++)
  367                 if (!bcmp(sea->maddr + signatures[i].offset,
  368                     signatures[i].signature, signatures[i].length)) {
  369                         sea->type = signatures[i].type;
  370                         break;
  371                 }
  372 
  373         /* Find controller and data memory addresses */
  374         switch (sea->type) {
  375         case SEAGATE:
  376         case FDOMAIN840:
  377                 sea->maddr_cr_sr =
  378                     (void *) (((u_char *)sea->maddr) + 0x1a00);
  379                 sea->maddr_dr =
  380                     (void *) (((u_char *)sea->maddr) + 0x1c00);
  381                 break;
  382         case FDOMAIN:
  383                 sea->maddr_cr_sr =
  384                     (void *) (((u_char *)sea->maddr) + 0x1c00);
  385                 sea->maddr_dr =
  386                     (void *) (((u_char *)sea->maddr) + 0x1e00);
  387                 break;
  388         default:
  389 #if 0
  390                 printf("%s: board type unknown at address %p\n",
  391                     sea->sc_dev.dv_xname, sea->maddr);
  392 #endif
  393                 return 0;
  394         }
  395 
  396         /* Test controller RAM (works the same way on future domain cards?) */
  397         *((u_char *)sea->maddr + SEA_RAMOFFSET) = 0xa5;
  398         *((u_char *)sea->maddr + SEA_RAMOFFSET + 1) = 0x5a;
  399 
  400         if ((*((u_char *)sea->maddr + SEA_RAMOFFSET) != 0xa5) ||
  401             (*((u_char *)sea->maddr + SEA_RAMOFFSET + 1) != 0x5a)) {
  402                 printf("%s: board RAM failure\n", sea->sc_dev.dv_xname);
  403                 return 0;
  404         }
  405 
  406         ia->ia_drq = DRQUNK;
  407         ia->ia_msize = 0x2000;
  408         ia->ia_iosize = 0;
  409         return 1;
  410 }
  411 
  412 int
  413 seaprint(void *aux, const char *name)
  414 {
  415         if (name != NULL)
  416                 printf("%s: scsibus ", name);
  417         return UNCONF;
  418 }
  419 
  420 /*
  421  * Attach all sub-devices we can find
  422  */
  423 void
  424 seaattach(struct device *parent, struct device *self, void *aux)
  425 {
  426         struct isa_attach_args *ia = aux;
  427         struct sea_softc *sea = (void *)self;
  428         struct scsibus_attach_args saa;
  429 
  430         sea_init(sea);
  431 
  432         /*
  433          * fill in the prototype scsi_link.
  434          */
  435         sea->sc_link.adapter_softc = sea;
  436         sea->sc_link.adapter_target = sea->our_id;
  437         sea->sc_link.adapter = &sea_switch;
  438         sea->sc_link.device = &sea_dev;
  439         sea->sc_link.openings = 1;
  440 
  441         printf("\n");
  442 
  443         sea->sc_ih = isa_intr_establish(ia->ia_ic, ia->ia_irq, IST_EDGE,
  444             IPL_BIO, seaintr, sea, sea->sc_dev.dv_xname);
  445 
  446         bzero(&saa, sizeof(saa));
  447         saa.saa_sc_link = &sea->sc_link;
  448 
  449         /*
  450          * ask the adapter what subunits are present
  451          */
  452         config_found(self, &saa, seaprint);
  453 }
  454 
  455 /*
  456  * Catch an interrupt from the adaptor
  457  */
  458 int
  459 seaintr(void *arg)
  460 {
  461         struct sea_softc *sea = arg;
  462 
  463 #ifdef DEBUG    /* extra overhead, and only needed for intr debugging */
  464         if ((STATUS & STAT_PARITY) == 0 &&
  465             (STATUS & (STAT_SEL | STAT_IO)) != (STAT_SEL | STAT_IO))
  466                 return 0;
  467 #endif
  468 
  469 loop:
  470         /* dispatch to appropriate routine if found and done=0 */
  471         /* should check to see that this card really caused the interrupt */
  472 
  473         if (STATUS & STAT_PARITY) {
  474                 /* Parity error interrupt */
  475                 printf("%s: parity error\n", sea->sc_dev.dv_xname);
  476                 return 1;
  477         }
  478 
  479         if ((STATUS & (STAT_SEL | STAT_IO)) == (STAT_SEL | STAT_IO)) {
  480                 /* Reselect interrupt */
  481                 sea_reselect(sea);
  482                 if (!main_running)
  483                         sea_main();
  484                 goto loop;
  485         }
  486 
  487         return 1;
  488 }
  489 
  490 /*
  491  * Setup data structures, and reset the board and the SCSI bus.
  492  */
  493 void
  494 sea_init(struct sea_softc *sea)
  495 {
  496         int i;
  497 
  498         /* Reset the scsi bus (I don't know if this is needed */
  499         CONTROL = BASE_CMD | CMD_DRVR_ENABLE | CMD_RST;
  500         delay(25);      /* hold reset for at least 25 microseconds */
  501         CONTROL = BASE_CMD;
  502         delay(10);      /* wait a Bus Clear Delay (800 ns + bus free delay (800 ns) */
  503 
  504         /* Set our id (don't know anything about this) */
  505         switch (sea->type) {
  506         case SEAGATE:
  507                 sea->our_id = 7;
  508                 break;
  509         case FDOMAIN:
  510         case FDOMAIN840:
  511                 sea->our_id = 6;
  512                 break;
  513         }
  514         sea->our_id_mask = 1 << sea->our_id;
  515 
  516         /* init fields used by our routines */
  517         sea->nexus = 0;
  518         TAILQ_INIT(&sea->ready_list);
  519         TAILQ_INIT(&sea->nexus_list);
  520         TAILQ_INIT(&sea->free_list);
  521         for (i = 0; i < 8; i++)
  522                 sea->busy[i] = 0x00;
  523 
  524         /* link up the free list of scbs */
  525         sea->numscbs = SCB_TABLE_SIZE;
  526         for (i = 0; i < SCB_TABLE_SIZE; i++) {
  527                 TAILQ_INSERT_TAIL(&sea->free_list, &sea->scb[i], chain);
  528         }
  529 }
  530 
  531 /*
  532  * start a scsi operation given the command and the data address. Also needs
  533  * the unit, target and lu.
  534  */
  535 int
  536 sea_scsi_cmd(struct scsi_xfer *xs)
  537 {
  538         struct scsi_link *sc_link = xs->sc_link;
  539         struct sea_softc *sea = sc_link->adapter_softc;
  540         struct sea_scb *scb;
  541         int flags;
  542         int s;
  543 
  544         SC_DEBUG(sc_link, SDEV_DB2, ("sea_scsi_cmd\n"));
  545 
  546         flags = xs->flags;
  547         if (flags & ITSDONE) {
  548                 printf("%s: done?\n", sea->sc_dev.dv_xname);
  549                 xs->flags &= ~ITSDONE;
  550         }
  551         if ((scb = sea_get_scb(sea, flags)) == NULL) {
  552                 return TRY_AGAIN_LATER;
  553         }
  554         scb->flags = SCB_ACTIVE;
  555         scb->xs = xs;
  556 
  557         if (flags & SCSI_RESET) {
  558                 /*
  559                  * Try to send a reset command to the card.
  560                  * XXX Not implemented.
  561                  */
  562                 printf("%s: resetting\n", sea->sc_dev.dv_xname);
  563                 xs->error = XS_DRIVER_STUFFUP;
  564                 return COMPLETE;
  565         }
  566 
  567         /*
  568          * Put all the arguments for the xfer in the scb
  569          */
  570         scb->datalen = xs->datalen;
  571         scb->data = xs->data;
  572 
  573 #ifdef SEA_DEBUGQUEUE
  574         sea_queue_length(sea);
  575 #endif
  576 
  577         s = splbio();
  578 
  579         sea_send_scb(sea, scb);
  580 
  581         /*
  582          * Usually return SUCCESSFULLY QUEUED
  583          */
  584         if ((flags & SCSI_POLL) == 0) {
  585                 timeout_set(&scb->xs->stimeout, sea_timeout, scb);
  586                 timeout_add(&scb->xs->stimeout, (xs->timeout * hz) / 1000);
  587                 splx(s);
  588                 return SUCCESSFULLY_QUEUED;
  589         }
  590 
  591         splx(s);
  592 
  593         /*
  594          * If we can't use interrupts, poll on completion
  595          */
  596         if (sea_poll(sea, xs, xs->timeout)) {
  597                 sea_timeout(scb);
  598                 if (sea_poll(sea, xs, 2000))
  599                         sea_timeout(scb);
  600         }
  601         return COMPLETE;
  602 }
  603 
  604 /*
  605  * Get a free scb. If there are none, see if we can allocate a new one.  If so,
  606  * put it in the hash table too; otherwise return an error or sleep.
  607  */
  608 struct sea_scb *
  609 sea_get_scb(struct sea_softc *sea, int flags)
  610 {
  611         int s;
  612         struct sea_scb *scb;
  613 
  614         s = splbio();
  615 
  616         /*
  617          * If we can and have to, sleep waiting for one to come free
  618          * but only if we can't allocate a new one.
  619          */
  620         for (;;) {
  621                 scb = TAILQ_FIRST(&sea->free_list);
  622                 if (scb) {
  623                         TAILQ_REMOVE(&sea->free_list, scb, chain);
  624                         break;
  625                 }
  626                 if (sea->numscbs < SEA_SCB_MAX) {
  627                         scb = (struct sea_scb *) malloc(sizeof(struct sea_scb),
  628                             M_TEMP, M_NOWAIT);
  629                         if (scb) {
  630                                 bzero(scb, sizeof(struct sea_scb));
  631                                 sea->numscbs++;
  632                         } else
  633                                 printf("%s: can't malloc scb\n",
  634                                     sea->sc_dev.dv_xname);
  635                         break;
  636                 }
  637                 if ((flags & SCSI_NOSLEEP) != 0)
  638                         break;
  639                 tsleep(&sea->free_list, PRIBIO, "seascb", 0);
  640         }
  641 
  642         splx(s);
  643         return scb;
  644 }
  645 
  646 /*
  647  * Try to send this command to the board. Because this board does not use any
  648  * mailboxes, this routine simply adds the command to the queue held by the
  649  * sea_softc structure.
  650  * A check is done to see if the command contains a REQUEST_SENSE command, and
  651  * if so the command is put first in the queue, otherwise the command is added
  652  * to the end of the queue. ?? Not correct ??
  653  */
  654 void
  655 sea_send_scb(struct sea_softc *sea, struct sea_scb *scb)
  656 {
  657 
  658         TAILQ_INSERT_TAIL(&sea->ready_list, scb, chain);
  659         /* Try to do some work on the card. */
  660         if (!main_running)
  661                 sea_main();
  662 }
  663 
  664 /*
  665  * Coroutine that runs as long as more work can be done on the seagate host
  666  * adapter in a system.  Both sea_scsi_cmd and sea_intr will try to start it in
  667  * case it is not running.
  668  */
  669 void
  670 sea_main(void)
  671 {
  672         struct sea_softc *sea;
  673         struct sea_scb *scb;
  674         int done;
  675         int unit;
  676         int s;
  677 
  678         main_running = 1;
  679 
  680         /*
  681          * This should not be run with interrupts disabled, but use the splx
  682          * code instead.
  683          */
  684 loop:
  685         done = 1;
  686         for (unit = 0; unit < sea_cd.cd_ndevs; unit++) {
  687                 sea = sea_cd.cd_devs[unit];
  688                 if (!sea)
  689                         continue;
  690                 s = splbio();
  691                 if (!sea->nexus) {
  692                         /*
  693                          * Search through the ready_list for a command
  694                          * destined for a target that's not busy.
  695                          */
  696                         TAILQ_FOREACH(scb, &sea->ready_list, chain) {
  697                                 if (!(sea->busy[scb->xs->sc_link->target] &
  698                                     (1 << scb->xs->sc_link->lun))) {
  699                                         TAILQ_REMOVE(&sea->ready_list, scb,
  700                                             chain);
  701 
  702                                         /* Re-enable interrupts. */
  703                                         splx(s);
  704 
  705                                         /*
  706                                          * Attempt to establish an I_T_L nexus.
  707                                          * On success, sea->nexus is set.
  708                                          * On failure, we must add the command
  709                                          * back to the issue queue so we can
  710                                          * keep trying.
  711                                          */
  712 
  713                                         /*
  714                                          * REQUEST_SENSE commands are issued
  715                                          * without tagged queueing, even on
  716                                          * SCSI-II devices because the
  717                                          * contingent alligence condition
  718                                          * exists for the entire unit.
  719                                          */
  720 
  721                                         /*
  722                                          * First check that if any device has
  723                                          * tried a reconnect while we have done
  724                                          * other things with interrupts
  725                                          * disabled.
  726                                          */
  727 
  728                                         if ((STATUS & (STAT_SEL | STAT_IO)) ==
  729                                             (STAT_SEL | STAT_IO)) {
  730                                                 sea_reselect(sea);
  731                                                 break;
  732                                         }
  733                                         if (sea_select(sea, scb)) {
  734                                                 s = splbio();
  735                                                 TAILQ_INSERT_HEAD(&sea->ready_list,
  736                                                     scb, chain);
  737                                                 splx(s);
  738                                         } else
  739                                                 break;
  740                                 } /* if target/lun is not busy */
  741                         } /* for scb */
  742                         if (!sea->nexus) {
  743                                 /* check for reselection phase */
  744                                 if ((STATUS & (STAT_SEL | STAT_IO)) ==
  745                                     (STAT_SEL | STAT_IO)) {
  746                                         sea_reselect(sea);
  747                                 }
  748                         }
  749                 } /* if (!sea->nexus) */
  750 
  751                 splx(s);
  752                 if (sea->nexus) {       /* we are connected. Do the task */
  753                         sea_information_transfer(sea);
  754                         done = 0;
  755                 } else
  756                         break;
  757         } /* for instance */
  758 
  759         if (!done)
  760                 goto loop;
  761 
  762         main_running = 0;
  763 }
  764 
  765 void
  766 sea_free_scb(struct sea_softc *sea, struct sea_scb *scb, int flags)
  767 {
  768         int s;
  769 
  770         s = splbio();
  771 
  772         scb->flags = SCB_FREE;
  773         TAILQ_INSERT_HEAD(&sea->free_list, scb, chain);
  774 
  775         /*
  776          * If there were none, wake anybody waiting for one to come free,
  777          * starting with queued entries.
  778          */
  779         if (TAILQ_NEXT(scb, chain) == NULL)
  780                 wakeup((caddr_t)&sea->free_list);
  781 
  782         splx(s);
  783 }
  784 
  785 void
  786 sea_timeout(void *arg)
  787 {
  788         struct sea_scb *scb = arg;
  789         struct scsi_xfer *xs = scb->xs;
  790         struct scsi_link *sc_link = xs->sc_link;
  791         struct sea_softc *sea = sc_link->adapter_softc;
  792         int s;
  793 
  794         sc_print_addr(sc_link);
  795         printf("timed out");
  796 
  797         s = splbio();
  798 
  799         /*
  800          * If it has been through before, then
  801          * a previous abort has failed, don't
  802          * try abort again
  803          */
  804         if (scb->flags & SCB_ABORTED) {
  805                 /* abort timed out */
  806                 printf(" AGAIN\n");
  807                 scb->xs->retries = 0;
  808                 scb->flags |= SCB_ABORTED;
  809                 sea_done(sea, scb);
  810         } else {
  811                 /* abort the operation that has timed out */
  812                 printf("\n");
  813                 scb->flags |= SCB_ABORTED;
  814                 sea_abort(sea, scb);
  815                 /* 2 secs for the abort */
  816                 if ((xs->flags & SCSI_POLL) == 0) {
  817                         timeout_set(&scb->xs->stimeout, sea_timeout, scb);
  818                         timeout_add(&scb->xs->stimeout, 2 * hz);
  819                 }
  820         }
  821 
  822         splx(s);
  823 }
  824 
  825 void
  826 sea_reselect(struct sea_softc *sea)
  827 {
  828         u_char target_mask;
  829         int i;
  830         u_char lun, phase;
  831         u_char msg[3];
  832         int len;
  833         u_char *data;
  834         struct sea_scb *scb;
  835         int abort = 0;
  836 
  837         if (!((target_mask = STATUS) & STAT_SEL)) {
  838                 printf("%s: wrong state 0x%x\n", sea->sc_dev.dv_xname,
  839                     target_mask);
  840                 return;
  841         }
  842 
  843         /* wait for a device to win the reselection phase */
  844         /* signals this by asserting the I/O signal */
  845         for (i = 10; i && (STATUS & (STAT_SEL | STAT_IO | STAT_BSY)) !=
  846             (STAT_SEL | STAT_IO | 0); i--);
  847         /* !! Check for timeout here */
  848         /* the data bus contains original initiator id ORed with target id */
  849         target_mask = DATA;
  850         /* see that we really are the initiator */
  851         if (!(target_mask & sea->our_id_mask)) {
  852                 printf("%s: polled reselection was not for me: 0x%x\n",
  853                     sea->sc_dev.dv_xname, target_mask);
  854                 return;
  855         }
  856         /* find target who won */
  857         target_mask &= ~sea->our_id_mask;
  858         /* host responds by asserting the BSY signal */
  859         CONTROL = BASE_CMD | CMD_DRVR_ENABLE | CMD_BSY;
  860         /* target should respond by deasserting the SEL signal */
  861         for (i = 50000; i && (STATUS & STAT_SEL); i++);
  862         /* remove the busy status */
  863         CONTROL = BASE_CMD | CMD_DRVR_ENABLE;
  864         /* we are connected. Now we wait for the MSGIN condition */
  865         for (i = 50000; i && !(STATUS & STAT_REQ); i--);
  866         /* !! Add timeout check here */
  867         /* hope we get an IDENTIFY message */
  868         len = 3;
  869         data = msg;
  870         phase = PH_MSGIN;
  871         sea_transfer_pio(sea, &phase, &len, &data);
  872 
  873         if (MSG_ISIDENTIFY(msg[0])) {
  874                 printf("%s: expecting IDENTIFY message, got 0x%x\n",
  875                     sea->sc_dev.dv_xname, msg[0]);
  876                 abort = 1;
  877                 scb = NULL;
  878         } else {
  879                 lun = msg[0] & 0x07;
  880 
  881                 /*
  882                  * Find the command corresponding to the I_T_L or I_T_L_Q nexus
  883                  * we just reestablished, and remove it from the disconnected
  884                  * queue.
  885                  */
  886                 TAILQ_FOREACH(scb, &sea->nexus_list, chain)
  887                         if (target_mask == (1 << scb->xs->sc_link->target) &&
  888                             lun == scb->xs->sc_link->lun) {
  889                                 TAILQ_REMOVE(&sea->nexus_list, scb,
  890                                     chain);
  891                                 break;
  892                         }
  893                 if (!scb) {
  894                         printf("%s: target %02x lun %d not disconnected\n",
  895                             sea->sc_dev.dv_xname, target_mask, lun);
  896                         /*
  897                          * Since we have an established nexus that we can't do
  898                          * anything with, we must abort it.
  899                          */
  900                         abort = 1;
  901                 }
  902         }
  903 
  904         if (abort) {
  905                 msg[0] = MSG_ABORT;
  906                 len = 1;
  907                 data = msg;
  908                 phase = PH_MSGOUT;
  909                 CONTROL = BASE_CMD | CMD_ATTN;
  910                 sea_transfer_pio(sea, &phase, &len, &data);
  911         } else
  912                 sea->nexus = scb;
  913 
  914         return;
  915 }
  916 
  917 /*
  918  * Transfer data in given phase using polled I/O.
  919  */
  920 int
  921 sea_transfer_pio(struct sea_softc *sea, u_char *phase, int *count, u_char **data)
  922 {
  923         u_char p = *phase, tmp;
  924         int c = *count;
  925         u_char *d = *data;
  926         int timeout;
  927 
  928         do {
  929                 /*
  930                  * Wait for assertion of REQ, after which the phase bits will
  931                  * be valid.
  932                  */
  933                 for (timeout = 0; timeout < 50000; timeout++)
  934                         if ((tmp = STATUS) & STAT_REQ)
  935                                 break;
  936                 if (!(tmp & STAT_REQ)) {
  937                         printf("%s: timeout waiting for STAT_REQ\n",
  938                             sea->sc_dev.dv_xname);
  939                         break;
  940                 }
  941 
  942                 /*
  943                  * Check for phase mismatch.  Reached if the target decides
  944                  * that it has finished the transfer.
  945                  */
  946                 if (sea->type == FDOMAIN840)
  947                         tmp = ((tmp & 0x08) >> 2) |
  948                               ((tmp & 0x02) << 2) |
  949                                (tmp & 0xf5);
  950                 if ((tmp & PH_MASK) != p)
  951                         break;
  952 
  953                 /* Do actual transfer from SCSI bus to/from memory. */
  954                 if (!(p & STAT_IO))
  955                         DATA = *d;
  956                 else
  957                         *d = DATA;
  958                 ++d;
  959 
  960                 /*
  961                  * The SCSI standard suggests that in MSGOUT phase, the
  962                  * initiator should drop ATN on the last byte of the message
  963                  * phase after REQ has been asserted for the handshake but
  964                  * before the initiator raises ACK.
  965                  * Don't know how to accomplish this on the ST01/02.
  966                  */
  967 
  968 #if 0
  969                 /*
  970                  * XXX
  971                  * The st01 code doesn't wait for STAT_REQ to be deasserted.
  972                  * Is this ok?
  973                  */
  974                 for (timeout = 0; timeout < 200000L; timeout++)
  975                         if (!(STATUS & STAT_REQ))
  976                                 break;
  977                 if (STATUS & STAT_REQ)
  978                         printf("%s: timeout on wait for !STAT_REQ",
  979                             sea->sc_dev.dv_xname);
  980 #endif
  981         } while (--c);
  982 
  983         *count = c;
  984         *data = d;
  985         tmp = STATUS;
  986         if (tmp & STAT_REQ)
  987                 *phase = tmp & PH_MASK;
  988         else
  989                 *phase = PH_INVALID;
  990 
  991         if (c && (*phase != p))
  992                 return -1;
  993         return 0;
  994 }
  995 
  996 /*
  997  * Establish I_T_L or I_T_L_Q nexus for new or existing command including
  998  * ARBITRATION, SELECTION, and initial message out for IDENTIFY and queue
  999  * messages.  Return -1 if selection could not execute for some reason, 0 if
 1000  * selection succeded or failed because the target did not respond.
 1001  */
 1002 int
 1003 sea_select(struct sea_softc *sea, struct sea_scb *scb)
 1004 {
 1005         u_char msg[3], phase;
 1006         u_char *data;
 1007         int len;
 1008         int timeout;
 1009 
 1010         CONTROL = BASE_CMD;
 1011         DATA = sea->our_id_mask;
 1012         CONTROL = (BASE_CMD & ~CMD_INTR) | CMD_START_ARB;
 1013 
 1014         /* wait for arbitration to complete */
 1015         for (timeout = 0; timeout < 3000000L; timeout++)
 1016                 if (STATUS & STAT_ARB_CMPL)
 1017                         break;
 1018         if (!(STATUS & STAT_ARB_CMPL)) {
 1019                 if (STATUS & STAT_SEL) {
 1020                         printf("%s: arbitration lost\n", sea->sc_dev.dv_xname);
 1021                         scb->flags |= SCB_ERROR;
 1022                 } else {
 1023                         printf("%s: arbitration timeout\n",
 1024                             sea->sc_dev.dv_xname);
 1025                         scb->flags |= SCB_TIMEOUT;
 1026                 }
 1027                 CONTROL = BASE_CMD;
 1028                 return -1;
 1029         }
 1030 
 1031         delay(2);
 1032         DATA = (u_char)((1 << scb->xs->sc_link->target) | sea->our_id_mask);
 1033         CONTROL =
 1034 #ifdef SEA_NOMSGS
 1035             (BASE_CMD & ~CMD_INTR) | CMD_DRVR_ENABLE | CMD_SEL;
 1036 #else
 1037             (BASE_CMD & ~CMD_INTR) | CMD_DRVR_ENABLE | CMD_SEL | CMD_ATTN;
 1038 #endif
 1039         delay(1);
 1040 
 1041         /* wait for a bsy from target */
 1042         for (timeout = 0; timeout < 2000000L; timeout++)
 1043                 if (STATUS & STAT_BSY)
 1044                         break;
 1045         if (!(STATUS & STAT_BSY)) {
 1046                 /* should return some error to the higher level driver */
 1047                 CONTROL = BASE_CMD;
 1048                 scb->flags |= SCB_TIMEOUT;
 1049                 return 0;
 1050         }
 1051 
 1052         /* Try to make the target to take a message from us */
 1053 #ifdef SEA_NOMSGS
 1054         CONTROL = (BASE_CMD & ~CMD_INTR) | CMD_DRVR_ENABLE;
 1055 #else
 1056         CONTROL = (BASE_CMD & ~CMD_INTR) | CMD_DRVR_ENABLE | CMD_ATTN;
 1057 #endif
 1058         delay(1);
 1059 
 1060         /* should start a msg_out phase */
 1061         for (timeout = 0; timeout < 2000000L; timeout++)
 1062                 if (STATUS & STAT_REQ)
 1063                         break;
 1064         /* Remove ATN. */
 1065         CONTROL = BASE_CMD | CMD_DRVR_ENABLE;
 1066         if (!(STATUS & STAT_REQ)) {
 1067                 /*
 1068                  * This should not be taken as an error, but more like an
 1069                  * unsupported feature!  Should set a flag indicating that the
 1070                  * target don't support messages, and continue without failure.
 1071                  * (THIS IS NOT AN ERROR!)
 1072                  */
 1073         } else {
 1074                 msg[0] = MSG_IDENTIFY(scb->xs->sc_link->lun, 1);
 1075                 len = 1;
 1076                 data = msg;
 1077                 phase = PH_MSGOUT;
 1078                 /* Should do test on result of sea_transfer_pio(). */
 1079                 sea_transfer_pio(sea, &phase, &len, &data);
 1080         }
 1081         if (!(STATUS & STAT_BSY))
 1082                 printf("%s: after successful arbitrate: no STAT_BSY!\n",
 1083                     sea->sc_dev.dv_xname);
 1084 
 1085         sea->nexus = scb;
 1086         sea->busy[scb->xs->sc_link->target] |= 1 << scb->xs->sc_link->lun;
 1087         /* This assignment should depend on possibility to send a message to target. */
 1088         CONTROL = BASE_CMD | CMD_DRVR_ENABLE;
 1089         /* XXX Reset pointer in command? */
 1090         return 0;
 1091 }
 1092 
 1093 /*
 1094  * Send an abort to the target.  Return 1 success, 0 on failure.
 1095  */
 1096 int
 1097 sea_abort(struct sea_softc *sea, struct sea_scb *scb)
 1098 {
 1099         struct sea_scb *tmp;
 1100         u_char msg, phase, *msgptr;
 1101         int len;
 1102 
 1103         /*
 1104          * If the command hasn't been issued yet, we simply remove it from the
 1105          * issue queue
 1106          * XXX Could avoid this loop.
 1107          */
 1108         TAILQ_FOREACH(tmp, &sea->ready_list, chain)
 1109                 if (scb == tmp) {
 1110                         TAILQ_REMOVE(&sea->ready_list, scb, chain);
 1111                         /* XXX Set some type of error result for operation. */
 1112                         return 1;
 1113                 }
 1114 
 1115         /*
 1116          * If any commands are connected, we're going to fail the abort and let
 1117          * the high level SCSI driver retry at a later time or issue a reset.
 1118          */
 1119         if (sea->nexus)
 1120                 return 0;
 1121 
 1122         /*
 1123          * If the command is currently disconnected from the bus, and there are
 1124          * no connected commands, we reconnect the I_T_L or I_T_L_Q nexus
 1125          * associated with it, go into message out, and send an abort message.
 1126          */
 1127         TAILQ_FOREACH(tmp, &sea->nexus_list, chain)
 1128                 if (scb == tmp) {
 1129                         if (sea_select(sea, scb))
 1130                                 return 0;
 1131 
 1132                         msg = MSG_ABORT;
 1133                         msgptr = &msg;
 1134                         len = 1;
 1135                         phase = PH_MSGOUT;
 1136                         CONTROL = BASE_CMD | CMD_ATTN;
 1137                         sea_transfer_pio(sea, &phase, &len, &msgptr);
 1138 
 1139                         TAILQ_FOREACH(tmp, &sea->nexus_list, chain)
 1140                                 if (scb == tmp) {
 1141                                         TAILQ_REMOVE(&sea->nexus_list,
 1142                                             scb, chain);
 1143                                         /* XXX Set some type of error result
 1144                                            for the operation. */
 1145                                         return 1;
 1146                                 }
 1147                 }
 1148 
 1149         /* Command not found in any queue; race condition? */
 1150         return 1;
 1151 }
 1152 
 1153 void
 1154 sea_done(struct sea_softc *sea, struct sea_scb *scb)
 1155 {
 1156         struct scsi_xfer *xs = scb->xs;
 1157 
 1158         timeout_del(&scb->xs->stimeout);
 1159 
 1160         xs->resid = scb->datalen;
 1161 
 1162         /* XXXX need to get status */
 1163         if (scb->flags == SCB_ACTIVE) {
 1164                 xs->resid = 0;
 1165         } else {
 1166                 if (scb->flags & (SCB_TIMEOUT | SCB_ABORTED))
 1167                         xs->error = XS_TIMEOUT;
 1168                 if (scb->flags & SCB_ERROR)
 1169                         xs->error = XS_DRIVER_STUFFUP;
 1170         }
 1171         xs->flags |= ITSDONE;
 1172         sea_free_scb(sea, scb, xs->flags);
 1173         scsi_done(xs);
 1174 }
 1175 
 1176 /*
 1177  * Wait for completion of command in polled mode.
 1178  */
 1179 int
 1180 sea_poll(struct sea_softc *sea, struct scsi_xfer *xs, int count)
 1181 {
 1182         int s;
 1183 
 1184         while (count) {
 1185                 /* try to do something */
 1186                 s = splbio();
 1187                 if (!main_running)
 1188                         sea_main();
 1189                 splx(s);
 1190                 if (xs->flags & ITSDONE)
 1191                         return 0;
 1192                 delay(1000);
 1193                 count--;
 1194         }
 1195         return 1;
 1196 }
 1197 
 1198 /*
 1199  * Do the transfer.  We know we are connected.  Update the flags, and call
 1200  * sea_done() when task accomplished.  Dialog controlled by the target.
 1201  */
 1202 void
 1203 sea_information_transfer(struct sea_softc *sea)
 1204 {
 1205         int timeout;
 1206         u_char msgout = MSG_NOOP;
 1207         int len;
 1208         int s;
 1209         u_char *data;
 1210         u_char phase, tmp, old_phase = PH_INVALID;
 1211         struct sea_scb *scb = sea->nexus;
 1212         int loop;
 1213 
 1214         for (timeout = 0; timeout < 10000000L; timeout++) {
 1215                 tmp = STATUS;
 1216                 if (tmp & STAT_PARITY)
 1217                         printf("%s: parity error detected\n",
 1218                             sea->sc_dev.dv_xname);
 1219                 if (!(tmp & STAT_BSY)) {
 1220                         for (loop = 0; loop < 20; loop++)
 1221                                 if ((tmp = STATUS) & STAT_BSY)
 1222                                         break;
 1223                         if (!(tmp & STAT_BSY)) {
 1224                                 printf("%s: !STAT_BSY unit in data transfer!\n",
 1225                                     sea->sc_dev.dv_xname);
 1226                                 s = splbio();
 1227                                 sea->nexus = NULL;
 1228                                 scb->flags = SCB_ERROR;
 1229                                 splx(s);
 1230                                 sea_done(sea, scb);
 1231                                 return;
 1232                         }
 1233                 }
 1234 
 1235                 /* we only have a valid SCSI phase when REQ is asserted */
 1236                 if (!(tmp & STAT_REQ))
 1237                         continue;
 1238 
 1239                 if (sea->type == FDOMAIN840)
 1240                         tmp = ((tmp & 0x08) >> 2) |
 1241                               ((tmp & 0x02) << 2) |
 1242                                (tmp & 0xf5);
 1243                 phase = tmp & PH_MASK;
 1244                 if (phase != old_phase)
 1245                         old_phase = phase;
 1246 
 1247                 switch (phase) {
 1248                 case PH_DATAOUT:
 1249 #ifdef SEA_NODATAOUT
 1250                         printf("%s: SEA_NODATAOUT set, attempted DATAOUT aborted\n",
 1251                             sea->sc_dev.dv_xname);
 1252                         msgout = MSG_ABORT;
 1253                         CONTROL = BASE_CMD | CMD_ATTN;
 1254                         break;
 1255 #endif
 1256                 case PH_DATAIN:
 1257                         if (!scb->data)
 1258                                 printf("no data address!\n");
 1259 #ifdef SEA_BLINDTRANSFER
 1260                         if (scb->datalen && !(scb->datalen % BLOCK_SIZE)) {
 1261                                 while (scb->datalen) {
 1262                                         for (loop = 0; loop < 50000; loop++)
 1263                                                 if ((tmp = STATUS) & STAT_REQ)
 1264                                                         break;
 1265                                         if (!(tmp & STAT_REQ)) {
 1266                                                 printf("%s: timeout waiting for STAT_REQ\n",
 1267                                                     sea->sc_dev.dv_xname);
 1268                                                 /* XXX Do something? */
 1269                                         }
 1270                                         if (sea->type == FDOMAIN840)
 1271                                                 tmp = ((tmp & 0x08) >> 2) |
 1272                                                       ((tmp & 0x02) << 2) |
 1273                                                        (tmp & 0xf5);
 1274                                         if ((tmp & PH_MASK) != phase)
 1275                                                 break;
 1276                                         if (!(phase & STAT_IO)) {
 1277                                                 int block = BLOCK_SIZE;
 1278                                                 void *a = sea->maddr_dr;
 1279 #ifdef SEA_ASSEMBLER
 1280                                                 asm("shr $2, %%ecx\n\t\
 1281                                                     cld\n\t\
 1282                                                     rep\n\t\
 1283                                                     movsl" :
 1284                                                     "=S" (scb->data),
 1285                                                         "=c" (block) ,
 1286                                                     "=D" (a) :
 1287                                                     "0" (scb->data),
 1288                                                     "2" (a),
 1289                                                     "1" (block) );
 1290 #else
 1291                                                 for (count = 0;
 1292                                                     count < BLOCK_SIZE;
 1293                                                     count++)
 1294                                                         DATA = *(scb->data++);
 1295 #endif
 1296                                         } else {
 1297                                                 int block = BLOCK_SIZE;
 1298                                                 void *a = sea->maddr_dr;
 1299 #ifdef SEA_ASSEMBLER
 1300                                                 asm("shr $2, %%ecx\n\t\
 1301                                                     cld\n\t\
 1302                                                     rep\n\t\
 1303                                                     movsl" :
 1304                                                     "=D" (scb->data), "=c" (block) ,
 1305                                                     "=S" (a) :
 1306                                                     "0" (scb->data),
 1307                                                         "2" (a) ,
 1308                                                     "1" (block) );
 1309 #else
 1310                                                 for (count = 0;
 1311                                                     count < BLOCK_SIZE;
 1312                                                     count++)
 1313                                                         *(scb->data++) = DATA;
 1314 #endif
 1315                                         }
 1316                                         scb->datalen -= BLOCK_SIZE;
 1317                                 }
 1318                         }
 1319 #endif
 1320                         if (scb->datalen)
 1321                                 sea_transfer_pio(sea, &phase, &scb->datalen,
 1322                                     &scb->data);
 1323                         break;
 1324                 case PH_MSGIN:
 1325                         /* Multibyte messages should not be present here. */
 1326                         len = 1;
 1327                         data = &tmp;
 1328                         sea_transfer_pio(sea, &phase, &len, &data);
 1329                         /* scb->MessageIn = tmp; */
 1330 
 1331                         switch (tmp) {
 1332                         case MSG_ABORT:
 1333                                 scb->flags = SCB_ABORTED;
 1334                                 printf("sea: command aborted by target\n");
 1335                                 CONTROL = BASE_CMD;
 1336                                 sea_done(sea, scb);
 1337                                 return;
 1338                         case MSG_CMDCOMPLETE:
 1339                                 s = splbio();
 1340                                 sea->nexus = NULL;
 1341                                 splx(s);
 1342                                 sea->busy[scb->xs->sc_link->target] &=
 1343                                     ~(1 << scb->xs->sc_link->lun);
 1344                                 CONTROL = BASE_CMD;
 1345                                 sea_done(sea, scb);
 1346                                 return;
 1347                         case MSG_MESSAGE_REJECT:
 1348                                 printf("%s: message_reject received\n",
 1349                                     sea->sc_dev.dv_xname);
 1350                                 break;
 1351                         case MSG_DISCONNECT:
 1352                                 s = splbio();
 1353                                 TAILQ_INSERT_TAIL(&sea->nexus_list,
 1354                                     scb, chain);
 1355                                 sea->nexus = NULL;
 1356                                 CONTROL = BASE_CMD;
 1357                                 splx(s);
 1358                                 return;
 1359                         case MSG_SAVEDATAPOINTER:
 1360                         case MSG_RESTOREPOINTERS:
 1361                                 /* save/restore of pointers are ignored */
 1362                                 break;
 1363                         default:
 1364                                 /*
 1365                                  * This should be handled in the pio data
 1366                                  * transfer phase, as the ATN should be raised
 1367                                  * before ACK goes false when rejecting a
 1368                                  * message.
 1369                                  */
 1370                                 printf("%s: unknown message in: %x\n",
 1371                                     sea->sc_dev.dv_xname, tmp);
 1372                                 break;
 1373                         } /* switch (tmp) */
 1374                         break;
 1375                 case PH_MSGOUT:
 1376                         len = 1;
 1377                         data = &msgout;
 1378                         /* sea->last_message = msgout; */
 1379                         sea_transfer_pio(sea, &phase, &len, &data);
 1380                         if (msgout == MSG_ABORT) {
 1381                                 printf("%s: sent message abort to target\n",
 1382                                     sea->sc_dev.dv_xname);
 1383                                 s = splbio();
 1384                                 sea->busy[scb->xs->sc_link->target] &=
 1385                                     ~(1 << scb->xs->sc_link->lun);
 1386                                 sea->nexus = NULL;
 1387                                 scb->flags = SCB_ABORTED;
 1388                                 splx(s);
 1389                                 /* enable interrupt from scsi */
 1390                                 sea_done(sea, scb);
 1391                                 return;
 1392                         }
 1393                         msgout = MSG_NOOP;
 1394                         break;
 1395                 case PH_CMD:
 1396                         len = scb->xs->cmdlen;
 1397                         data = (char *) scb->xs->cmd;
 1398                         sea_transfer_pio(sea, &phase, &len, &data);
 1399                         break;
 1400                 case PH_STAT:
 1401                         len = 1;
 1402                         data = &tmp;
 1403                         sea_transfer_pio(sea, &phase, &len, &data);
 1404                         scb->xs->status = tmp;
 1405                         break;
 1406                 default:
 1407                         printf("sea: unknown phase\n");
 1408                 } /* switch (phase) */
 1409         } /* for (...) */
 1410 
 1411         /* If we get here we have got a timeout! */
 1412         printf("%s: timeout in data transfer\n", sea->sc_dev.dv_xname);
 1413         scb->flags = SCB_TIMEOUT;
 1414         /* XXX Should I clear scsi-bus state? */
 1415         sea_done(sea, scb);
 1416 }

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