[BACK]Return to osiopvar.h CVS log [TXT][DIR] Up to [local] / sys / dev / ic

Annotation of sys/dev/ic/osiopvar.h, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: osiopvar.h,v 1.10 2007/04/13 18:34:48 krw Exp $       */
        !             2: /*     $NetBSD: osiopvar.h,v 1.3 2002/05/14 02:58:35 matt Exp $        */
        !             3:
        !             4: /*
        !             5:  * Copyright (c) 2001 Izumi Tsutsui.  All rights reserved.
        !             6:  *
        !             7:  * Redistribution and use in source and binary forms, with or without
        !             8:  * modification, are permitted provided that the following conditions
        !             9:  * are met:
        !            10:  * 1. Redistributions of source code must retain the above copyright
        !            11:  *    notice, this list of conditions and the following disclaimer.
        !            12:  * 2. Redistributions in binary form must reproduce the above copyright
        !            13:  *    notice, this list of conditions and the following disclaimer in the
        !            14:  *    documentation and/or other materials provided with the distribution.
        !            15:  * 3. The name of the author may not be used to endorse or promote products
        !            16:  *    derived from this software without specific prior written permission.
        !            17:  *
        !            18:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
        !            19:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
        !            20:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
        !            21:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
        !            22:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
        !            23:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
        !            24:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
        !            25:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        !            26:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
        !            27:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        !            28:  */
        !            29:
        !            30: /*
        !            31:  * Copyright (c) 1990 The Regents of the University of California.
        !            32:  * All rights reserved.
        !            33:  *
        !            34:  * This code is derived from software contributed to Berkeley by
        !            35:  * Van Jacobson of Lawrence Berkeley Laboratory.
        !            36:  *
        !            37:  * Redistribution and use in source and binary forms, with or without
        !            38:  * modification, are permitted provided that the following conditions
        !            39:  * are met:
        !            40:  * 1. Redistributions of source code must retain the above copyright
        !            41:  *    notice, this list of conditions and the following disclaimer.
        !            42:  * 2. Redistributions in binary form must reproduce the above copyright
        !            43:  *    notice, this list of conditions and the following disclaimer in the
        !            44:  *    documentation and/or other materials provided with the distribution.
        !            45:  * 3. Neither the name of the University nor the names of its contributors
        !            46:  *    may be used to endorse or promote products derived from this software
        !            47:  *    without specific prior written permission.
        !            48:  *
        !            49:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
        !            50:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            51:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            52:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
        !            53:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            54:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            55:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            56:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            57:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        !            58:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            59:  * SUCH DAMAGE.
        !            60:  *
        !            61:  *     @(#)siopvar.h   7.1 (Berkeley) 5/8/90
        !            62:  */
        !            63:
        !            64: #define osiop_read_1(sc, reg)                                  \
        !            65:     bus_space_read_1((sc)->sc_bst, (sc)->sc_reg, reg)
        !            66: #define osiop_write_1(sc, reg, val)                            \
        !            67:     bus_space_write_1((sc)->sc_bst, (sc)->sc_reg, reg, val)
        !            68:
        !            69: #define osiop_read_4(sc, reg)                                  \
        !            70:     bus_space_read_4((sc)->sc_bst, (sc)->sc_reg, reg)
        !            71: #define osiop_write_4(sc, reg, val)                            \
        !            72:     bus_space_write_4((sc)->sc_bst, (sc)->sc_reg, reg, val)
        !            73:
        !            74: /*
        !            75:  * The largest single request will be MAXPHYS bytes which will require
        !            76:  * at most MAXPHYS/NBPG+1 chain elements to describe, i.e. if none of
        !            77:  * the buffer pages are physically contiguous (MAXPHYS/NBPG) and the
        !            78:  * buffer is not page aligned (+1).
        !            79:  */
        !            80: /* XXX This should be (MAXPHYS / NBPG + 1), but hardcoded in script */
        !            81: #define OSIOP_NSG      (16 + 1)
        !            82: #if MAXPHYS > (PAGE_SIZE * (OSIOP_NSG - 1))
        !            83: #define OSIOP_MAX_XFER (PAGE_SIZE * (OSIOP_NSG - 1))
        !            84: #else
        !            85: #define OSIOP_MAX_XFER MAXPHYS
        !            86: #endif
        !            87:
        !            88: #define OSIOP_NTGT 8
        !            89: #define OSIOP_NACB 32  /* XXX (PAGE_SIZE / sizeof(osiop_ds)) is better? */
        !            90:
        !            91: /*
        !            92:  * Data Structure for SCRIPTS program
        !            93:  */
        !            94: typedef struct buf_table {
        !            95:        u_int32_t count;
        !            96:        u_int32_t addr;
        !            97: } buf_table_t;
        !            98:
        !            99: struct osiop_ds {
        !           100:        u_int32_t scsi_addr;            /* SCSI ID & sync */
        !           101:        u_int32_t pad1;
        !           102:        buf_table_t id;                 /* Identify message */
        !           103:        buf_table_t cmd;                /* SCSI command */
        !           104:        buf_table_t status;             /* Status */
        !           105:        buf_table_t msg;                /* Message */
        !           106:        buf_table_t msgin;              /* Message in */
        !           107:        buf_table_t extmsg;             /* Extended message in */
        !           108:        buf_table_t synmsg;             /* Sync transfer request */
        !           109:        buf_table_t data[OSIOP_NSG];    /* DMA S/G buffers */
        !           110:
        !           111:        u_int8_t msgout[8];
        !           112:        u_int8_t msgbuf[8];
        !           113:        u_int8_t stat[8];
        !           114:
        !           115:        struct scsi_generic scsi_cmd;   /* DMA'able copy of xs->cmd */
        !           116:        u_int32_t pad[1+3];             /* pad to 256 bytes */
        !           117: } __packed;
        !           118:
        !           119: /* status can hold the SCSI_* status values, and 2 additional values: */
        !           120: #define SCSI_OSIOP_NOCHECK     0xfe    /* don't check the scsi status */
        !           121: #define SCSI_OSIOP_NOSTATUS    0xff    /* device didn't report status */
        !           122:
        !           123: #define MSG_INVALID            0xff    /* dummy value for message buffer */
        !           124:
        !           125: #define OSIOP_DSOFF(x)         offsetof(struct osiop_ds, x)
        !           126: #define OSIOP_DSIDOFF          OSIOP_DSOFF(msgout[0])
        !           127: #define OSIOP_DSMSGOFF         OSIOP_DSOFF(msgbuf[0])
        !           128: #define OSIOP_DSMSGINOFF       OSIOP_DSOFF(msgbuf[1])
        !           129: #define OSIOP_DSEXTMSGOFF      OSIOP_DSOFF(msgbuf[2])
        !           130: #define OSIOP_DSSYNMSGOFF      OSIOP_DSOFF(msgbuf[3])
        !           131: #define OSIOP_DSSTATOFF                OSIOP_DSOFF(stat[0])
        !           132: #define OSIOP_DSCMDOFF         OSIOP_DSOFF(scsi_cmd)
        !           133:
        !           134: /*
        !           135:  * ACB. Holds additional information for each SCSI command Comments:
        !           136:  * Basicly, we refrain from fiddling with the scsi_xfer struct
        !           137:  * (except do the expected updating of return values).
        !           138:  * We'll generally update: xs->{flags,resid,error,status} and
        !           139:  * occasionally xs->retries.
        !           140:  */
        !           141: struct osiop_acb {
        !           142:        TAILQ_ENTRY(osiop_acb) chain;
        !           143:        struct scsi_xfer *xs;   /* SCSI xfer ctrl block from upper layer */
        !           144:        struct osiop_softc *sc; /* points back to our adapter */
        !           145:
        !           146:        bus_dmamap_t datadma;   /* DMA map for data transfer */
        !           147:
        !           148:        struct osiop_ds *ds;    /* data structure for this acb */
        !           149:        bus_size_t dsoffset;    /* offset of data structure for this acb */
        !           150:
        !           151:        int     xsflags;        /* copy of xs->flags */
        !           152:        int     datalen;
        !           153:        void *data;             /* transfer data buffer ptr */
        !           154:
        !           155:        bus_addr_t curaddr;     /* current transfer data buffer */
        !           156:        bus_size_t curlen;      /* current transfer data length */
        !           157:
        !           158:        int status;             /* status of this acb */
        !           159: /* status defs */
        !           160: #define ACB_S_FREE     0       /* cmd slot is free */
        !           161: #define ACB_S_READY    1       /* cmd slot is waiting for processing */
        !           162: #define ACB_S_ACTIVE   2       /* cmd slot is being processed */
        !           163: #define ACB_S_DONE     3       /* cmd slot has been processed */
        !           164:
        !           165:        int flags;              /* cmd slot flags */
        !           166: #define ACB_F_TIMEOUT  0x01    /* command timeout */
        !           167: #define ACB_F_AUTOSENSE 0x02   /* request sense due to SCSI_CHECK */
        !           168:
        !           169:        u_int8_t intstat;       /* buffer to save sc_flags on disconnect */
        !           170: };
        !           171:
        !           172: /*
        !           173:  * Some info about each (possible) target on the SCSI bus.  This should
        !           174:  * probably have been a "per target+lunit" structure, but we'll leave it at
        !           175:  * this for now.  Is there a way to reliably hook it up to sc->fordriver??
        !           176:  */
        !           177: struct osiop_tinfo {
        !           178:        int cmds;               /* number of commands processed */
        !           179:        int senses;             /* number of sense requests */
        !           180:        int dconns;             /* number of disconnects */
        !           181:        int touts;              /* number of timeouts */
        !           182:        int perrs;              /* number of parity errors */
        !           183:        int lubusy;             /* What local units/subr. are busy? */
        !           184:        int period;             /* Period suggestion */
        !           185:        int offset;             /* Offset suggestion */
        !           186:        int flags;              /* misc flags per each target */
        !           187: #define TI_NOSYNC      0x01    /* disable sync xfer on this target */
        !           188: #define TI_NODISC      0x02    /* disable disconnect on this target */
        !           189:        int state;              /* negotiation state */
        !           190:        u_int8_t sxfer;         /* value for SXFER reg */
        !           191:        u_int8_t sbcl;          /* value for SBCL reg */
        !           192: };
        !           193:
        !           194: struct osiop_softc {
        !           195:        struct device sc_dev;
        !           196:
        !           197:        bus_space_tag_t sc_bst;         /* bus space tag */
        !           198:        bus_space_handle_t sc_reg;      /* register I/O handle */
        !           199:
        !           200:        bus_dma_tag_t sc_dmat;          /* bus dma tag */
        !           201:        bus_dmamap_t sc_scrdma;         /* script dma map */
        !           202:        bus_dmamap_t sc_dsdma;          /* script data dma map */
        !           203:
        !           204:        u_int32_t *sc_script;           /* ptr to script memory */
        !           205:        struct osiop_ds *sc_ds;         /* ptr to data structure memory */
        !           206:
        !           207:        int sc_id;                      /* adapter SCSI id */
        !           208:        int sc_active;                  /* number of active I/O's */
        !           209:
        !           210:        struct osiop_acb *sc_nexus;     /* current command */
        !           211:        struct osiop_acb *sc_acb;       /* the real command blocks */
        !           212:
        !           213:        /* Lists of command blocks */
        !           214:        TAILQ_HEAD(acb_list, osiop_acb) free_list,
        !           215:                                        ready_list,
        !           216:                                        nexus_list;
        !           217:
        !           218:        struct scsi_link    sc_link;
        !           219:
        !           220:        struct osiop_tinfo sc_tinfo[OSIOP_NTGT];
        !           221:
        !           222:        int sc_clock_freq;
        !           223:        int sc_tcp[4];
        !           224:        int sc_flags;
        !           225: #define OSIOP_INTSOFF  0x80    /* Interrupts turned off */
        !           226: #define OSIOP_INTDEFER 0x40    /* MD interrupt has been deferred */
        !           227: #define OSIOP_NODMA    0x02    /* No DMA transfer */
        !           228: #define OSIOP_ALIVE    0x01    /* controller initialized */
        !           229:
        !           230:        int sc_cfflags;                 /* copy of config flags */
        !           231:
        !           232:        int sc_minsync;
        !           233:
        !           234:        u_int8_t sc_dstat;
        !           235:        u_int8_t sc_sstat0;
        !           236:        u_int8_t sc_sstat1;
        !           237:        u_int8_t sc_istat;
        !           238:        u_int8_t sc_dcntl;
        !           239:        u_int8_t sc_ctest7;
        !           240:        u_int8_t sc_dmode;
        !           241:        u_int8_t sc_sien;
        !           242:        u_int8_t sc_dien;
        !           243: };
        !           244:
        !           245: /* negotiation states */
        !           246: #define NEG_INIT       0       /* Initial negotiate state */
        !           247: #define NEG_SYNC       NEG_INIT /* Negotiate synch transfers */
        !           248: #define NEG_WAITS      1       /* Waiting for synch negotiation response */
        !           249: #define NEG_DONE       2       /* Wide and/or sync negotiation done */
        !           250:
        !           251: void osiop_attach(struct osiop_softc *);
        !           252: void osiop_intr(struct osiop_softc *);

CVSweb