Annotation of sys/dev/pci/musyccvar.h, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: musyccvar.h,v 1.9 2006/02/06 17:29:11 jmc Exp $ */
2:
3: /*
4: * Copyright (c) 2004,2005 Internet Business Solutions AG, Zurich, Switzerland
5: * Written by: Claudio Jeker <jeker@accoom.net>
6: *
7: * Permission to use, copy, modify, and distribute this software for any
8: * purpose with or without fee is hereby granted, provided that the above
9: * copyright notice and this permission notice appear in all copies.
10: *
11: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18: */
19: #ifndef __MUSYCCVAR_H__
20: #define __MUSYCCVAR_H__
21:
22: #include <sys/queue.h>
23:
24: #define PPP_HEADER_LEN 4 /* should be globaly defined by sppp */
25:
26: /* some defaults */
27: #define MUSYCC_NUMCHAN 32 /* 32 channels per group */
28: #define MUSYCC_NUMPORT 8 /* max 8 ports per controller */
29: #define MUSYCC_SREQNUM 16 /* pending SREQ */
30: #define MUSYCC_SREQMASK (MUSYCC_SREQNUM - 1)
31: #define MUSYCC_SREQTIMEOUT 2
32:
33: /* dma ring sizes */
34: #define MUSYCC_DMA_CNT 256
35: #define MUSYCC_DMA_MAPSIZE (MUSYCC_DMA_CNT * sizeof(struct dma_desc))
36: #define MUSYCC_DMA_SIZE 32
37:
38: struct musycc_softc;
39: struct ebus_softc;
40:
41: /* DMA descriptor for data */
42: struct dma_desc {
43: u_int32_t status;
44: u_int32_t data;
45: u_int32_t next;
46: /* Software only */
47: struct mbuf *mbuf;
48: struct dma_desc *nextdesc;
49: bus_dmamap_t map;
50: };
51:
52: #define MUSYCC_INTLEN 512 /* 512 pending interrupts is enough */
53: struct musycc_intdesc {
54: u_int32_t md_intrq[MUSYCC_INTLEN];
55: };
56:
57: struct musycc_dma_data {
58: /*
59: * received dma ring. rx_prod points to the frist descriptors that
60: * is under musycc control (first empty).
61: */
62: struct dma_desc *rx_prod;
63: int rx_cnt;
64:
65: struct dma_desc *tx_pend; /* finished pointer */
66: struct dma_desc *tx_cur; /* current insertion pointer */
67: int tx_cnt; /* number of descriptors */
68: int tx_use; /* number of used descriptors */
69: int tx_pkts; /* number of packets in queue */
70: };
71:
72: enum musycc_state {
73: CHAN_FLOAT, /* unconnected channel */
74: CHAN_IDLE,
75: CHAN_RUNNING,
76: CHAN_FAULT,
77: CHAN_TRANSIENT /* dummy state to protect ongoing state changes */
78: };
79:
80: enum musycc_event {
81: EV_NULL, /* null event, ignore */
82: EV_ACTIVATE, /* activate channel go to running state */
83: EV_STOP, /* stop dma engine */
84: EV_IDLE, /* free timeslots et al. and go to idle state */
85: EV_WATCHDOG /* watchdog event, stop dma engine */
86: };
87:
88: /* group structure */
89: struct musycc_group {
90: struct musycc_softc *mg_hdlc; /* main controller */
91: struct musycc_grpdesc *mg_group; /* group descriptor */
92: u_int8_t mg_gnum; /* group number */
93: u_int8_t mg_port; /* port number */
94: u_int8_t mg_loaded; /* sreq(5) done? */
95: u_int64_t mg_fifomask; /* fifo allocation mask */
96:
97: struct channel_softc *mg_channels[MUSYCC_NUMCHAN];
98: struct musycc_dma_data mg_dma_d[MUSYCC_NUMCHAN];
99: struct dma_desc *mg_freelist;
100: int mg_freecnt;
101:
102: struct {
103: long timeout;
104: u_int32_t sreq;
105: enum musycc_event event;
106: } mg_sreq[MUSYCC_SREQNUM];
107: int mg_sreqpend;
108: int mg_sreqprod;
109:
110: struct dma_desc *mg_dma_pool;
111: bus_dma_tag_t mg_dmat; /* bus dma tag */
112: caddr_t mg_listkva;
113: bus_dmamap_t mg_listmap;
114: bus_dma_segment_t mg_listseg[1];
115: int mg_listnseg;
116: bus_dmamap_t mg_tx_sparemap;
117: bus_dmamap_t mg_rx_sparemap;
118: };
119:
120: /* attach arguments for framer devices */
121: struct musycc_attach_args {
122: char ma_product[64];
123: bus_size_t ma_base;
124: bus_size_t ma_size;
125: u_int32_t ma_type;
126: u_int8_t ma_gnum;
127: u_int8_t ma_port;
128: u_int8_t ma_flags;
129: char ma_slot;
130: };
131:
132: /* generic ebus device handle */
133: struct ebus_dev {
134: bus_size_t base;
135: bus_size_t size;
136: bus_space_tag_t st;
137: bus_space_handle_t sh;
138: };
139:
140: /* Softc for each HDLC channel config */
141: struct channel_softc {
142: struct sppp cc_ppp; /* sppp network attachement */
143: struct ifnet *cc_ifp; /* pointer to the active ifp */
144: struct musycc_group *cc_group;
145: struct device *cc_parent; /* parent framer */
146:
147: u_int32_t cc_tslots; /* timeslot map */
148: int cc_unit;
149: enum musycc_state cc_state; /* state machine info */
150: u_int8_t cc_channel; /* HDLC channel */
151: u_int8_t cc_locked;
152: };
153:
154: /* Softc for the HDLC Controller (function 0) */
155: struct musycc_softc {
156: struct device mc_dev; /* generic device structures */
157: void *mc_ih; /* interrupt handler cookie */
158: bus_space_tag_t mc_st; /* bus space tag */
159: bus_space_handle_t mc_sh; /* bus space handle */
160: bus_dma_tag_t mc_dmat; /* bus dma tag */
161: bus_size_t mc_iosize; /* size of bus space */
162:
163: caddr_t mc_groupkva; /* group configuration mem */
164: bus_dmamap_t mc_cfgmap;
165: bus_dma_segment_t mc_cfgseg[1];
166: bus_dmamap_t mc_intrmap;
167: bus_dma_segment_t mc_intrseg[1];
168: int mc_cfgnseg;
169: int mc_intrnseg;
170:
171: struct musycc_group *mc_groups; /* mc_ngroups groups */
172: struct musycc_intdesc *mc_intrd;
173: u_int32_t mc_global_conf; /* global config descriptor */
174: u_int32_t mc_intrqptr; /* interrupt queue pointer */
175: int mc_ngroups;
176: int mc_nports;
177:
178: struct musycc_softc *mc_other; /* the other EBUS/HDLC dev */
179: bus_size_t mc_ledbase;
180: u_int8_t mc_ledmask;
181: u_int8_t mc_ledstate; /* current state of the LEDs */
182: int bus, device; /* location of card */
183: SLIST_ENTRY(musycc_softc) list; /* list of all hdlc ctrls */
184: };
185:
186: int musycc_attach_common(struct musycc_softc *, u_int32_t, u_int32_t);
187: void musycc_set_port(struct musycc_group *, int);
188: int musycc_init_channel(struct channel_softc *, char);
189: void musycc_stop_channel(struct channel_softc *);
190: void musycc_free_channel(struct musycc_group *, int);
191: void musycc_start(struct ifnet *);
192: void musycc_watchdog(struct ifnet *);
193: void musycc_tick(struct channel_softc *);
194:
195: int musycc_intr(void *);
196: int ebus_intr(void *);
197:
198: /* EBUS API */
199: int ebus_attach_device(struct ebus_dev *, struct musycc_softc *,
200: bus_size_t, bus_size_t);
201: u_int8_t ebus_read(struct ebus_dev *, bus_size_t);
202: void ebus_write(struct ebus_dev *, bus_size_t, u_int8_t);
203: void ebus_read_buf(struct ebus_dev *, bus_size_t, void *, size_t);
204: void ebus_set_led(struct channel_softc *, int, u_int8_t);
205:
206: #define MUSYCC_LED_GREEN 0x1
207: #define MUSYCC_LED_RED 0x2
208: #define MUSYCC_LED_MASK 0x3
209:
210: /* channel API */
211: struct channel_softc *musycc_channel_create(const char *, u_int8_t);
212: void musycc_attach_sppp(struct channel_softc *,
213: int (*)(struct ifnet *, u_long, caddr_t));
214: int musycc_channel_attach(struct musycc_softc *,
215: struct channel_softc *, struct device *, u_int8_t);
216: void musycc_channel_detach(struct ifnet *);
217:
218:
219: #ifndef ACCOOM_DEBUG
220: #define ACCOOM_PRINTF(n, x)
221: #else
222: extern int accoom_debug;
223:
224: #define ACCOOM_PRINTF(n, x) \
225: do { \
226: if (accoom_debug >= n) \
227: printf x; \
228: } while (0)
229: #endif
230:
231: #endif
CVSweb