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

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

1.1     ! nbrk        1: /*     $OpenBSD: rlnreg.h,v 1.3 2002/03/14 01:26:55 millert Exp $      */
        !             2: /*
        !             3:  * David Leonard <d@openbsd.org>, 1999. Public Domain.
        !             4:  *
        !             5:  * RangeLAN2 registers
        !             6:  */
        !             7:
        !             8: /*
        !             9:  * The RangeLAN2 cards provide four control registers for transferring
        !            10:  * messaged between the host and the card using programmed i/o.
        !            11:  *
        !            12:  * A transfer protocol is followed when sending asynchronous messages to,
        !            13:  * and receiving messages from, the card.
        !            14:  *
        !            15:  * DATA
        !            16:  *      7       6       5       4       3       2       1       0
        !            17:  *  +-------+-------+-------+-------+-------+-------+-------+-------+
        !            18:  *  |                             data                              |
        !            19:  *  +-------+-------+-------+-------+-------+-------+-------+-------+
        !            20:  *
        !            21:  * STATUS
        !            22:  *      7       6       5       4       3       2       1       0
        !            23:  *  +-------+-------+-------+-------+-------+-------+-------+-------+
        !            24:  *  |WAKEUP |   tx message state    |CLRNAK |   rx message state    |
        !            25:  *  +-------+-------+-------+-------+-------+-------+-------+-------+
        !            26:  *
        !            27:  * CONTROL
        !            28:  *      7       6       5       4       3       2       1       0
        !            29:  *  +-------+-------+-------+-------+-------+-------+-------+-------+
        !            30:  *  |       |       | 16BIT | RESET |       |       | TXINT | RXINT |
        !            31:  *  +-------+-------+-------+-------+-------+-------+-------+-------+
        !            32:  *
        !            33:  * INTSEL
        !            34:  *      7       6       5       4       3       2       1       0
        !            35:  *  +-------+-------+-------+-------+-------+-------+-------+-------+
        !            36:  *  |       |       |       |ENABLE |        interrupt line         |
        !            37:  *  +-------+-------+-------+-------+-------+-------+-------+-------+
        !            38:  */
        !            39:
        !            40: /* Register offsets. */
        !            41: #define RLN_REG_DATA                   0
        !            42: #define RLN_REG_STATUS                 2
        !            43: #define RLN_REG_CONTROL                        4
        !            44: #define RLN_REG_EOI                    5
        !            45: #define RLN_REG_INTSEL                 6
        !            46: #define RLN_NPORTS                      8
        !            47:
        !            48: /*
        !            49:  * A short delay is needed (16ms?) after register writes on some cards.
        !            50:  * XXX This is done by performing an innocent and harmless bus read. (i386)
        !            51:  * This is what Proxim's driver does, anyway.
        !            52:  */
        !            53: #define _rln_regacc_delay() \
        !            54:        bus_space_read_1(I386_BUS_SPACE_IO, 0, 0x61)
        !            55:
        !            56: static void    _rln_register_write_1(struct rln_softc *, u_int8_t,
        !            57:                        u_int8_t);
        !            58: static void    _rln_register_write_2(struct rln_softc *, u_int8_t,
        !            59:                        u_int16_t);
        !            60: static u_int8_t        _rln_register_read_1(struct rln_softc *, u_int8_t);
        !            61: static u_int16_t _rln_register_read_2(struct rln_softc *, u_int8_t);
        !            62: static int     rln_status_rx_ready(struct rln_softc *);
        !            63:
        !            64: /* Write to a register. */
        !            65: static inline void
        !            66: _rln_register_write_1(sc, regoff, value)
        !            67:        struct rln_softc *sc;
        !            68:        u_int8_t regoff;
        !            69:        u_int8_t value;
        !            70: {
        !            71:
        !            72: #ifdef RLNDEBUG_REG
        !            73:        printf(" %c<%02x", "DDS3CEI7"[regoff], value);
        !            74: #endif
        !            75:        bus_space_write_1((sc)->sc_iot, (sc)->sc_ioh, (regoff), (value));
        !            76:        _rln_regacc_delay();
        !            77: }
        !            78:
        !            79: static inline void
        !            80: _rln_register_write_2(sc, regoff, value)
        !            81:        struct rln_softc *sc;
        !            82:        u_int8_t regoff;
        !            83:        u_int16_t value;
        !            84: {
        !            85:
        !            86: #ifdef RLNDEBUG_REG
        !            87:        printf(" %c<%04x", "DDS3CEI7"[regoff], value);
        !            88: #endif
        !            89:        bus_space_write_2((sc)->sc_iot, (sc)->sc_ioh, (regoff), (value));
        !            90:        _rln_regacc_delay();
        !            91: }
        !            92:
        !            93: /* Read from a register. */
        !            94: static inline u_int8_t
        !            95: _rln_register_read_1(sc, regoff)
        !            96:        struct rln_softc *sc;
        !            97:        u_int8_t regoff;
        !            98: {
        !            99:        u_int8_t ret;
        !           100:
        !           101:        ret = bus_space_read_1((sc)->sc_iot, (sc)->sc_ioh, (regoff));
        !           102: #ifdef RLNDEBUG_REG
        !           103:        if (ret != (sc)->dbg_oreg[regoff]) {
        !           104:                /* avoid spewing out too much debug info */
        !           105:                printf(" %c>%02x", "DDS3CEI7"[regoff], ret);
        !           106:                (sc)->dbg_oreg[regoff] = ret;
        !           107:        }
        !           108: #endif
        !           109:        return (ret);
        !           110: }
        !           111:
        !           112:
        !           113: static inline u_int16_t
        !           114: _rln_register_read_2(sc, regoff)
        !           115:        struct rln_softc *sc;
        !           116:        u_int8_t regoff;
        !           117: {
        !           118:        u_int16_t ret;
        !           119:
        !           120:        ret = bus_space_read_2((sc)->sc_iot, (sc)->sc_ioh, (regoff));
        !           121: #ifdef RLNDEBUG_REG
        !           122:        if (ret != (sc)->dbg_oreg[regoff]) {
        !           123:                printf(" %c>%04x", "DDS3CEI7"[regoff], ret);
        !           124:                (sc)->dbg_oreg[regoff] = ret;
        !           125:        }
        !           126: #endif
        !           127:        return (ret);
        !           128: }
        !           129:
        !           130: /* 8-bit data register access. */
        !           131: #define rln_data_write_1(sc, value)                                    \
        !           132:                _rln_register_write_1(sc, RLN_REG_DATA, (value))
        !           133: #define rln_data_read_1(sc)                                            \
        !           134:                _rln_register_read_1(sc, RLN_REG_DATA)
        !           135: #define rln_data_write_multi_1(sc, buf, len)                           \
        !           136:                bus_space_write_multi_1((sc)->sc_iot, (sc)->sc_ioh,     \
        !           137:                        RLN_REG_DATA, (buf), (len))
        !           138: #define rln_data_read_multi_1(sc, buf, len)                            \
        !           139:                bus_space_read_multi_1((sc)->sc_iot, (sc)->sc_ioh,      \
        !           140:                        RLN_REG_DATA, (buf), (len))
        !           141:
        !           142: /* 16-bit data register access. */
        !           143: #define rln_data_write_2(sc, value)                                    \
        !           144:                _rln_register_write_2(sc, RLN_REG_DATA, (value))
        !           145: #define rln_data_read_2(sc)                                            \
        !           146:                _rln_register_read_2(sc, RLN_REG_DATA)
        !           147: #define rln_data_write_multi_2(sc, buf, len)                           \
        !           148:                bus_space_write_multi_2((sc)->sc_iot, (sc)->sc_ioh,     \
        !           149:                        RLN_REG_DATA, (buf), (len))
        !           150: #define rln_data_read_multi_2(sc, buf, len)                            \
        !           151:                bus_space_read_multi_2((sc)->sc_iot, (sc)->sc_ioh,      \
        !           152:                        RLN_REG_DATA, (buf), (len))
        !           153:
        !           154: /* Status register. */
        !           155: #define RLN_STATUS_CLRNAK              0x08
        !           156: #define RLN_STATUS_WAKEUP              0x80
        !           157:
        !           158: #define RLN_STATUS_TX_IDLE             0x00
        !           159: #define RLN_STATUS_TX_HILEN_AVAIL      0x01
        !           160: #define RLN_STATUS_TX_HILEN_ACCEPT     0x02
        !           161: #define RLN_STATUS_TX_XFR_COMPLETE     0x03
        !           162: #define RLN_STATUS_TX_XFR              0x04
        !           163: #define RLN_STATUS_TX_ERROR            0x05
        !           164: #define RLN_STATUS_TX_LOLEN_AVAIL      0x06
        !           165: #define RLN_STATUS_TX_LOLEN_ACCEPT     0x07
        !           166: #define RLN_STATUS_TX_MASK             0x0f
        !           167:
        !           168: #define RLN_STATUS_RX_IDLE             0x00
        !           169: #define RLN_STATUS_RX_HILEN_AVAIL      0x10
        !           170: #define RLN_STATUS_RX_HILEN_ACCEPT     0x20
        !           171: #define RLN_STATUS_RX_XFR_COMPLETE     0x30
        !           172: #define RLN_STATUS_RX_XFR              0x40
        !           173: #define RLN_STATUS_RX_ERROR            0x50
        !           174: #define RLN_STATUS_RX_LOLEN_AVAIL      0x60
        !           175: #define RLN_STATUS_RX_LOLEN_ACCEPT     0x70
        !           176: #define RLN_STATUS_RX_MASK             0x70
        !           177:
        !           178: #define rln_status_write(sc, value)                                    \
        !           179:                _rln_register_write_1(sc, RLN_REG_STATUS, (value))
        !           180: #define rln_status_set(sc, bits)                                       \
        !           181:                rln_status_write(sc, (sc)->sc_status |= (bits))
        !           182: #define rln_status_clear(sc, bits)                                     \
        !           183:                rln_status_write(sc, (sc)->sc_status &= ~(bits))
        !           184: #define _rln_status_setmask(sc, mask, bits)                            \
        !           185: do {                                                                   \
        !           186:                int _s;                                                 \
        !           187:                                                                        \
        !           188:                _s = splhigh();                                         \
        !           189:                (sc)->sc_status = ((sc)->sc_status & (mask)) | (bits);  \
        !           190:                rln_status_write(sc, (sc)->sc_status);                  \
        !           191:                splx(_s);                                               \
        !           192: } while (0);
        !           193: #define rln_status_rx_write(sc, state)                                 \
        !           194:                _rln_status_setmask((sc), ~RLN_STATUS_RX_MASK, state)
        !           195: #define rln_status_tx_write(sc, state)                                 \
        !           196:                _rln_status_setmask((sc), ~RLN_STATUS_TX_MASK, state)
        !           197: #define rln_status_read(sc)                                            \
        !           198:                _rln_register_read_1(sc, RLN_REG_STATUS)
        !           199: #define rln_status_rx_read(sc)                                                 \
        !           200:                (rln_status_read(sc) & ~RLN_STATUS_TX_MASK)
        !           201: #define rln_status_tx_read(sc)                                                 \
        !           202:                (rln_status_read(sc) & ~RLN_STATUS_RX_MASK)
        !           203:
        !           204: static inline int
        !           205: rln_status_rx_ready(sc)
        !           206:        struct rln_softc *sc;
        !           207: {
        !           208:        u_int8_t status;
        !           209:
        !           210:        status = rln_status_rx_read(sc);
        !           211:        return (status == RLN_STATUS_RX_LOLEN_AVAIL ||
        !           212:            status == RLN_STATUS_RX_HILEN_AVAIL ||
        !           213:            status == RLN_STATUS_RX_ERROR);
        !           214: }
        !           215:
        !           216: #define rln_status_tx_int(sc) do {                                     \
        !           217:                int _s = splhigh();                                     \
        !           218:                                                                        \
        !           219:                rln_control_clear(sc, RLN_CONTROL_TXINT);               \
        !           220:                rln_control_set(sc, RLN_CONTROL_TXINT);                 \
        !           221:                splx(_s);                                               \
        !           222: } while (0)
        !           223: #define rln_status_rx_int(sc) do {                                     \
        !           224:                int _s = splhigh();                                     \
        !           225:                                                                        \
        !           226:                rln_control_clear(sc, RLN_CONTROL_RXINT);               \
        !           227:                rln_control_set(sc, RLN_CONTROL_RXINT);                 \
        !           228:                splx(_s);                                               \
        !           229: } while (0)
        !           230:
        !           231: /* Control register. */
        !           232: #define RLN_CONTROL_RXINT              0x01
        !           233: #define RLN_CONTROL_TXINT              0x02
        !           234: #define RLN_CONTROL_BIT2               0x04
        !           235: #define RLN_CONTROL_BIT3               0x08
        !           236: #define RLN_CONTROL_RESET              0x10
        !           237: #define RLN_CONTROL_16BIT              0x20
        !           238: #define RLN_CONTROL_MASK               0x3f
        !           239:
        !           240: #define rln_control_write(sc, value)                                   \
        !           241:                _rln_register_write_1(sc, RLN_REG_CONTROL,              \
        !           242:                        (sc)->sc_control = (value))
        !           243: #define rln_control_read(sc)                                           \
        !           244:                _rln_register_read_1(sc, RLN_REG_CONTROL)
        !           245: #define rln_control_set(sc, bits)                                      \
        !           246:                rln_control_write(sc, (sc)->sc_control | (bits))
        !           247: #define rln_control_clear(sc, bits)                                    \
        !           248:                rln_control_write(sc, (sc)->sc_control & ~(bits))
        !           249: #define rln_control_outofstandby(sc) do {                              \
        !           250:                rln_control_write(sc, (sc)->sc_control | RLN_CONTROL_RESET);\
        !           251:                DELAY(30000);                                           \
        !           252:                rln_control_write(sc, (sc)->sc_control);                \
        !           253: } while (0)
        !           254:
        !           255: /* Interrupt selection register. */
        !           256: #define RLN_INTSEL_IRQMASK             0x07
        !           257: #define RLN_INTSEL_ENABLE              0x10
        !           258: #define RLN_INTSEL_BIT7                        0x80
        !           259:
        !           260: #define rln_intsel_disable(sc) do {                                    \
        !           261:                int _s;                                                 \
        !           262:                                                                        \
        !           263:                _s = splhigh();                                         \
        !           264:                _rln_register_write_1(sc, RLN_REG_INTSEL,               \
        !           265:                        (sc)->sc_intsel &= ~RLN_INTSEL_ENABLE);         \
        !           266:                splx(_s);                                               \
        !           267: } while (0)
        !           268: #define rln_intsel_enable(sc) do {                                     \
        !           269:                int _s;                                                 \
        !           270:                                                                        \
        !           271:                _s = splhigh();                                         \
        !           272:                _rln_register_write_1(sc, RLN_REG_INTSEL,               \
        !           273:                        (sc)->sc_intsel |= RLN_INTSEL_ENABLE);          \
        !           274:                splx(_s);                                               \
        !           275: } while (0)
        !           276: #define rln_intsel_write(sc, value)                                    \
        !           277:                _rln_register_write_1(sc, RLN_REG_INTSEL,               \
        !           278:                    (sc)->sc_intsel |= (value))
        !           279:
        !           280: /* End of interrupt signal, used on some newer cards. */
        !           281: #define rln_eoi(sc)                                                    \
        !           282:                (void) _rln_register_read_1(sc, RLN_REG_EOI)
        !           283:

CVSweb