[BACK]Return to mscp.h CVS log [TXT][DIR] Up to [local] / sys / arch / vax / mscp

Annotation of sys/arch/vax/mscp/mscp.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: mscp.h,v 1.5 2003/06/02 23:27:57 millert Exp $        */
                      2: /*     $NetBSD: mscp.h,v 1.6 1999/05/29 19:11:16 ragge Exp $   */
                      3:
                      4: /*
                      5:  * Copyright (c) 1988 Regents of the University of California.
                      6:  * All rights reserved.
                      7:  *
                      8:  * This code is derived from software contributed to Berkeley by
                      9:  * Chris Torek.
                     10:  *
                     11:  * Redistribution and use in source and binary forms, with or without
                     12:  * modification, are permitted provided that the following conditions
                     13:  * are met:
                     14:  * 1. Redistributions of source code must retain the above copyright
                     15:  *    notice, this list of conditions and the following disclaimer.
                     16:  * 2. Redistributions in binary form must reproduce the above copyright
                     17:  *    notice, this list of conditions and the following disclaimer in the
                     18:  *    documentation and/or other materials provided with the distribution.
                     19:  * 3. Neither the name of the University nor the names of its contributors
                     20:  *    may be used to endorse or promote products derived from this software
                     21:  *    without specific prior written permission.
                     22:  *
                     23:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     24:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     25:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     26:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     27:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     28:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     29:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     30:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     31:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     32:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     33:  * SUCH DAMAGE.
                     34:  *
                     35:  *     @(#)mscp.h      7.5 (Berkeley) 6/28/90
                     36:  */
                     37:
                     38: /*
                     39:  * Definitions for the Mass Storage Control Protocol
                     40:  * I WISH I KNEW WHAT MORE OF THESE WERE.  IT SURE WOULD BE NICE
                     41:  * IF DEC SOLD DOCUMENTATION FOR THEIR OWN CONTROLLERS.
                     42:  */
                     43:
                     44: /*
                     45:  * Control message opcodes
                     46:  */
                     47: #define M_OP_ABORT     0x01    /* Abort command */
                     48: #define M_OP_GETCMDST  0x02    /* Get command status command */
                     49: #define M_OP_GETUNITST 0x03    /* Get unit status command */
                     50: #define M_OP_SETCTLRC  0x04    /* Set controller characteristics command */
                     51: #define M_OP_SEREX     0x07    /* Serious exception end message */
                     52: #define M_OP_AVAILABLE 0x08    /* Available command */
                     53: #define M_OP_ONLINE    0x09    /* Online command */
                     54: #define M_OP_SETUNITC  0x0a    /* Set unit characteristics command */
                     55: #define M_OP_DTACCPATH 0x0b    /* Determine access paths command */
                     56: #define M_OP_ACCESS    0x10    /* Access command */
                     57: #define M_OP_COMPCD    0x11    /* Compare controller data command */
                     58: #define M_OP_ERASE     0x12    /* Erase command */
                     59: #define M_OP_FLUSH     0x13    /* Flush command */
                     60: #define M_OP_REPLACE   0x14    /* Replace command */
                     61: #define M_OP_COMPHD    0x20    /* Compare host data command */
                     62: #define M_OP_READ      0x21    /* Read command */
                     63: #define M_OP_WRITE     0x22    /* Write command */
                     64: #define M_OP_WRITM     0x24    /* Write mark command */
                     65: #define M_OP_POS       0x25    /* Positioning command */
                     66: #define M_OP_AVAILATTN 0x40    /* Available attention message */
                     67: #define M_OP_DUPUNIT   0x41    /* Duplicate unit number attention message */
                     68: #define M_OP_ACCPATH   0x42    /* Access path attention message */
                     69: #define M_OP_END       0x80    /* End message flag */
                     70:
                     71:
                     72: /*
                     73:  * Generic command modifiers
                     74:  */
                     75: #define M_MD_EXPRS     0x8000  /* Express request */
                     76: #define M_MD_COMP      0x4000  /* Compare */
                     77: #define M_MD_CLSEX     0x2000  /* Clear serious exception */
                     78: #define M_MD_ERROR     0x1000  /* Force error */
                     79: #define M_MD_SCCHH     0x0800  /* Suppress caching (high speed) */
                     80: #define M_MD_SCCHL     0x0400  /* Suppress caching (low speed) */
                     81: #define M_MD_SECOR     0x0200  /* Suppress error correction */
                     82: #define M_MD_SEREC     0x0100  /* Suppress error recovery */
                     83: #define M_MD_SSHDW     0x0080  /* Suppress shadowing */
                     84: #define M_MD_WBKNV     0x0040  /* Write back (non-volatile) */
                     85: #define M_MD_WBKVL     0x0020  /* Write back (volatile) */
                     86: #define M_MD_WRSEQ     0x0010  /* Write shadow set one unit at a time */
                     87:
                     88: /*
                     89:  * tape command modifiers
                     90:  */
                     91: #define M_MD_IMMEDIATE 0x0040  /* Immediate completion */
                     92: #define M_MD_UNLOAD    0x0010  /* Unload tape */
                     93: #define M_MD_REVERSE   0x0008  /* Reverse action */
                     94: #define M_MD_OBJCOUNT  0x0004  /* Object count */
                     95: #define M_MD_REWIND    0x0002  /* Rewind */
                     96:
                     97: /*
                     98:  * AVAILABLE command modifiers
                     99:  */
                    100: #define M_AVM_ALLCD    0x0002  /* All class drivers */
                    101: #define M_AVM_SPINDOWN 0x0001  /* Spin down */
                    102:
                    103: /*
                    104:  * FLUSH command modifiers
                    105:  */
                    106: #define M_FLM_FLUSHENU 0x0001  /* Flush entire unit */
                    107: #define M_FLM_VOLATILE 0x0002  /* Volatile only */
                    108:
                    109: /*
                    110:  * GET UNIT STATUS command modifiers
                    111:  */
                    112: #define M_GUM_NEXTUNIT 0x0001  /* Next unit */
                    113:
                    114: /*
                    115:  * ONLINE command modifiers
                    116:  */
                    117: #define M_OLM_RIP      0x0001  /* Allow self destruction */
                    118: #define M_OLM_IGNMF    0x0002  /* Ignore media format error */
                    119:
                    120: /*
                    121:  * ONLINE and SET UNIT CHARACTERISTICS command modifiers
                    122:  */
                    123: #define M_OSM_ALTERHI  0x0020  /* Alter host identifier */
                    124: #define M_OSM_SHADOWSP 0x0010  /* Shadow unit specified */
                    125: #define M_OSM_CLEARWBL 0x0008  /* Clear write-back data lost */
                    126: #define M_OSM_SETWRPROT 0x0004 /* Set write protect */
                    127:
                    128: /*
                    129:  * REPLACE command modifiers
                    130:  */
                    131: #define M_RPM_PRIMARY  0x0001  /* Primary replacement block */
                    132:
                    133: /*
                    134:  * End message flags
                    135:  */
                    136: #define M_EF_BBLKR     0x80    /* Bad block reported */
                    137: #define M_EF_BBLKU     0x40    /* Bad block unreported */
                    138: #define M_EF_ERLOG     0x20    /* Error log generated */
                    139: #define M_EF_SEREX     0x10    /* Serious exception */
                    140: #define M_EF_EOT       0x08    /* at end-of-tape */
                    141: #define M_EF_POSLOST   0x04    /* position lost */
                    142:
                    143: /*
                    144:  * Controller flags
                    145:  */
                    146: #define M_CF_ATTN      0x80    /* Enable attention messages */
                    147: #define M_CF_MISC      0x40    /* Enable miscellaneous error log messages */
                    148: #define M_CF_OTHER     0x20    /* Enable other host's error log messages */
                    149: #define M_CF_THIS      0x10    /* Enable this host's error log messages */
                    150: #define M_CF_MLTHS     0x04    /* Multi-host */
                    151: #define M_CF_SHADW     0x02    /* Shadowing */
                    152: #define M_CF_576       0x01    /* 576 byte sectors */
                    153:
                    154: /*
                    155:  * Unit flags
                    156:  */
                    157: #define M_UF_REPLC     0x8000  /* Controller initiated bad block replacement */
                    158: #define M_UF_INACT     0x4000  /* Inactive shadow set unit */
                    159: #define M_UF_WRTPH     0x2000  /* Write protect (hardware) */
                    160: #define M_UF_WRTPS     0x1000  /* Write protect (software or volume) */
                    161: #define M_UF_SCCHH     0x8000  /* Suppress caching (high speed) */
                    162: #define M_UF_SCCHL     0x4000  /* Suppress caching (low speed) */
                    163: #define M_UF_RMVBL     0x0080  /* Removable media */
                    164: #define M_UF_WBKNV     0x0040  /* Write back (non-volatile) */
                    165: #define M_UF_576       0x0004  /* 576 byte sectors */
                    166: #define M_UF_CMPWR     0x0002  /* Compare writes */
                    167: #define M_UF_CMPRD     0x0001  /* Compare reads */
                    168:
                    169: /*
                    170:  * Error Log message format codes
                    171:  */
                    172: #define M_FM_CTLRERR   0x00    /* Controller error */
                    173: #define M_FM_BUSADDR   0x01    /* Host memory access error */
                    174: #define M_FM_DISKTRN   0x02    /* Disk transfer error */
                    175: #define M_FM_SDI       0x03    /* SDI error */
                    176: #define M_FM_SMLDSK    0x04    /* Small disk error */
                    177: #define M_FM_TAPETRN   0x05    /* Tape transfer error */
                    178: #define M_FM_STIERR    0x06    /* STI communication or command failure */
                    179: #define M_FM_STIDEL    0x07    /* STI drive error log */
                    180: #define M_FM_STIFEL    0x08    /* STI formatter error log */
                    181:
                    182: /*
                    183:  * Error Log message flags
                    184:  */
                    185: #define M_LF_SUCC      0x80    /* Operation successful */
                    186: #define M_LF_CONT      0x40    /* Operation continuing */
                    187: #define M_LF_SQNRS     0x01    /* Sequence number reset */
                    188:
                    189: /*
                    190:  * Status codes
                    191:  */
                    192: #define M_ST_MASK      0x1f    /* Status code mask */
                    193: #define M_ST_SUCCESS   0x00    /* Success */
                    194: #define M_ST_INVALCMD  0x01    /* Invalid command */
                    195: #define M_ST_ABORTED   0x02    /* Command aborted */
                    196: #define M_ST_OFFLINE   0x03    /* Unit offline */
                    197: #define M_ST_AVAILABLE 0x04    /* Unit available */
                    198: #define M_ST_MFMTERR   0x05    /* Media format error */
                    199: #define M_ST_WRPROT    0x06    /* Write protected */
                    200: #define M_ST_COMPERR   0x07    /* Compare error */
                    201: #define M_ST_DATAERR   0x08    /* Data error */
                    202: #define M_ST_HOSTBUFERR 0x09   /* Host buffer access error */
                    203: #define M_ST_CTLRERR   0x0a    /* Controller error */
                    204: #define M_ST_DRIVEERR  0x0b    /* Drive error */
                    205: #define M_ST_FORMATTERR 0x0c   /* Formatter error */
                    206: #define M_ST_BOT       0x0d    /* Beginning-of-tape */
                    207: #define M_ST_TAPEMARK  0x0e    /* Tape mark encountered */
                    208: #define M_ST_RDTRUNC   0x10    /* Record data truncated */
                    209: #define M_ST_DIAG      0x1f    /* Message from an internal diagnostic */
                    210:
                    211: /*
                    212:  * Subcodes of M_ST_OFFLINE
                    213:  */
                    214: #define M_OFFLINE_UNKNOWN      (0 << 5) /* unknown or on other ctlr */
                    215: #define M_OFFLINE_UNMOUNTED    (1 << 5) /* unmounted or RUN/STOP at STOP */
                    216: #define M_OFFLINE_INOPERATIVE  (2 << 5) /* inoperative? */
                    217: #define M_OFFLINE_DUPLICATE    (4 << 5) /* duplicate unit number */
                    218: #define M_OFFLINE_INDIAGNOSTIC (8 << 5) /* disabled by FS or diagnostic */
                    219:
                    220: /*
                    221:  * An MSCP packet begins with a header giving the length of
                    222:  * the entire packet (including the header itself)(?), two bytes
                    223:  * of device specific data, and the a whole bunch of variants
                    224:  * depending on message type.
                    225:  *
                    226:  * N.B.:  In most cases we distinguish between a `command' and
                    227:  * an `end' variant as well.  The command variant is that which
                    228:  * is given to the controller; the `end' variant is its response.
                    229:  */
                    230:
                    231: /*
                    232:  * Generic sequential message variant (command and response).
                    233:  */
                    234: struct mscpv_seq {
                    235:        long    seq_bytecount;          /* byte count */
                    236: #define seq_rbn                seq_bytecount   /* aka RBN (replace) */
                    237: #define seq_outref     seq_bytecount   /* aka outref (abort/get cmd status) */
                    238:        long    seq_buffer;             /* buffer descriptor */
                    239:        long    seq_mapbase;            /* page map (first PTE) phys address */
                    240:        long    seq_xxx1;       /* ? */ /* unused */
                    241:        long    seq_lbn;                /* logical block number */
                    242:        long    seq_xxx2;       /* ? */ /* unused */
                    243:        long    *seq_addr;              /* pointer to cmd descriptor */
                    244:        long    seq_software[4];        /* reserved to software; unused */
                    245: };
                    246:
                    247: /*
                    248:  * Set Controller Characteristics command variant
                    249:  */
                    250: struct mscpv_sccc {
                    251:        u_short sccc_version;           /* MSCP version number */
                    252:        u_short sccc_ctlrflags;         /* controller flags */
                    253:        u_short sccc_hosttimo;          /* host timeout */
                    254:        u_short sccc_usefrac;           /* use fraction */
                    255:        long    sccc_time;              /* time and date */
                    256:        long    sccc_time1;             /* it's a quad field */
                    257:        long    sccc_errlgfl;   /* ? */
                    258:        short   sccc_xxx2;      /* ? */
                    259:        short   sccc_copyspd;   /* ? */
                    260: };
                    261:
                    262: /*
                    263:  * Set Controller Characteristics end variant
                    264:  */
                    265: struct mscpv_scce {
                    266:        u_short scce_version;           /* MSCP version number */
                    267:        u_short scce_ctlrflags;         /* controller flags */
                    268:        u_short scce_ctlrtimo;          /* controller timeout */
                    269:        u_short scce_ctlrcmdl;          /* ??? */
                    270:        quad_t  scce_ctlrid;            /* controller ID */
                    271:        long    scce_xxx[3];    /* ? */
                    272:        long    scce_volser;            /* volume serial number */
                    273: };
                    274:
                    275: /*
                    276:  * On Line command variant
                    277:  */
                    278: struct mscpv_onlc {
                    279:        long    onlc_xxx1[4];   /* ? */
                    280:        long    onlc_errlgfl;           /* error log flag? */
                    281:        short   onlc_xxx2;      /* ? */
                    282:        short   onlc_copyspd;           /* copy speed? */
                    283: };
                    284:
                    285: /*
                    286:  * On Line end variant
                    287:  */
                    288: struct mscpv_onle {
                    289:        long    onle_xxx1[3];   /* ? */
                    290: /*???*/ short  onle_xxx2;      /* ? */
                    291:        u_char  onle_drivetype;         /* drive type index (same in guse) */
                    292:        char    onle_xxx3;      /* ? */
                    293:        long    onle_mediaid;           /* media type id (same in guse) */
                    294:        long    onle_xxx4;      /* ? */
                    295:        long    onle_unitsize;          /* unit size in sectors */
                    296:        long    onle_volser;            /* volume serial number */
                    297: };
                    298:
                    299: /*
                    300:  * Get Unit Status end variant (and Avail Attn?)
                    301:  */
                    302: struct mscpv_guse {
                    303:        u_short guse_multunit;          /* multi-unit code */
                    304:        u_short guse_unitflags;         /* unit flags */
                    305:        long    guse_hostid;            /* host id */
                    306:        long    guse_unitid0;   /*???*/
                    307:        short   guse_unitid1;   /*???*/
                    308:        u_char  guse_drivetype;         /* drive type index */
                    309:        u_char  guse_unitid2;   /*???*/
                    310:        long    guse_mediaid;           /* media type id (encoded) */
                    311:        short   guse_shadowunit;        /* shadow unit */
                    312:        short   guse_shadowstat;        /* shadow status */
                    313:        u_short guse_nspt;              /* sectors per track */
                    314:        u_short guse_group;             /* track group size */
                    315:        u_short guse_ngpc;              /* groups per cylinder */
                    316:        u_short guse_xxx;               /* reserved */
                    317:        u_short guse_rctsize;           /* RCT size (sectors) */
                    318:        u_char  guse_nrpt;              /* RBNs per track */
                    319:        u_char  guse_nrct;              /* number of RCTs */
                    320: };
                    321:
                    322: /*
                    323:  * Macros to break up and build media IDs.  An ID encodes the port
                    324:  * type in the top 10 bits, and the drive type in the remaining 22.
                    325:  * The 10 bits, and 15 of the 22, are in groups of 5, with the value
                    326:  * 0 representing space and values 1..26 representing A..Z.  The low
                    327:  * 7 bits represent a number in 0..127.         Hence an RA81 on a UDA50
                    328:  * is <D><U><R><A>< >81, or 0x25641051.         This encoding scheme is known
                    329:  * in part in uda.c.
                    330:  *
                    331:  * The casts below are just to make pcc generate better code.
                    332:  */
                    333: #define MSCP_MEDIA_PORT(id)    (((long)(id) >> 22) & 0x3ff)    /* port */
                    334: #define MSCP_MEDIA_DRIVE(id)   ((long)(id) & 0x003fffff)       /* drive */
                    335: #define MSCP_MID_ECH(n, id)    (((int)(id) >> ((n) * 5 + 7)) & 0x1f)
                    336: #define MSCP_MID_CHAR(n, id) \
                    337:        (MSCP_MID_ECH(n, id) ? MSCP_MID_ECH(n, id) + '@' : ' ')
                    338: #define MSCP_MID_NUM(id)       ((id) & 0x7f)
                    339: /* for, e.g., RA81 */
                    340: #define MSCP_MKDRIVE2(a, b, n) \
                    341:        (((a) - '@') << 17 | ((b) - '@') << 12 | (n))
                    342: /* for, e.g., RRD50 */
                    343: #define MSCP_MKDRIVE3(a, b, c, n) \
                    344:        (((a) - '@') << 17 | ((b) - '@') << 12 | ((c) - '@') << 7 | (n))
                    345:
                    346: /*
                    347:  * Error datagram variant.
                    348:  */
                    349: struct mscpv_erd {
                    350:        quad_t  erd_ctlrid;             /* controller ID */
                    351:        u_char  erd_ctlrsoftware;       /* controller software version */
                    352:        u_char  erd_ctlrhardware;       /* controller hardware version */
                    353:        u_short erd_multiunit;          /* multi-unit code (?) */
                    354:        union {
                    355:                u_long  un_busaddr;     /* bus address, if mem access err */
                    356:                quad_t  un_unitid;      /* unit id, otherwise */
                    357:        } erd_un1;
                    358: #define erd_busaddr    erd_un1.un_busaddr
                    359: #define erd_unitid     erd_un1.un_unitid
                    360:        u_char  erd_unitsoftware;       /* unit software version */
                    361:        u_char  erd_unithardware;       /* unit hardware version */
                    362:        union {
                    363:                u_char  un_b[2];        /* level, retry (if disk xfer err) */
                    364:                u_short un_s;           /* cylinder (if small disk error) */
                    365:        } erd_un2;
                    366: #define erd_level      erd_un2.un_b[0]
                    367: #define erd_retry      erd_un2.un_b[1]
                    368: #define erd_sdecyl     erd_un2.un_s
                    369:        long    erd_volser;             /* volume serial number */
                    370:        u_long  erd_hdr;                /* `header' (block number) */
                    371:        u_char  erd_sdistat[12];        /* SDI status information (?) */
                    372: };
                    373:
                    374: /*
                    375:  * I am making brash assumptions about the first four bytes of all
                    376:  * MSCP packets.  These appear to be true for both UDA50s and TMSCP
                    377:  * devices (TU81, TA81, TK50). DEC claim that these four bytes are
                    378:  * not part of MSCP itself, yet at least the length is necessary
                    379:  * for, e.g., error checking.
                    380:  */
                    381: struct mscp {
                    382:        u_short mscp_msglen;            /* length in bytes */
                    383:        u_char  mscp_msgtc;             /* type (high 4 bits) and credits */
                    384:        u_char  mscp_vcid;              /* virtual circuit ID */
                    385:        long    mscp_cmdref;            /* command reference number */
                    386:        u_short mscp_unit;              /* unit number */
                    387:        u_short mscp_seqnum;            /* sequence number */
                    388:        u_char  mscp_opcode;            /* opcode */
                    389: #define mscp_format    mscp_opcode     /* aka format (datagrams) */
                    390:        u_char  mscp_flags;             /* flags */
                    391:        u_short mscp_modifier;          /* modifier (commands) */
                    392: #define mscp_status    mscp_modifier   /* aka status (ends) */
                    393: #define mscp_event     mscp_modifier   /* aka event (datagrams) */
                    394:        union {
                    395:                struct  mscpv_seq un_seq;       /* generic sequential msg */
                    396:                struct  mscpv_sccc un_sccc;     /* SCC command */
                    397:                struct  mscpv_scce un_scce;     /* SCC end */
                    398:                struct  mscpv_onlc un_onlc;     /* on line command */
                    399:                struct  mscpv_onle un_onle;     /* on line end */
                    400:                struct  mscpv_guse un_guse;     /* get unit status */
                    401:                struct  mscpv_erd un_erd;       /* error datagram */
                    402:        } mscp_un;
                    403: /*???*/ long   mscp_xxx;               /* pad to 64 bytes */
                    404: };
                    405:
                    406: /*
                    407:  * Define message length according to the DEC specifications by dropping
                    408:  * the four byte header.
                    409:  */
                    410: #define MSCP_MSGLEN    (sizeof (struct mscp) - 4)
                    411:
                    412: /*
                    413:  * Shorthand
                    414:  */
                    415:
                    416: /*
                    417:  * Generic packet
                    418:  */
                    419: #define mscp_seq       mscp_un.un_seq
                    420:
                    421: /*
                    422:  * Set Controller Characteristics packet
                    423:  */
                    424: #define mscp_sccc      mscp_un.un_sccc
                    425:
                    426: /*
                    427:  * Set Controller Characteristics end packet
                    428:  */
                    429: #define mscp_scce      mscp_un.un_scce
                    430:
                    431: /*
                    432:  * Online / Set Unit Characteristics command packet
                    433:  */
                    434: #define mscp_onlc      mscp_un.un_onlc
                    435:
                    436: /*
                    437:  * Online end packet
                    438:  */
                    439: #define mscp_onle      mscp_un.un_onle
                    440:
                    441: /*
                    442:  * Get Unit Status end packet
                    443:  */
                    444: #define mscp_guse      mscp_un.un_guse
                    445:
                    446: /*
                    447:  * MSCP Error Log packet
                    448:  */
                    449: #define mscp_erd       mscp_un.un_erd
                    450:
                    451: /*
                    452:  * MSCP seq_addr field actually belongs to overall packet.
                    453:  */
                    454: #define mscp_addr      mscp_seq.seq_addr
                    455:
                    456: /*
                    457:  * Macros to break up mscp_msgtc, and types.
                    458:  */
                    459: #define MSCP_MSGTYPE(m) ((m) & 0xf0)
                    460: #define MSCP_CREDITS(m) ((m) & 0x0f)
                    461:
                    462: #define MSCPT_SEQ              0x00    /* sequential message */
                    463: #define MSCPT_DATAGRAM         0x10    /* error datagram */
                    464: #define MSCPT_CREDITS          0x20    /* credit notification */
                    465: #define MSCPT_MAINTENANCE      0xf0    /* who knows */
                    466:
                    467:
                    468: /*
                    469:  * Here begin more perhaps brash assumptions about MSCP devices...
                    470:  */
                    471:
                    472: /*
                    473:  * MSCP controllers have `command rings' and `response rings'. A
                    474:  * command ring is a pool of MSCP packets that the host uses to give
                    475:  * commands to the controller; a response ring is a pool of MSCP
                    476:  * packets that the controller uses to give back responses.  Entries
                    477:  * in the command and response rings are `owned' by either the host
                    478:  * or the controller; only the owner is allowed to alter any of the
                    479:  * fields in the MSCP packet.  Thus, free command packets are owned
                    480:  * by the host, and free response packets by the controller.  When
                    481:  * the host gives a packet to the controller, it tells the controller
                    482:  * by touching a device register; when the controller gives a response
                    483:  * to the host, it generates an interrupt if enabled, and sets
                    484:  * a device register as well.
                    485:  *
                    486:  * The pool is `described' by a set of pointers to the packets, along
                    487:  * with the two flags below.
                    488:  */
                    489: #define MSCP_OWN       0x80000000      /* controller owns this packet */
                    490: #define MSCP_INT       0x40000000      /* controller should interrupt */

CVSweb