Annotation of sys/dev/ic/rlnvar.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: rlnvar.h,v 1.7 2002/06/09 03:14:18 todd Exp $ */
! 2: /*
! 3: * David Leonard <d@openbsd.org>, 1999. Public domain.
! 4: *
! 5: * Proxim RangeLAN2 soft state copy.
! 6: */
! 7:
! 8: #include <sys/timeout.h>
! 9:
! 10: /*
! 11: * Mailboxes are used to communicate card-initiated messages
! 12: * from the interrupt handler to other kernel threads.
! 13: */
! 14: struct rln_mbox {
! 15: void * mb_buf; /* Message buffer */
! 16: size_t mb_len; /* Message buffer size */
! 17: size_t mb_actlen; /* Actual message size */
! 18: u_int8_t mb_state; /* Mailbox state */
! 19: #define RLNMBOX_VOID 0
! 20: #define RLNMBOX_EMPTY 1
! 21: #define RLNMBOX_FILLING 2
! 22: #define RLNMBOX_FILLED 3
! 23: };
! 24:
! 25: #define RLN_NMBOX 0x7c /* Same as max msg seq number */
! 26:
! 27: /* Soft state */
! 28: struct rln_softc {
! 29: struct device sc_dev;
! 30: void *sc_ih; /* Interrupt handler */
! 31: struct arpcom sc_arpcom; /* Ethernet common part */
! 32: bus_space_tag_t sc_iot; /* Bus cookie */
! 33: bus_space_handle_t sc_ioh; /* Bus i/o handle */
! 34: struct timeout sc_timeout;
! 35:
! 36: u_int8_t sc_width; /* Bus transfer width */
! 37: u_int8_t sc_irq; /* IRQ for card */
! 38:
! 39: u_int16_t sc_cardtype; /* Set from config flags */
! 40: #define RLN_CTYPE_OEM 0x01
! 41: #define RLN_CTYPE_UISA 0x02
! 42: #define RLN_CTYPE_ONE_PIECE 0x04
! 43:
! 44: u_int8_t sc_intsel; /* Copy of INTSEL */
! 45: u_int8_t sc_status; /* Copy of STATUS */
! 46: u_int8_t sc_control; /* Copy of CONTROL */
! 47: #ifdef RLNDEBUG_REG
! 48: u_int16_t dbg_oreg[8]; /* Last reg value written */
! 49: #endif
! 50:
! 51: u_int8_t sc_pktseq; /* Card message seq no */
! 52: u_int8_t sc_txseq; /* Tx packet seq no */
! 53:
! 54: u_int16_t sc_state; /* Soft state. */
! 55: #define RLN_STATE_SYNC 0x0001 /* Card is synchronised */
! 56: #define RLN_STATE_NEEDINIT 0x0002 /* Card needs reset+init */
! 57: #define RLN_STATE_PROMISC 0x0004 /* Receive all packets */
! 58:
! 59: struct rln_mbox sc_mbox[0x80]; /* Per-message mailboxes */
! 60: struct rln_param sc_param; /* User controlled parameters */
! 61: };
! 62:
! 63: #define rln_need_reset(sc) \
! 64: (sc)->sc_state |= RLN_STATE_NEEDINIT
! 65:
! 66: /* Structure used to hold partial read state for rln_rx_pdata() */
! 67: struct rln_pdata {
! 68: u_int8_t p_data; /* extra data read but not consumed */
! 69: int p_nremain; /* size of unconsumed data */
! 70: };
! 71: #define RLN_PDATA_INIT {0,0}
! 72:
! 73: /* Structure used to hold partial transmit state for rln_msg_tx_*() */
! 74: struct rln_msg_tx_state {
! 75: int ien; /* saved interrupt state */
! 76: u_int8_t w; /* saved wakup state */
! 77: struct rln_pdata pd; /* saved partial write state */
! 78: };
! 79:
! 80: struct rln_mm_cmd; /* fwd decl */
! 81:
! 82: #define RLN_WAKEUP_SET 0xff
! 83: #define RLN_WAKEUP_NOCHANGE (0x80|0x10)
! 84:
! 85: void rlnconfig(struct rln_softc *);
! 86: int rlnintr(void *);
! 87: void rlninit(struct rln_softc *);
! 88: void rlnstop(struct rln_softc *);
! 89: void rlnread(struct rln_softc *, struct rln_mm_cmd *, int);
! 90: int rln_enable(struct rln_softc *, int);
! 91: int rln_reset(struct rln_softc *);
! 92: u_int8_t rln_wakeup(struct rln_softc *, u_int8_t);
! 93: int rln_rx_request(struct rln_softc *, int);
! 94: int rln_rx_data(struct rln_softc *, void *, int);
! 95: void rln_rx_pdata(struct rln_softc *, void *, int,
! 96: struct rln_pdata *);
! 97: void rln_rx_end(struct rln_softc *);
! 98: void rln_clear_nak(struct rln_softc *);
! 99: u_int8_t rln_newseq(struct rln_softc *);
! 100:
! 101: void rln_msg_tx_data(struct rln_softc *, void *, u_int16_t,
! 102: struct rln_msg_tx_state *);
! 103: int rln_msg_tx_start(struct rln_softc *, void *, int,
! 104: struct rln_msg_tx_state *);
! 105: int rln_msg_tx_end(struct rln_softc *,
! 106: struct rln_msg_tx_state *);
! 107: int rln_msg_txrx(struct rln_softc *, void *, int,
! 108: void *, int);
! 109:
! 110: int rln_mbox_create(struct rln_softc *, u_int8_t, void *,
! 111: size_t);
! 112: int rln_mbox_wait(struct rln_softc *, u_int8_t, int);
! 113: int rln_mbox_lock(struct rln_softc *, u_int8_t, void **,
! 114: size_t*);
! 115: void rln_mbox_unlock(struct rln_softc *, u_int8_t, size_t);
! 116:
! 117: /* debug all card operations */
! 118: #ifdef RLNDEBUG
! 119: #define dprintf(fmt, args...) printf(fmt , ## args)
! 120: /* log(LOG_DEBUG, fmt , ## args) */
! 121: #define dprinthex(buf, len) do { \
! 122: unsigned char *_b = (unsigned char *)(buf); \
! 123: int _i, _l=(len); \
! 124: printf("{"); \
! 125: for(_i = 0; _i < _l; _i++) { \
! 126: printf("%02x", _b[_i]); \
! 127: if (_i % 4 == 3 && _i != _l - 1) \
! 128: printf(","); \
! 129: } \
! 130: printf("}"); \
! 131: } while (0)
! 132: #else
! 133: #define dprintf(fmt, args...) /* nothing */
! 134: #define dprinthex(buf, len) /* nothing */
! 135: #endif
! 136:
! 137: /* debug messages to/from card. prints 4-octet groups separated by commas */
! 138: #define RLNDUMP
! 139: #define RLNDUMPHEX(buf, buflen) do { \
! 140: int _i; \
! 141: for (_i = 0; _i < (buflen); _i++) { \
! 142: printf("%02x", ((unsigned char *)(buf))[_i]); \
! 143: if (_i != (buflen) - 1 && _i % 4 == 3) \
! 144: printf(","); \
! 145: } \
! 146: } while (0)
CVSweb