Annotation of sys/dev/pci/if_san_common.h, Revision 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