summaryrefslogtreecommitdiff
path: root/sys/dev/pci/if_san_common.h
blob: 59d19a882f125f24b651cccdc0794ddfc67a114b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
/*	$OpenBSD: if_san_common.h,v 1.9 2012/09/19 22:37:23 jsg Exp $	*/

/*-
 * Copyright (c) 2001-2004 Sangoma Technologies (SAN)
 * All rights reserved.  www.sangoma.com
 *
 * This code is written by Alex Feldman <al.feldman@sangoma.com> for SAN.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above
 *    copyright notice, this list of conditions and the following disclaimer
 *    in the documentation and/or other materials provided with the
 *    distribution.
 * 3. Neither the name of Sangoma Technologies nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY SANGOMA TECHNOLOGIES AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef	__IF_SAN_COMMON_H
#define	__IF_SAN_COMMON_H

# include <dev/pci/if_san_te1.h>
# include <dev/pci/if_sandrv.h>

#define ADDR_MASK(x,y) (((caddr_t)(x) - (caddr_t)0) & (y))

#define WANPIPE_LITE_VERSION	"1.1.1"
#define WAN_OPENBSD_PLATFORM	0x06
#define WAN_PLATFORM_ID	WAN_OPENBSD_PLATFORM
#define	WANPIPE_MAGIC	0x414C4453L	/* signature: 'SDLA' reversed */

#define	ROUTER_NAME	"wanrouter"	/* in case we ever change it */
#define	ROUTER_IOCTL	'W'		/* for IOCTL calls */

#define WANROUTER_MAJOR_VER	2
#define WANROUTER_MINOR_VER	1

/* IOCTL codes for /proc/router/<device> entries (up to 255) */
#define WANPIPE_DUMP	_IOW(ROUTER_IOCTL, 16, wan_conf_t)
#define WANPIPE_EXEC	_IOWR(ROUTER_IOCTL, 17, wan_conf_t)

/* get monitor statistics */
#define SIOC_WANPIPE_PIPEMON	_IOWR('i', 150, struct ifreq)

/* set generic device */
#define SIOC_WANPIPE_DEVICE	_IOWR('i', 151, struct ifreq)

/* get hwprobe string */
#define SIOC_WANPIPE_HWPROBE	_IOWR('i', 152, struct ifreq)

/* get memdump string (GENERIC) */
#define SIOC_WANPIPE_DUMP	_IOWR('i', 153, struct ifreq)


/* clocking options */
#define	WAN_EXTERNAL	0
#define	WAN_INTERNAL	1

/* intercace options */
#define	WAN_RS232	0
#define	WAN_V35	1

#define WAN_UDP_FAILED_CMD	0xCF
#define WAN_UDP_INVALID_CMD	0xCE
#define WAN_UDP_TIMEOUT_CMD	0xAA
#define WAN_UDP_INVALID_NET_CMD     0xCD

#define	WAN_NO	0
#define	WAN_YES	1

/* UDP Packet Management */
#define UDP_PKT_FRM_STACK	0x00
#define UDP_PKT_FRM_NETWORK	0x01

#define	WANCONFIG_FR	102	/* frame relay link */
#define	WANCONFIG_PPP	103	/* synchronous PPP link */
#define WANCONFIG_CHDLC	104	/* Cisco HDLC Link */
#define WANCONFIG_AFT    117	/* AFT Hardware Support */
/****** Data Types **********************************************************/


/* Front-End status */
enum fe_status {
	FE_UNITIALIZED = 0x00,
	FE_DISCONNECTED,
	FE_CONNECTED
};

/* 'state' defines */
enum wan_states
{
	WAN_UNCONFIGURED,	/* link/channel is not configured */
	WAN_DISCONNECTED,	/* link/channel is disconnected */
	WAN_CONNECTING,		/* connection is in progress */
	WAN_CONNECTED,		/* link/channel is operational */
	WAN_LIMIT,		/* for verification only */
	WAN_DUALPORT,		/* for Dual Port cards */
	WAN_DISCONNECTING,
	WAN_FT1_READY		/* FT1 Configurator Ready */
};

/* 'modem_status' masks */
#define	WAN_MODEM_CTS	0x0001	/* CTS line active */
#define	WAN_MODEM_DCD	0x0002	/* DCD line active */
#define	WAN_MODEM_DTR	0x0010	/* DTR line active */
#define	WAN_MODEM_RTS	0x0020	/* RTS line active */

typedef struct wan_conf {
	char	devname[IFNAMSIZ+1];
	void*	arg;
} wan_conf_t;


/* IOCTL numbers (up to 16) */

#define TRACE_ALL                       0x00
#define TRACE_PROT			0x01
#define TRACE_DATA			0x02

/* values for request/reply byte */
#define UDPMGMT_REQUEST	0x01
#define UDPMGMT_REPLY	0x02
#define UDP_OFFSET	12

#define MAX_FT1_RETRY	100

/* General Critical Flags */
enum {
	SEND_CRIT,
	PERI_CRIT,
	RX_CRIT,
	PRIV_CRIT
};

/*
 * Data structures for IOCTL calls.
 */

typedef struct sdla_dump {	/* WANPIPE_DUMP */
	unsigned long	magic;	/* for verification */
	unsigned long	offset;	/* absolute adapter memory address */
	unsigned long	length;	/* block length */
	void*		ptr;	/* -> buffer */
} sdla_dump_t;

typedef struct sdla_exec {	/* WANPIPE_EXEC */
	unsigned long	magic;	/* for verification */
	void*		cmd;	/* -> command structure */
	void*		data;	/* -> data buffer */
} sdla_exec_t;

#define TRC_INCOMING_FRM	0x00
#define TRC_OUTGOING_FRM	0x01
typedef struct {
	unsigned char	status;
	unsigned char	data_avail;
	unsigned short	real_length;
	unsigned short	time_stamp;
	unsigned long	sec;
	unsigned long	usec;
	unsigned char	data[0];
} wan_trace_pkt_t;

typedef struct wan_trace {
	unsigned long	tracing_enabled;
	struct ifqueue	ifq;
	unsigned int	trace_timeout;
	unsigned int	max_trace_queue;
} wan_trace_t;


/********************************************************
 *	GLOBAL DEFINITION FOR SANGOMA UDP STRUCTURE	*
 *******************************************************/
#define GLOBAL_UDP_SIGNATURE		"WANPIPE"
#define GLOBAL_UDP_SIGNATURE_LEN	7
#define UDPMGMT_UDP_PROTOCOL		0x11
#define WAN_UDP_CMD_START	0x60
#define WAN_GET_PROTOCOL	(WAN_UDP_CMD_START+0)
#define WAN_GET_PLATFORM	(WAN_UDP_CMD_START+1)
#define WAN_GET_MEDIA_TYPE	(WAN_UDP_CMD_START+2)
#define WAN_UDP_CMD_END		0x6F

#define WAN_FE_CMD_START	0x90
#define WAN_FE_CMD_END		0x9F

#define WAN_INTERFACE_CMD_START	0xA0
#define WAN_INTERFACE_CMD_END	0xAF

#define WAN_FE_UDP_CMD_START	0xB0
#define WAN_FE_UDP_CMD_END	0xBF

typedef struct {
	unsigned char	signature[8];
	unsigned char	request_reply;
	unsigned char	id;
	unsigned char	reserved[6];
} wan_mgmt_t;


/****** DEFINITION OF UDP HEADER AND STRUCTURE PER PROTOCOL ******/
typedef struct {
	unsigned char	num_frames;
	unsigned char	ismoredata;
} wan_trace_info_t;

typedef struct wan_udp_hdr{
	wan_mgmt_t	wan_mgmt;
	wan_cmd_t	wan_cmd;
	union {
		struct {
			wan_trace_info_t	trace_info;
			unsigned char		data[WAN_MAX_DATA_SIZE];
		} chdlc, aft;
		unsigned char data[WAN_MAX_DATA_SIZE];
	} wan_udphdr_u;
#define wan_udphdr_signature		wan_mgmt.signature
#define wan_udphdr_request_reply	wan_mgmt.request_reply
#define wan_udphdr_id			wan_mgmt.id
#define wan_udphdr_opp_flag		wan_cmd.wan_cmd_opp_flag
#define wan_udphdr_command		wan_cmd.wan_cmd_command
#define wan_udphdr_data_len		wan_cmd.wan_cmd_data_len
#define wan_udphdr_return_code		wan_cmd.wan_cmd_return_code
#define wan_udphdr_chdlc_num_frames	wan_udphdr_u.chdlc.trace_info.num_frames
#define wan_udphdr_chdlc_ismoredata	wan_udphdr_u.chdlc.trace_info.ismoredata
#define wan_udphdr_chdlc_data		wan_udphdr_u.chdlc.data

#define wan_udphdr_aft_num_frames	wan_udphdr_u.aft.trace_info.num_frames
#define wan_udphdr_aft_ismoredata	wan_udphdr_u.aft.trace_info.ismoredata
#define wan_udphdr_aft_data		wan_udphdr_u.aft.data
#define wan_udphdr_data			wan_udphdr_u.data
} wan_udp_hdr_t;

#define MAX_LGTH_UDP_MGNT_PKT 2000

/* This is used for interrupt testing */
#define INTR_TEST_MODE	0x02

#define	WUM_SIGNATURE_L	0x50495046
#define	WUM_SIGNATURE_H	0x444E3845

#define	WUM_KILL	0x50
#define	WUM_EXEC	0x51


#if defined(_KERNEL)
/****** Kernel Interface ****************************************************/


#define MAX_E1_CHANNELS 32
#define MAX_FR_CHANNELS (991+1)

#ifndef	min
#define min(a,b) (((a)<(b))?(a):(b))
#endif
#ifndef	max
#define max(a,b) (((a)>(b))?(a):(b))
#endif

#define	is_digit(ch) (((ch)>=(unsigned)'0'&&(ch)<=(unsigned)'9')?1:0)

#define	is_alpha(ch) ((((ch)>=(unsigned)'a'&&(ch)<=(unsigned)'z')||	\
		((ch)>=(unsigned)'A'&&(ch)<=(unsigned)'Z'))?1:0)

#define	is_hex_digit(ch) ((((ch)>=(unsigned)'0'&&(ch)<=(unsigned)'9')||	\
		((ch)>=(unsigned)'a'&&(ch)<=(unsigned)'f')||\
		((ch)>=(unsigned)'A'&&(ch)<=(unsigned)'F'))?1:0)
#if !defined(offsetof)
# define offsetof(type, member)	((size_t)(&((type*)0)->member))
#endif

# define irqreturn_t	void
/* Unsafe sprintf and vsprintf function removed from the kernel */
# define WAN_IRQ_RETVAL(a)		return;

#define	_bit_byte(bit) ((bit) >> 3)
#define	_bit_mask(bit) (1 << ((bit)&0x7))

/* is bit N of bitstring name set? */
#define	bit_test(name, bit) ((name)[_bit_byte(bit)] & _bit_mask(bit))

/* set bit N of bitstring name */
#define	bit_set(name, bit) ((name)[_bit_byte(bit)] |= _bit_mask(bit))

/* clear bit N of bitstring name */
#define	bit_clear(name, bit) ((name)[_bit_byte(bit)] &= ~_bit_mask(bit))

/* Sangoma assert macro */
#define SAN_ASSERT(a)						\
	if (a){							\
		log(LOG_INFO, "%s:%d: Critical Error!\n",	\
				__FUNCTION__,__LINE__);		\
		return (EINVAL);				\
	}

/****** Data Structures *****************************************************/

typedef struct wan_udp_pkt {
	struct ip	ip_hdr;
	struct udphdr	udp_hdr;
	wan_udp_hdr_t	wan_udp_hdr;
#define wan_udp_cmd			wan_udp_hdr.wan_cmd
#define wan_udp_signature		wan_udp_hdr.wan_udphdr_signature
#define wan_udp_request_reply		wan_udp_hdr.wan_udphdr_request_reply
#define wan_udp_id			wan_udp_hdr.wan_udphdr_id
#define wan_udp_opp_flag		wan_udp_hdr.wan_udphdr_opp_flag
#define wan_udp_command			wan_udp_hdr.wan_udphdr_command
#define wan_udp_data_len		wan_udp_hdr.wan_udphdr_data_len
#define wan_udp_return_code		wan_udp_hdr.wan_udphdr_return_code
#define wan_udp_hdlc_PF_bit		wan_udp_hdr.wan_udphdr_hdlc_PF_bit
#define wan_udp_fr_dlci			wan_udp_hdr.wan_udphdr_fr_dlci
#define wan_udp_fr_attr			wan_udp_hdr.wan_udphdr_fr_attr
#define wan_udp_fr_rxlost1		wan_udp_hdr.wan_udphdr_fr_rxlost1
#define wan_udp_fr_rxlost2		wan_udp_hdr.wan_udphdr_fr_rxlost2
#define wan_udp_chdlc_num_frames	wan_udp_hdr.wan_udphdr_chdlc_num_frames
#define wan_udp_chdlc_ismoredata	wan_udp_hdr.wan_udphdr_chdlc_ismoredata
#define wan_udp_chdlc_data		wan_udp_hdr.wan_udphdr_chdlc_data

#define wan_udp_aft_num_frames		wan_udp_hdr.wan_udphdr_aft_num_frames
#define wan_udp_aft_ismoredata		wan_udp_hdr.wan_udphdr_aft_ismoredata
#define wan_udp_data			wan_udp_hdr.wan_udphdr_data
} wan_udp_pkt_t;

#define WAN_IFP_TO_COMMON(ifp)	(wanpipe_common_t*)((ifp)->if_softc)
typedef struct wanpipe_common {
	struct sppp	ifp;
	void		*card;
	struct timeout	dev_timer;
	unsigned int	protocol;
	struct ifmedia	ifm;

	LIST_ENTRY(wanpipe_common)	next;
} wanpipe_common_t;

typedef struct {
	unsigned long	time_slot_map;
	unsigned long	logic_ch_map;
	unsigned char	num_of_time_slots;
	unsigned char	top_logic_ch;
	unsigned long	bar;
	void		*trace_info;
	void		*dev_to_ch_map[MAX_E1_CHANNELS];
	void		*rx_dma_ptr;
	void		*tx_dma_ptr;
	unsigned short	num_of_ch;/* Number of logical channels */
	unsigned short	dma_per_ch;/* DMA buffers per logic channel */
	unsigned short	mru_trans;/* MRU of transparent channels */
	unsigned long	dma_mtu_off;
	unsigned short	dma_mtu;
	unsigned char	state_change_exit_isr;
	unsigned long	active_ch_map;
	unsigned long	fifo_addr_map;
	struct timeout	led_timer;
} sdla_xilinx_t;

/* Adapter Data Space.
 * This structure is needed because we handle multiple cards, otherwise
 * static data would do it.
 */
typedef struct sdla {
	unsigned	magic;
	char		devname[IFNAMSIZ+1];	/* card name */
	void		*hw;			/* hw configuration */
	unsigned int	type;			/* adapter type */
	unsigned char	line_idle;

	char		state;		/* device state */
	unsigned long	critical;	/* critical section flag */

	int(*iface_up) (struct ifnet*);
	int(*iface_down) (struct ifnet*);
	int(*iface_send) (struct mbuf* skb, struct ifnet*);
	int(*iface_ioctl) (struct ifnet*, u_long, struct ifreq*);

	unsigned long	state_tick;	/* link state timestamp */
	unsigned long	in_isr;		/* interrupt-in-service flag */
	unsigned long	configured;	/* configurations status */
	int(*del_if) (struct sdla*, struct ifnet*);
	void(*isr)(struct sdla*);	/* interrupt service routine */
	void(*poll)(struct sdla*);	/* polling routine */
	int(*exec)(struct sdla*, void*, void*);
	int(*ioctl) (struct ifnet*, u_long, struct ifreq*);

	union {
		sdla_xilinx_t	xilinx;
	} u;

	sdla_fe_iface_t	fe_iface;
	union {
#define fe_te	u_fe.te_sc
		sdla_te_softc_t	te_sc;
	} u_fe;

	unsigned char		front_end_status;
	WRITE_FRONT_END_REG_T*	write_front_end_reg;
	READ_FRONT_END_REG_T*	read_front_end_reg;
	void(*te_enable_timer) (void*);
	void(*te_link_state)  (void*);

	LIST_HEAD(,wanpipe_common)	dev_head;
	LIST_ENTRY(sdla)		next;	/* -> next device */
} sdla_t;

/****** Public Functions ****************************************************/

void*		wan_xilinx_init(sdla_t*);	/* Xilinx Hardware Support */
struct mbuf*	wan_mbuf_alloc(int);
int 		wan_mbuf_to_buffer(struct mbuf**);

#endif	/* __KERNEL__ */
#endif	/* __IF_SAN_COMMON_H */