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

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

1.1     ! nbrk        1: /*      $OpenBSD: isp_openbsd.h,v 1.26 2004/08/02 19:55:45 art Exp $ */
        !             2: /*
        !             3:  * OpenBSD Specific definitions for the Qlogic ISP Host Adapter
        !             4:  */
        !             5: /*
        !             6:  * Copyright (C) 1999, 2000, 2001 by Matthew Jacob
        !             7:  * All rights reserved.
        !             8:  *
        !             9:  * Redistribution and use in source and binary forms, with or without
        !            10:  * modification, are permitted provided that the following conditions
        !            11:  * are met:
        !            12:  * 1. Redistributions of source code must retain the above copyright
        !            13:  *    notice, this list of conditions and the following disclaimer.
        !            14:  * 2. The name of the author may not be used to endorse or promote products
        !            15:  *    derived from this software without specific prior written permission
        !            16:  *
        !            17:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
        !            18:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
        !            19:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
        !            20:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
        !            21:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
        !            22:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
        !            23:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
        !            24:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        !            25:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
        !            26:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        !            27:  */
        !            28: #ifndef        _ISP_OPENBSD_H
        !            29: #define        _ISP_OPENBSD_H
        !            30:
        !            31: #include <sys/types.h>
        !            32: #include <sys/param.h>
        !            33: #include <sys/systm.h>
        !            34: #include <sys/kernel.h>
        !            35: #include <sys/errno.h>
        !            36: #include <sys/ioctl.h>
        !            37: #include <sys/device.h>
        !            38: #include <sys/malloc.h>
        !            39: #include <sys/buf.h>
        !            40: #include <sys/proc.h>
        !            41: #include <sys/user.h>
        !            42: #include <sys/queue.h>
        !            43:
        !            44: #if    !(defined(__sparc__) && !defined(__sparcv9__))
        !            45: #include <machine/bus.h>
        !            46: #endif
        !            47:
        !            48: #include <scsi/scsi_all.h>
        !            49: #include <scsi/scsiconf.h>
        !            50:
        !            51: #include <scsi/scsi_message.h>
        !            52: #include <scsi/scsi_debug.h>
        !            53:
        !            54: #include <uvm/uvm_extern.h>
        !            55:
        !            56: /*
        !            57:  * Efficiency- get rid of SBus code && tests unless we need them.
        !            58:  */
        !            59: #if    defined(__sparcv9__ ) || defined(__sparc__)
        !            60: #define        ISP_SBUS_SUPPORTED      1
        !            61: #else
        !            62: #define        ISP_SBUS_SUPPORTED      0
        !            63: #endif
        !            64:
        !            65: #define        ISP_PLATFORM_VERSION_MAJOR      2
        !            66: #define        ISP_PLATFORM_VERSION_MINOR      1
        !            67:
        !            68: struct isposinfo {
        !            69:        struct device           _dev;
        !            70:        struct scsi_link        _link[2];
        !            71:        struct scsi_adapter     _adapter;
        !            72:        int                     hiwater;
        !            73:        int                     splsaved;
        !            74:        int                     mboxwaiting;
        !            75:        u_int32_t               islocked;
        !            76:        u_int32_t               onintstack;
        !            77: #if    !(defined(__sparc__) && !defined(__sparcv9__))
        !            78:        bus_dma_tag_t           dmatag;
        !            79:        bus_dmamap_t            rqdmap;
        !            80:        bus_dmamap_t            rsdmap;
        !            81:        bus_dmamap_t            scdmap; /* FC only */
        !            82: #define        isp_dmatag              isp_osinfo.dmatag
        !            83: #define        isp_rqdmap              isp_osinfo.rqdmap
        !            84: #define        isp_rsdmap              isp_osinfo.rsdmap
        !            85: #define        isp_scdmap              isp_osinfo.scdmap
        !            86: #endif
        !            87:        unsigned int            : 28,
        !            88:
        !            89:                rtpend          : 1,
        !            90:                no_mbox_ints    : 1,
        !            91:                blocked         : 2;
        !            92:        union {
        !            93:                u_int64_t       _wwn;
        !            94:                u_int16_t       _discovered[2];
        !            95:        } un;
        !            96: #define        discovered      un._discovered
        !            97:        struct scsi_xfer        *wqf, *wqt;
        !            98:        struct timeout rqt;
        !            99: };
        !           100: #define        MUST_POLL(isp)  \
        !           101:        (isp->isp_osinfo.onintstack || isp->isp_osinfo.no_mbox_ints)
        !           102:
        !           103: /*
        !           104:  * Locking macros...
        !           105:  */
        !           106: #define        ISP_LOCK                isp_lock
        !           107: #define        ISP_UNLOCK              isp_unlock
        !           108:
        !           109: /*
        !           110:  * Required Macros/Defines
        !           111:  */
        !           112:
        !           113: #define        INLINE                  __inline
        !           114:
        !           115: /* We don't want expensive inline functions. */
        !           116: #define EXP_INLINE
        !           117:
        !           118: #define        ISP2100_SCRLEN          0x800
        !           119:
        !           120: #define        MEMZERO                 bzero
        !           121: #define        MEMCPY(dst, src, amt)   bcopy((src), (dst), (amt))
        !           122: #define        SNPRINTF                snprintf
        !           123: #define        USEC_DELAY(x)           delay(x)
        !           124: #define        USEC_SLEEP(isp, x)              \
        !           125:        if (!MUST_POLL(isp))            \
        !           126:                ISP_UNLOCK(isp);        \
        !           127:        delay(x);                       \
        !           128:        if (!MUST_POLL(isp))            \
        !           129:                ISP_LOCK(isp)
        !           130:
        !           131: #define        NANOTIME_T              struct timespec
        !           132: #define        GET_NANOTIME            nanotime
        !           133: #define        GET_NANOSEC(x)          (((x)->tv_sec * 1000000000 + (x)->tv_nsec))
        !           134: #define        NANOTIME_SUB            isp_nanotime_sub
        !           135:
        !           136: #define        MAXISPREQUEST(isp)      256
        !           137:
        !           138: #if    !(defined(__sparc__) && !defined(__sparcv9__))
        !           139: #define        MEMORYBARRIER(isp, type, offset, size)                  \
        !           140: switch (type) {                                                        \
        !           141: case SYNC_REQUEST:                                             \
        !           142: {                                                              \
        !           143:        off_t off = (off_t) offset * QENTRY_LEN;                \
        !           144:        bus_dmamap_sync(isp->isp_dmatag, isp->isp_rqdmap,       \
        !           145:            off, size, BUS_DMASYNC_PREWRITE);                   \
        !           146:        break;                                                  \
        !           147: }                                                              \
        !           148: case SYNC_RESULT:                                              \
        !           149: {                                                              \
        !           150:        off_t off = (off_t) offset * QENTRY_LEN;                \
        !           151:        bus_dmamap_sync(isp->isp_dmatag, isp->isp_rsdmap,       \
        !           152:            off, size, BUS_DMASYNC_POSTREAD);                   \
        !           153:        break;                                                  \
        !           154: }                                                              \
        !           155: case SYNC_SFORDEV:                                             \
        !           156: {                                                              \
        !           157:        off_t off = (off_t) offset;                             \
        !           158:        bus_dmamap_sync(isp->isp_dmatag, isp->isp_scdmap,       \
        !           159:            off, size, BUS_DMASYNC_PREWRITE);                   \
        !           160:        break;                                                  \
        !           161: }                                                              \
        !           162: case SYNC_SFORCPU:                                             \
        !           163: {                                                              \
        !           164:        off_t off = (off_t) offset;                             \
        !           165:        bus_dmamap_sync(isp->isp_dmatag, isp->isp_scdmap,       \
        !           166:            off, size, BUS_DMASYNC_POSTREAD);                   \
        !           167:        break;                                                  \
        !           168: }                                                              \
        !           169: case SYNC_REG:                                                 \
        !           170: default:                                                       \
        !           171:        break;                                                  \
        !           172: }
        !           173: #else
        !           174: #define        MEMORYBARRIER(isp, type, offset, size)
        !           175: #endif
        !           176:
        !           177: #define        MBOX_ACQUIRE(isp)
        !           178: #define        MBOX_WAIT_COMPLETE              isp_wait_complete
        !           179:
        !           180: #define        MBOX_NOTIFY_COMPLETE(isp)                                       \
        !           181:        if (isp->isp_osinfo.mboxwaiting) {                              \
        !           182:                 isp->isp_osinfo.mboxwaiting = 0;                       \
        !           183:                 wakeup(&isp->isp_osinfo.mboxwaiting);                  \
        !           184:         }                                                              \
        !           185:        isp->isp_mboxbsy = 0
        !           186:
        !           187: #define        MBOX_RELEASE(isp)
        !           188:
        !           189: #define        FC_SCRATCH_ACQUIRE(isp)
        !           190: #define        FC_SCRATCH_RELEASE(isp)
        !           191:
        !           192: #ifndef        SCSI_GOOD
        !           193: #define        SCSI_GOOD       0x0
        !           194: #endif
        !           195: #ifndef        SCSI_CHECK
        !           196: #define        SCSI_CHECK      0x2
        !           197: #endif
        !           198: #ifndef        SCSI_BUSY
        !           199: #define        SCSI_BUSY       0x8
        !           200: #endif
        !           201: #ifndef        SCSI_QFULL
        !           202: #define        SCSI_QFULL      0x28
        !           203: #endif
        !           204:
        !           205: #define        XS_T                    struct scsi_xfer
        !           206: #define        XS_CHANNEL(xs)          (((xs)->sc_link->flags & SDEV_2NDBUS)? 1 : 0)
        !           207: #define        XS_ISP(xs)              (xs)->sc_link->adapter_softc
        !           208: #define        XS_LUN(xs)              ((int) (xs)->sc_link->lun)
        !           209: #define        XS_TGT(xs)              ((int) (xs)->sc_link->target)
        !           210: #define        XS_CDBP(xs)             ((caddr_t) (xs)->cmd)
        !           211: #define        XS_CDBLEN(xs)           (xs)->cmdlen
        !           212: #define        XS_XFRLEN(xs)           (xs)->datalen
        !           213: #define        XS_TIME(xs)             (xs)->timeout
        !           214: #define        XS_RESID(xs)            (xs)->resid
        !           215: #define        XS_STSP(xs)             (&(xs)->status)
        !           216: #define        XS_SNSP(xs)             (&(xs)->sense)
        !           217: #define        XS_SNSLEN(xs)           (sizeof (xs)->sense)
        !           218: #define        XS_SNSKEY(xs)           ((xs)->sense.flags)
        !           219: #define        XS_TAG_P(xs)            (((xs)->flags & SCSI_POLL) != 0)
        !           220: #define        XS_TAG_TYPE(xs)         REQFLAG_STAG
        !           221:
        !           222: #define        XS_SETERR(xs, v)        (xs)->error = v
        !           223:
        !           224: #      define  HBA_NOERROR             XS_NOERROR
        !           225: #      define  HBA_BOTCH               XS_DRIVER_STUFFUP
        !           226: #      define  HBA_CMDTIMEOUT          XS_TIMEOUT
        !           227: #      define  HBA_SELTIMEOUT          XS_SELTIMEOUT
        !           228: #      define  HBA_TGTBSY              XS_BUSY
        !           229: #      define  HBA_BUSRESET            XS_RESET
        !           230: #      define  HBA_ABORTED             XS_DRIVER_STUFFUP
        !           231: #      define  HBA_DATAOVR             XS_DRIVER_STUFFUP
        !           232: #      define  HBA_ARQFAIL             XS_DRIVER_STUFFUP
        !           233:
        !           234: #define        XS_ERR(xs)              (xs)->error
        !           235:
        !           236: #define        XS_NOERR(xs)            (xs)->error == XS_NOERROR
        !           237:
        !           238: #define        XS_INITERR(xs)          (xs)->error = 0, XS_CMD_S_CLEAR(xs)
        !           239:
        !           240: #define        XS_SAVE_SENSE(xs, sp)                           \
        !           241:        if (xs->error == XS_NOERROR) {                  \
        !           242:                xs->error = XS_SENSE;                   \
        !           243:        }                                               \
        !           244:        bcopy(sp->req_sense_data, &(xs)->sense,         \
        !           245:            imin(XS_SNSLEN(xs), sp->req_sense_len))
        !           246:
        !           247: #define        XS_SET_STATE_STAT(a, b, c)
        !           248:
        !           249: #define        DEFAULT_IID(x)          7
        !           250: #define        DEFAULT_LOOPID(x)       107
        !           251: #define        DEFAULT_NODEWWN(isp)    (isp)->isp_osinfo.un._wwn
        !           252: #define        DEFAULT_PORTWWN(isp)    (isp)->isp_osinfo.un._wwn
        !           253: #define        ISP_NODEWWN(isp)        FCPARAM(isp)->isp_nodewwn
        !           254: #define        ISP_PORTWWN(isp)        FCPARAM(isp)->isp_portwwn
        !           255:
        !           256: #if    BYTE_ORDER == BIG_ENDIAN
        !           257: #ifdef ISP_SBUS_SUPPORTED
        !           258: #define        ISP_IOXPUT_8(isp, s, d)         *(d) = s
        !           259: #define        ISP_IOXPUT_16(isp, s, d)                                \
        !           260:        *(d) = (isp->isp_bustype == ISP_BT_SBUS)? s : swap16(s)
        !           261: #define        ISP_IOXPUT_32(isp, s, d)                                \
        !           262:        *(d) = (isp->isp_bustype == ISP_BT_SBUS)? s : swap32(s)
        !           263:
        !           264: #define        ISP_IOXGET_8(isp, s, d)         d = (*((u_int8_t *)s))
        !           265: #define        ISP_IOXGET_16(isp, s, d)                                \
        !           266:        d = (isp->isp_bustype == ISP_BT_SBUS)?                  \
        !           267:        *((u_int16_t *)s) : swap16(*((u_int16_t *)s))
        !           268: #define        ISP_IOXGET_32(isp, s, d)                                \
        !           269:        d = (isp->isp_bustype == ISP_BT_SBUS)?                  \
        !           270:        *((u_int32_t *)s) : swap32(*((u_int32_t *)s))
        !           271: #else
        !           272: #define        ISP_IOXPUT_8(isp, s, d)         *(d) = s
        !           273: #define        ISP_IOXPUT_16(isp, s, d)        *(d) = swap16(s)
        !           274: #define        ISP_IOXPUT_32(isp, s, d)        *(d) = swap32(s)
        !           275: #define        ISP_IOXGET_8(isp, s, d)         d = (*((u_int8_t *)s))
        !           276: #define        ISP_IOXGET_16(isp, s, d)        d = swap16(*((u_int16_t *)s))
        !           277: #define        ISP_IOXGET_32(isp, s, d)        d = swap32(*((u_int32_t *)s))
        !           278: #endif
        !           279: #define        ISP_SWIZZLE_NVRAM_WORD(isp, rp) *rp = swap16(*rp)
        !           280: #else
        !           281: #define        ISP_IOXPUT_8(isp, s, d)         *(d) = s
        !           282: #define        ISP_IOXPUT_16(isp, s, d)        *(d) = s
        !           283: #define        ISP_IOXPUT_32(isp, s, d)        *(d) = s
        !           284: #define        ISP_IOXGET_8(isp, s, d)         d = *(s)
        !           285: #define        ISP_IOXGET_16(isp, s, d)        d = *(s)
        !           286: #define        ISP_IOXGET_32(isp, s, d)        d = *(s)
        !           287: #define        ISP_SWIZZLE_NVRAM_WORD(isp, rp)
        !           288: #endif
        !           289:
        !           290: /*
        !           291:  * Includes of common header files
        !           292:  */
        !           293:
        !           294: #include <dev/ic/ispreg.h>
        !           295: #include <dev/ic/ispvar.h>
        !           296: #include <dev/ic/ispmbox.h>
        !           297:
        !           298: /*
        !           299:  * isp_osinfo definitions, extensions and shorthand.
        !           300:  */
        !           301: #define        isp_name        isp_osinfo._dev.dv_xname
        !           302: #define        isp_unit        isp_osinfo._dev.dv_unit
        !           303:
        !           304: /*
        !           305:  * Driver prototypes..
        !           306:  */
        !           307: void isp_attach(struct ispsoftc *);
        !           308: void isp_uninit(struct ispsoftc *);
        !           309:
        !           310: static INLINE void isp_lock(struct ispsoftc *);
        !           311: static INLINE void isp_unlock(struct ispsoftc *);
        !           312: static INLINE u_int64_t
        !           313: isp_nanotime_sub(struct timespec *, struct timespec *);
        !           314: static void isp_wait_complete(struct ispsoftc *);
        !           315:
        !           316: /*
        !           317:  * Driver wide data...
        !           318:  */
        !           319:
        !           320: /*
        !           321:  * Platform private flags
        !           322:  */
        !           323:
        !           324: #define        XS_PSTS_INWDOG          0x10000
        !           325: #define        XS_PSTS_GRACE           0x20000
        !           326: #define        XS_PSTS_TIMED           0x40000
        !           327: #define        XS_PSTS_ALL             SCSI_PRIVATE
        !           328:
        !           329: #define        XS_CMD_S_WDOG(xs)       (xs)->flags |= XS_PSTS_INWDOG
        !           330: #define        XS_CMD_C_WDOG(xs)       (xs)->flags &= ~XS_PSTS_INWDOG
        !           331: #define        XS_CMD_WDOG_P(xs)       (((xs)->flags & XS_PSTS_INWDOG) != 0)
        !           332:
        !           333: #define        XS_CMD_S_TIMER(xs)      (xs)->flags |= XS_PSTS_TIMED
        !           334: #define        XS_CMD_C_TIMER(xs)      (xs)->flags &= ~XS_PSTS_TIMED
        !           335: #define        XS_CMD_TIMER_P(xs)      (((xs)->flags & XS_PSTS_TIMED) != 0)
        !           336:
        !           337: #define        XS_CMD_S_GRACE(xs)      (xs)->flags |= XS_PSTS_GRACE
        !           338: #define        XS_CMD_C_GRACE(xs)      (xs)->flags &= ~XS_PSTS_GRACE
        !           339: #define        XS_CMD_GRACE_P(xs)      (((xs)->flags & XS_PSTS_GRACE) != 0)
        !           340:
        !           341: #define        XS_CMD_S_DONE(xs)       (xs)->flags |= ITSDONE
        !           342: #define        XS_CMD_C_DONE(xs)       (xs)->flags &= ~ITSDONE
        !           343: #define        XS_CMD_DONE_P(xs)       (((xs)->flags & ITSDONE) != 0)
        !           344:
        !           345: #define        XS_CMD_S_CLEAR(xs)      (xs)->flags &= ~XS_PSTS_ALL
        !           346:
        !           347: /*
        !           348:  * Platform specific 'INLINE' or support functions
        !           349:  */
        !           350: static INLINE void
        !           351: isp_lock(struct ispsoftc *isp)
        !           352: {
        !           353:        int s = splbio();
        !           354:        if (isp->isp_osinfo.islocked++ == 0) {
        !           355:                isp->isp_osinfo.splsaved = s;
        !           356:        } else {
        !           357:                splx(s);
        !           358:        }
        !           359: }
        !           360:
        !           361: static INLINE void
        !           362: isp_unlock(struct ispsoftc *isp)
        !           363: {
        !           364:        if (isp->isp_osinfo.islocked-- <= 1) {
        !           365:                isp->isp_osinfo.islocked = 0;
        !           366:                splx(isp->isp_osinfo.splsaved);
        !           367:        }
        !           368: }
        !           369:
        !           370: static INLINE u_int64_t
        !           371: isp_nanotime_sub(struct timespec *b, struct timespec *a)
        !           372: {
        !           373:        struct timespec x;
        !           374:        u_int64_t elapsed;
        !           375:        timespecsub(b, a, &x);
        !           376:        elapsed = GET_NANOSEC(&x);
        !           377:        if (elapsed == 0)
        !           378:                elapsed++;
        !           379:        return (elapsed);
        !           380: }
        !           381:
        !           382: static INLINE void
        !           383: isp_wait_complete(struct ispsoftc *isp)
        !           384: {
        !           385:        int delaytime;
        !           386:        if (isp->isp_mbxwrk0)
        !           387:                delaytime = 60;
        !           388:        else
        !           389:                delaytime = 5;
        !           390:        if (MUST_POLL(isp)) {
        !           391:                int usecs = 0;
        !           392:                delaytime *= 1000000;   /* convert to usecs */
        !           393:                while (usecs < delaytime) {
        !           394:                        u_int16_t isr, sema, mbox;
        !           395:                        if (isp->isp_mboxbsy == 0) {
        !           396:                                break;
        !           397:                        }
        !           398:                        if (ISP_READ_ISR(isp, &isr, &sema, &mbox)) {
        !           399:                                isp_intr(isp, isr, sema, mbox);
        !           400:                                if (isp->isp_mboxbsy == 0) {
        !           401:                                        break;
        !           402:                                }
        !           403:                        }
        !           404:                        USEC_DELAY(500);
        !           405:                        usecs += 500;
        !           406:                }
        !           407:                if (isp->isp_mboxbsy != 0) {
        !           408:                        isp_prt(isp, ISP_LOGWARN,
        !           409:                            "Polled Mailbox Command (0x%x) Timeout",
        !           410:                            isp->isp_lastmbxcmd);
        !           411:                }
        !           412:        } else {
        !           413:                int rv = 0;
        !           414:                 isp->isp_osinfo.mboxwaiting = 1;
        !           415:                 while (isp->isp_osinfo.mboxwaiting && rv == 0) {
        !           416:                        rv = tsleep(&isp->isp_osinfo.mboxwaiting,
        !           417:                            PRIBIO, "isp_mboxcmd", delaytime * hz);
        !           418:                }
        !           419:                if (rv == EWOULDBLOCK) {
        !           420:                        isp->isp_mboxbsy = 0;
        !           421:                        isp->isp_osinfo.mboxwaiting = 0;
        !           422:                        isp_prt(isp, ISP_LOGWARN,
        !           423:                            "Interrupting Mailbox Command (0x%x) Timeout",
        !           424:                            isp->isp_lastmbxcmd);
        !           425:                }
        !           426:        }
        !           427: }
        !           428:
        !           429: /*
        !           430:  * Common INLINE functions
        !           431:  */
        !           432: #include <dev/ic/isp_inline.h>
        !           433:
        !           434: #endif /* _ISP_NETBSD_H */

CVSweb