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)