Annotation of sys/dev/pci/if_san_common.h, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: if_san_common.h,v 1.8 2005/11/08 20:23:42 canacar Exp $ */
2:
3: /*-
4: * Copyright (c) 2001-2004 Sangoma Technologies (SAN)
5: * All rights reserved. www.sangoma.com
6: *
7: * This code is written by Alex Feldman <al.feldman@sangoma.com> for SAN.
8: *
9: * Redistribution and use in source and binary forms, with or without
10: * modification, are permitted provided that the following conditions
11: * are met:
12: * 1. Redistributions of source code must retain the above copyright
13: * notice, this list of conditions and the following disclaimer.
14: * 2. Redistributions in binary form must reproduce the above
15: * copyright notice, this list of conditions and the following disclaimer
16: * in the documentation and/or other materials provided with the
17: * distribution.
18: * 3. Neither the name of Sangoma Technologies nor the names of its
19: * contributors may be used to endorse or promote products derived
20: * from this software without specific prior written permission.
21: *
22: * THIS SOFTWARE IS PROVIDED BY SANGOMA TECHNOLOGIES AND CONTRIBUTORS
23: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
24: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
25: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
26: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
32: * THE POSSIBILITY OF SUCH DAMAGE.
33: */
34:
35: #ifndef __IF_SAN_COMMON_H
36: #define __IF_SAN_COMMON_H
37:
38: # include <dev/pci/if_san_te1.h>
39: # include <dev/pci/if_sandrv.h>
40:
41: #define ADDR_MASK(x,y) (((caddr_t)(x) - (caddr_t)0) & (y))
42:
43: #define WANPIPE_LITE_VERSION "1.1.1"
44: #define WAN_OPENBSD_PLATFORM 0x06
45: #define WAN_PLATFORM_ID WAN_OPENBSD_PLATFORM
46: #define WANPIPE_MAGIC 0x414C4453L /* signature: 'SDLA' reversed */
47:
48: #define ROUTER_NAME "wanrouter" /* in case we ever change it */
49: #define ROUTER_IOCTL 'W' /* for IOCTL calls */
50:
51: #define WANROUTER_MAJOR_VER 2
52: #define WANROUTER_MINOR_VER 1
53:
54: /* IOCTL codes for /proc/router/<device> entries (up to 255) */
55: #define WANPIPE_DUMP _IOW(ROUTER_IOCTL, 16, wan_conf_t)
56: #define WANPIPE_EXEC _IOWR(ROUTER_IOCTL, 17, wan_conf_t)
57:
58: /* get monitor statistics */
59: #define SIOC_WANPIPE_PIPEMON _IOWR('i', 150, struct ifreq)
60:
61: /* set generic device */
62: #define SIOC_WANPIPE_DEVICE _IOWR('i', 151, struct ifreq)
63:
64: /* get hwprobe string */
65: #define SIOC_WANPIPE_HWPROBE _IOWR('i', 152, struct ifreq)
66:
67: /* get memdump string (GENERIC) */
68: #define SIOC_WANPIPE_DUMP _IOWR('i', 153, struct ifreq)
69:
70:
71: /* clocking options */
72: #define WAN_EXTERNAL 0
73: #define WAN_INTERNAL 1
74:
75: /* intercace options */
76: #define WAN_RS232 0
77: #define WAN_V35 1
78:
79: #define WAN_UDP_FAILED_CMD 0xCF
80: #define WAN_UDP_INVALID_CMD 0xCE
81: #define WAN_UDP_TIMEOUT_CMD 0xAA
82: #define WAN_UDP_INVALID_NET_CMD 0xCD
83:
84: #define WAN_NO 0
85: #define WAN_YES 1
86:
87: /* UDP Packet Management */
88: #define UDP_PKT_FRM_STACK 0x00
89: #define UDP_PKT_FRM_NETWORK 0x01
90:
91: #define WANCONFIG_FR 102 /* frame relay link */
92: #define WANCONFIG_PPP 103 /* synchronous PPP link */
93: #define WANCONFIG_CHDLC 104 /* Cisco HDLC Link */
94: #define WANCONFIG_AFT 117 /* AFT Hardware Support */
95: /****** Data Types **********************************************************/
96:
97:
98: /* Front-End status */
99: enum fe_status {
100: FE_UNITIALIZED = 0x00,
101: FE_DISCONNECTED,
102: FE_CONNECTED
103: };
104:
105: /* 'state' defines */
106: enum wan_states
107: {
108: WAN_UNCONFIGURED, /* link/channel is not configured */
109: WAN_DISCONNECTED, /* link/channel is disconnected */
110: WAN_CONNECTING, /* connection is in progress */
111: WAN_CONNECTED, /* link/channel is operational */
112: WAN_LIMIT, /* for verification only */
113: WAN_DUALPORT, /* for Dual Port cards */
114: WAN_DISCONNECTING,
115: WAN_FT1_READY /* FT1 Configurator Ready */
116: };
117:
118: /* 'modem_status' masks */
119: #define WAN_MODEM_CTS 0x0001 /* CTS line active */
120: #define WAN_MODEM_DCD 0x0002 /* DCD line active */
121: #define WAN_MODEM_DTR 0x0010 /* DTR line active */
122: #define WAN_MODEM_RTS 0x0020 /* RTS line active */
123:
124: typedef struct wan_conf {
125: char devname[IFNAMSIZ+1];
126: void* arg;
127: } wan_conf_t;
128:
129:
130: /* IOCTL numbers (up to 16) */
131:
132: #define TRACE_ALL 0x00
133: #define TRACE_PROT 0x01
134: #define TRACE_DATA 0x02
135:
136: /* values for request/reply byte */
137: #define UDPMGMT_REQUEST 0x01
138: #define UDPMGMT_REPLY 0x02
139: #define UDP_OFFSET 12
140:
141: #define MAX_FT1_RETRY 100
142:
143: /* General Critical Flags */
144: enum {
145: SEND_CRIT,
146: PERI_CRIT,
147: RX_CRIT,
148: PRIV_CRIT
149: };
150:
151: /*
152: * Data structures for IOCTL calls.
153: */
154:
155: typedef struct sdla_dump { /* WANPIPE_DUMP */
156: unsigned long magic; /* for verification */
157: unsigned long offset; /* absolute adapter memory address */
158: unsigned long length; /* block length */
159: void* ptr; /* -> buffer */
160: } sdla_dump_t;
161:
162: typedef struct sdla_exec { /* WANPIPE_EXEC */
163: unsigned long magic; /* for verification */
164: void* cmd; /* -> command structure */
165: void* data; /* -> data buffer */
166: } sdla_exec_t;
167:
168: #define TRC_INCOMING_FRM 0x00
169: #define TRC_OUTGOING_FRM 0x01
170: typedef struct {
171: unsigned char status;
172: unsigned char data_avail;
173: unsigned short real_length;
174: unsigned short time_stamp;
175: unsigned long sec;
176: unsigned long usec;
177: unsigned char data[0];
178: } wan_trace_pkt_t;
179:
180: typedef struct wan_trace {
181: unsigned long tracing_enabled;
182: struct ifqueue ifq;
183: unsigned int trace_timeout;
184: unsigned int max_trace_queue;
185: } wan_trace_t;
186:
187:
188: /********************************************************
189: * GLOBAL DEFINITION FOR SANGOMA UDP STRUCTURE *
190: *******************************************************/
191: #define GLOBAL_UDP_SIGNATURE "WANPIPE"
192: #define GLOBAL_UDP_SIGNATURE_LEN 7
193: #define UDPMGMT_UDP_PROTOCOL 0x11
194: #define WAN_UDP_CMD_START 0x60
195: #define WAN_GET_PROTOCOL (WAN_UDP_CMD_START+0)
196: #define WAN_GET_PLATFORM (WAN_UDP_CMD_START+1)
197: #define WAN_GET_MEDIA_TYPE (WAN_UDP_CMD_START+2)
198: #define WAN_UDP_CMD_END 0x6F
199:
200: #define WAN_FE_CMD_START 0x90
201: #define WAN_FE_CMD_END 0x9F
202:
203: #define WAN_INTERFACE_CMD_START 0xA0
204: #define WAN_INTERFACE_CMD_END 0xAF
205:
206: #define WAN_FE_UDP_CMD_START 0xB0
207: #define WAN_FE_UDP_CMD_END 0xBF
208:
209: typedef struct {
210: unsigned char signature[8];
211: unsigned char request_reply;
212: unsigned char id;
213: unsigned char reserved[6];
214: } wan_mgmt_t;
215:
216:
217: /****** DEFINITION OF UDP HEADER AND STRUCTURE PER PROTOCOL ******/
218: typedef struct {
219: unsigned char num_frames;
220: unsigned char ismoredata;
221: } wan_trace_info_t;
222:
223: typedef struct wan_udp_hdr{
224: wan_mgmt_t wan_mgmt;
225: wan_cmd_t wan_cmd;
226: union {
227: struct {
228: wan_trace_info_t trace_info;
229: unsigned char data[WAN_MAX_DATA_SIZE];
230: } chdlc, aft;
231: unsigned char data[WAN_MAX_DATA_SIZE];
232: } wan_udphdr_u;
233: #define wan_udphdr_signature wan_mgmt.signature
234: #define wan_udphdr_request_reply wan_mgmt.request_reply
235: #define wan_udphdr_id wan_mgmt.id
236: #define wan_udphdr_opp_flag wan_cmd.wan_cmd_opp_flag
237: #define wan_udphdr_command wan_cmd.wan_cmd_command
238: #define wan_udphdr_data_len wan_cmd.wan_cmd_data_len
239: #define wan_udphdr_return_code wan_cmd.wan_cmd_return_code
240: #define wan_udphdr_chdlc_num_frames wan_udphdr_u.chdlc.trace_info.num_frames
241: #define wan_udphdr_chdlc_ismoredata wan_udphdr_u.chdlc.trace_info.ismoredata
242: #define wan_udphdr_chdlc_data wan_udphdr_u.chdlc.data
243:
244: #define wan_udphdr_aft_num_frames wan_udphdr_u.aft.trace_info.num_frames
245: #define wan_udphdr_aft_ismoredata wan_udphdr_u.aft.trace_info.ismoredata
246: #define wan_udphdr_aft_data wan_udphdr_u.aft.data
247: #define wan_udphdr_data wan_udphdr_u.data
248: } wan_udp_hdr_t;
249:
250: #define MAX_LGTH_UDP_MGNT_PKT 2000
251:
252: /* This is used for interrupt testing */
253: #define INTR_TEST_MODE 0x02
254:
255: #define WUM_SIGNATURE_L 0x50495046
256: #define WUM_SIGNATURE_H 0x444E3845
257:
258: #define WUM_KILL 0x50
259: #define WUM_EXEC 0x51
260:
261:
262: #if defined(_KERNEL)
263: /****** Kernel Interface ****************************************************/
264:
265:
266: #define MAX_E1_CHANNELS 32
267: #define MAX_FR_CHANNELS (991+1)
268:
269: #ifndef min
270: #define min(a,b) (((a)<(b))?(a):(b))
271: #endif
272: #ifndef max
273: #define max(a,b) (((a)>(b))?(a):(b))
274: #endif
275:
276: #define is_digit(ch) (((ch)>=(unsigned)'0'&&(ch)<=(unsigned)'9')?1:0)
277:
278: #define is_alpha(ch) ((((ch)>=(unsigned)'a'&&(ch)<=(unsigned)'z')|| \
279: ((ch)>=(unsigned)'A'&&(ch)<=(unsigned)'Z'))?1:0)
280:
281: #define is_hex_digit(ch) ((((ch)>=(unsigned)'0'&&(ch)<=(unsigned)'9')|| \
282: ((ch)>=(unsigned)'a'&&(ch)<=(unsigned)'f')||\
283: ((ch)>=(unsigned)'A'&&(ch)<=(unsigned)'F'))?1:0)
284: #if !defined(offsetof)
285: # define offsetof(type, member) ((size_t)(&((type*)0)->member))
286: #endif
287:
288: # define irqreturn_t void
289: /* Unsafe sprintf and vsprintf function removed from the kernel */
290: # define WAN_IRQ_RETVAL(a) return;
291:
292: #define _bit_byte(bit) ((bit) >> 3)
293: #define _bit_mask(bit) (1 << ((bit)&0x7))
294:
295: /* is bit N of bitstring name set? */
296: #define bit_test(name, bit) ((name)[_bit_byte(bit)] & _bit_mask(bit))
297:
298: /* set bit N of bitstring name */
299: #define bit_set(name, bit) ((name)[_bit_byte(bit)] |= _bit_mask(bit))
300:
301: /* clear bit N of bitstring name */
302: #define bit_clear(name, bit) ((name)[_bit_byte(bit)] &= ~_bit_mask(bit))
303:
304: /* Sangoma assert macro */
305: #define SAN_ASSERT(a) \
306: if (a){ \
307: log(LOG_INFO, "%s:%d: Critical Error!\n", \
308: __FUNCTION__,__LINE__); \
309: return (EINVAL); \
310: }
311:
312: /****** Data Structures *****************************************************/
313:
314: typedef struct wan_udp_pkt {
315: struct ip ip_hdr;
316: struct udphdr udp_hdr;
317: wan_udp_hdr_t wan_udp_hdr;
318: #define wan_udp_cmd wan_udp_hdr.wan_cmd
319: #define wan_udp_signature wan_udp_hdr.wan_udphdr_signature
320: #define wan_udp_request_reply wan_udp_hdr.wan_udphdr_request_reply
321: #define wan_udp_id wan_udp_hdr.wan_udphdr_id
322: #define wan_udp_opp_flag wan_udp_hdr.wan_udphdr_opp_flag
323: #define wan_udp_command wan_udp_hdr.wan_udphdr_command
324: #define wan_udp_data_len wan_udp_hdr.wan_udphdr_data_len
325: #define wan_udp_return_code wan_udp_hdr.wan_udphdr_return_code
326: #define wan_udp_hdlc_PF_bit wan_udp_hdr.wan_udphdr_hdlc_PF_bit
327: #define wan_udp_fr_dlci wan_udp_hdr.wan_udphdr_fr_dlci
328: #define wan_udp_fr_attr wan_udp_hdr.wan_udphdr_fr_attr
329: #define wan_udp_fr_rxlost1 wan_udp_hdr.wan_udphdr_fr_rxlost1
330: #define wan_udp_fr_rxlost2 wan_udp_hdr.wan_udphdr_fr_rxlost2
331: #define wan_udp_chdlc_num_frames wan_udp_hdr.wan_udphdr_chdlc_num_frames
332: #define wan_udp_chdlc_ismoredata wan_udp_hdr.wan_udphdr_chdlc_ismoredata
333: #define wan_udp_chdlc_data wan_udp_hdr.wan_udphdr_chdlc_data
334:
335: #define wan_udp_aft_num_frames wan_udp_hdr.wan_udphdr_aft_num_frames
336: #define wan_udp_aft_ismoredata wan_udp_hdr.wan_udphdr_aft_ismoredata
337: #define wan_udp_data wan_udp_hdr.wan_udphdr_data
338: } wan_udp_pkt_t;
339:
340: #define WAN_IFP_TO_COMMON(ifp) (wanpipe_common_t*)((ifp)->if_softc)
341: typedef struct wanpipe_common {
342: struct sppp ifp;
343: void *card;
344: struct timeout dev_timer;
345: unsigned int protocol;
346: struct ifmedia ifm;
347:
348: LIST_ENTRY(wanpipe_common) next;
349: } wanpipe_common_t;
350:
351: typedef struct {
352: unsigned long time_slot_map;
353: unsigned long logic_ch_map;
354: unsigned char num_of_time_slots;
355: unsigned char top_logic_ch;
356: unsigned long bar;
357: void *trace_info;
358: void *dev_to_ch_map[MAX_E1_CHANNELS];
359: void *rx_dma_ptr;
360: void *tx_dma_ptr;
361: unsigned short num_of_ch;/* Number of logical channels */
362: unsigned short dma_per_ch;/* DMA buffers per logic channel */
363: unsigned short mru_trans;/* MRU of transparent channels */
364: unsigned long dma_mtu_off;
365: unsigned short dma_mtu;
366: unsigned char state_change_exit_isr;
367: unsigned long active_ch_map;
368: unsigned long fifo_addr_map;
369: struct timeout led_timer;
370: } sdla_xilinx_t;
371:
372: /* Adapter Data Space.
373: * This structure is needed because we handle multiple cards, otherwise
374: * static data would do it.
375: */
376: typedef struct sdla {
377: unsigned magic;
378: char devname[IFNAMSIZ+1]; /* card name */
379: void *hw; /* hw configuration */
380: unsigned int type; /* adapter type */
381: unsigned char line_idle;
382:
383: char state; /* device state */
384: unsigned long critical; /* critical section flag */
385:
386: int(*iface_up) (struct ifnet*);
387: int(*iface_down) (struct ifnet*);
388: int(*iface_send) (struct mbuf* skb, struct ifnet*);
389: int(*iface_ioctl) (struct ifnet*, int, struct ifreq*);
390:
391: unsigned long state_tick; /* link state timestamp */
392: unsigned long in_isr; /* interrupt-in-service flag */
393: unsigned long configured; /* configurations status */
394: int(*del_if) (struct sdla*, struct ifnet*);
395: void(*isr)(struct sdla*); /* interrupt service routine */
396: void(*poll)(struct sdla*); /* polling routine */
397: int(*exec)(struct sdla*, void*, void*);
398: int(*ioctl) (struct ifnet*, int, struct ifreq*);
399:
400: union {
401: sdla_xilinx_t xilinx;
402: } u;
403:
404: sdla_fe_iface_t fe_iface;
405: union {
406: #define fe_te u_fe.te_sc
407: sdla_te_softc_t te_sc;
408: } u_fe;
409:
410: unsigned char front_end_status;
411: WRITE_FRONT_END_REG_T* write_front_end_reg;
412: READ_FRONT_END_REG_T* read_front_end_reg;
413: void(*te_enable_timer) (void*);
414: void(*te_link_state) (void*);
415:
416: LIST_HEAD(,wanpipe_common) dev_head;
417: LIST_ENTRY(sdla) next; /* -> next device */
418: } sdla_t;
419:
420: /****** Public Functions ****************************************************/
421:
422: void* wan_xilinx_init(sdla_t*); /* Xilinx Hardware Support */
423: struct mbuf* wan_mbuf_alloc(int);
424: int wan_mbuf_to_buffer(struct mbuf**);
425:
426: #endif /* __KERNEL__ */
427: #endif /* __IF_SAN_COMMON_H */
CVSweb