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
|
/*
* Mach Operating System
* Copyright (c) 1992 Carnegie Mellon University
* All Rights Reserved.
*
* Permission to use, copy, modify and distribute this software and its
* documentation is hereby granted, provided that both the copyright
* notice and this permission notice appear in all copies of the
* software, derivative works or modified versions, and any portions
* thereof, and that both notices appear in supporting documentation.
*
* CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
* CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
* ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
*
* Carnegie Mellon requests users of this software to return to
*
* Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
* School of Computer Science
* Carnegie Mellon University
* Pittsburgh PA 15213-3890
*
* any improvements or extensions that they make and grant Carnegie Mellon
* the rights to redistribute these changes.
*/
#ifndef _TCA100_H_
#define _TCA100_H_ 1
#ifndef STUB
#include <chips/nw.h>
#else
#include "nw.h"
#endif
/*** FORE TCA-100 Turbochannel ATM computer interface ***/
/*** HARDWARE REGISTERS ***/
typedef volatile unsigned int vol_u_int;
typedef struct atm_device {
unsigned int prom[64 * 1024 / 4];
vol_u_int sreg;
vol_u_int creg_set;
vol_u_int creg_clr;
vol_u_int creg;
vol_u_int rxtimer;
unsigned int pad1;
vol_u_int rxtimerv;
unsigned int pad2;
vol_u_int rxcount;
unsigned int pad3;
vol_u_int rxthresh;
unsigned int pad4;
vol_u_int txcount;
unsigned int pad5;
vol_u_int txthresh;
unsigned int pad6[64*1024/4 - 15];
vol_u_int rxfifo[14];
unsigned int pad7[64*1024/4 - 14];
vol_u_int txfifo[14];
unsigned int pad8[64*1024/4 - 14];
} atm_device_s, *atm_device_t;
/*** DEFINITION OF BITS IN THE STATUS AND CONTROL REGISTERS ***/
#define RX_COUNT_INTR 0x0001
#define RX_EOM_INTR 0x0002
#define RX_TIME_INTR 0x0004
#define TX_COUNT_INTR 0x0008
#define RX_CELL_LOST 0x0010
#define RX_NO_CARRIER 0x0020
#define CR_RX_ENABLE 0x0040
#define CR_TX_ENABLE 0x0080
#define CR_RX_RESET 0x0100
#define CR_TX_RESET 0x0200
#define RX_COUNTER_MASK 0x03ff
/*** DEFINITION OF FIELDS FOR AAL3/4 WITH THE TCA-100 PADDING ***/
/*Header -- ATM header*/
#define VPI 0x0ff00000
#define VCI 0x000ffff0
#define ATM_HEADER_RSV_BITS 0x00000004
#define PERMANENT_VIRTUAL_CONNECTIONS 1
#if PERMANENT_VIRTUAL_CONNECTIONS
#define ATM_VPVC_MASK 0x3ff00000
#define ATM_VPVC_SHIFT 20
#else
#define ATM_VPVC_MASK 0x00003ff0
#define ATM_VPVC_SHIFT 4
#endif
/*First payload word -- SAR header*/
#define ATM_HEADER_CRC 0xff000000
#define ATM_HEADER_CRC_SYNDROME 0x00ff0000
#define SEG_TYPE 0x0000c000
#define BOM 0x00008000
#define COM 0x00000000
#define EOM 0x00004000
#define SSM 0x0000c000
#define BOM_DATA_SIZE 40
#define COM_DATA_SIZE 44
#define EOM_DATA_SIZE 40
#define SSM_DATA_SIZE 36
#define SEQ_NO 0x00003c00
#define SEQ_INC 0x00000400
#define MID 0x000003ff
#define MID_INC 0x00000001
#define SAR_HEADER_MASK (ATM_HEADER_CRC_SYNDROME | SEG_TYPE | SEQ_NO | MID)
/*Trailer -- SAR trailer and error flags*/
#define PAYLOAD_LENGTH 0xfc000000
#define FULL_SEGMENT_TRAILER (44 << 26)
#define EMPTY_SEGMENT_TRAILER (4 << 26)
#define SYNCH_SEGMENT_TRAILER (16 << 26)
#define FRAMING_ERROR 0x0001
#define HEADER_CRC_ERROR 0x0002
#define PAYLOAD_CRC_ERROR 0x0004
#define PAD2_ERROR 0x0007
#define SAR_TRAILER_MASK (PAYLOAD_LENGTH | PAD2_ERROR)
/*This field should be FULL_SEGMENT_TRAILER IN BOM OR COM*/
/*CS header and trailer fields*/
#define CS_PDU_TYPE 0xff000000
#define BE_TAG 0x00ff0000
#define BA_SIZE 0x0000ffff
#define CS_PROTOCOL_CONTROL_FIELD 0xff000000
#define CS_LENGTH 0x0000ffff
/*** DEVICE STATUS ***/
typedef enum { /*"Flavors" for device_get_status and device_set_status*/
ATM_MAP_SIZE, /* device_get_status options */
ATM_MTU_SIZE,
ATM_EVC_ID, /* ID of event counter assigned to device */
ATM_ASSIGNMENT, /* Returns two words indicating whether device is mapped
and number of tasks with the device open */
/* device_set_status options */
ATM_INITIALIZE, /* Restarts hardware and low-level driver */
ATM_PVC_SET /* Sets up a permanent virtual connection --
the status argument array is cast to a nw_pvc_s
structure */
} atm_status;
typedef struct {
nw_peer_s pvc; /* Permanent virtual connection */
u_int tx_vp; /* VPI used for transmissions to permanent virtual
connection. The VPI used for reception is the
local endpoint number. VCIs are 0 */
nw_protocol protocol; /* Protocol of connection (possibly NW_LINE) */
} nw_pvc_s, *nw_pvc_t;
/*** BYTE ORDER ***/
/*The ATM header and SAR header and trailer are converted to and from
host byte order by hardware. CS headers and trailers and
signaling messages need byte order conversion in software.
Conversion in software is also necessary for application messages
if the communicating hosts have different byte orders (e.g. DECstation
and SPARCstation). */
#define HTONL(x) \
((x << 24) | ((x & 0xff00) << 8) | ((x >> 8) & 0xff00) | ((u_int) x >> 24))
#define NTOHL(x) HTONL(x)
#if 0
unsigned int htonl(unsigned int x) {
return ((x << 24) | ((x & 0xff00) << 8) | ((x >> 8) & 0xff00) | (x >> 24));
}
#define ntohl(x) htonl(x)
#endif
#endif /* _TCA100_H_ */
|