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) 147