d8bcb61ab954ba03b101b1b51c46846cb0933f8f
[linux-3.10.git] / tools / firewire / nosy-dump.h
1 #ifndef __nosy_dump_h__
2 #define __nosy_dump_h__
3
4 #define array_length(array) (sizeof(array) / sizeof(array[0]))
5
6 #define TCODE_WRITE_QUADLET         0x0
7 #define TCODE_WRITE_BLOCK           0x1
8 #define TCODE_WRITE_RESPONSE        0x2
9 #define TCODE_READ_QUADLET          0x4
10 #define TCODE_READ_BLOCK            0x5
11 #define TCODE_READ_QUADLET_RESPONSE 0x6
12 #define TCODE_READ_BLOCK_RESPONSE   0x7
13 #define TCODE_CYCLE_START           0x8
14 #define TCODE_LOCK_REQUEST          0x9
15 #define TCODE_ISO_DATA              0xa
16 #define TCODE_LOCK_RESPONSE         0xb
17 #define TCODE_PHY_PACKET            0x10
18
19 #define ACK_NO_ACK               0x0
20 #define ACK_COMPLETE             0x1
21 #define ACK_PENDING              0x2
22 #define ACK_BUSY_X               0x4
23 #define ACK_BUSY_A               0x5
24 #define ACK_BUSY_B               0x6
25 #define ACK_DATA_ERROR           0xd
26 #define ACK_TYPE_ERROR           0xe 
27
28 #define ACK_DONE(a)  ((a >> 2) == 0)
29 #define ACK_BUSY(a)  ((a >> 2) == 1)
30 #define ACK_ERROR(a) ((a >> 2) == 3)
31
32 #define SPEED_100                0x0
33 #define SPEED_200                0x1
34 #define SPEED_400                0x2
35
36 struct phy_packet {
37   unsigned long timestamp;
38
39   union {
40     struct {
41       unsigned int zero : 24;
42       unsigned int phy_id : 6;
43       unsigned int identifier : 2;
44     } common, link_on;
45     struct {
46       unsigned int zero : 16;
47       unsigned int gap_count : 6;
48       unsigned int set_gap_count : 1;
49       unsigned int set_root : 1;
50       unsigned int root_id : 6;
51       unsigned int identifier : 2;
52     } phy_config;
53     struct {
54       unsigned int more_packets : 1;
55       unsigned int initiated_reset : 1;
56       unsigned int port2 : 2;
57       unsigned int port1 : 2;
58       unsigned int port0 : 2;
59       unsigned int power_class : 3;
60       unsigned int contender : 1;
61       unsigned int phy_delay : 2;
62       unsigned int phy_speed : 2;
63       unsigned int gap_count : 6;
64       unsigned int link_active : 1;
65       unsigned int extended : 1;
66       unsigned int phy_id : 6;
67       unsigned int identifier : 2;
68     } self_id;
69
70     struct {
71       unsigned int more_packets : 1;
72       unsigned int reserved1 : 1;
73       unsigned int porth : 2;
74       unsigned int portg : 2;
75       unsigned int portf : 2;
76       unsigned int porte : 2;
77       unsigned int portd : 2;
78       unsigned int portc : 2;
79       unsigned int portb : 2;
80       unsigned int porta : 2;
81       unsigned int reserved0 : 2;
82       unsigned int sequence : 3;
83       unsigned int extended : 1;
84       unsigned int phy_id : 6;
85       unsigned int identifier : 2;
86     } ext_self_id;
87   };
88
89   unsigned long inverted;
90   unsigned long ack;
91 };
92
93 #define PHY_PACKET_CONFIGURATION 0x00
94 #define PHY_PACKET_LINK_ON 0x01
95 #define PHY_PACKET_SELF_ID 0x02
96
97 struct link_packet {
98   unsigned long timestamp;
99
100   union {
101     struct {
102       unsigned int priority : 4;
103       unsigned int tcode : 4;
104       unsigned int rt : 2;
105       unsigned int tlabel : 6;
106       unsigned int destination : 16;
107
108       unsigned int offset_high : 16;
109       unsigned int source : 16;
110
111       unsigned long offset_low;
112     } common;
113
114     struct {
115       unsigned int priority : 4;
116       unsigned int tcode : 4;
117       unsigned int rt : 2;
118       unsigned int tlabel : 6;
119       unsigned int destination : 16;
120
121       unsigned int offset_high : 16;
122       unsigned int source : 16;
123
124       unsigned long offset_low;
125
126       unsigned long crc;
127     } read_quadlet;
128
129     struct {
130       unsigned int priority : 4;
131       unsigned int tcode : 4;
132       unsigned int rt : 2;
133       unsigned int tlabel : 6;
134       unsigned int destination : 16;
135
136       unsigned int reserved0 : 12;
137       unsigned int rcode : 4;
138       unsigned int source : 16;
139
140       unsigned long reserved1;
141
142       unsigned long data;
143  
144       unsigned long crc; 
145     } read_quadlet_response;
146
147     struct {
148       unsigned int priority : 4;
149       unsigned int tcode : 4;
150       unsigned int rt : 2;
151       unsigned int tlabel : 6;
152       unsigned int destination : 16;
153
154       unsigned int offset_high : 16;
155       unsigned int source : 16;
156
157       unsigned long offset_low;
158
159       unsigned int extended_tcode : 16;
160       unsigned int data_length : 16;
161
162       unsigned long crc;
163     } read_block;
164
165     struct {
166       unsigned int priority : 4;
167       unsigned int tcode : 4;
168       unsigned int rt : 2;
169       unsigned int tlabel : 6;
170       unsigned int destination : 16;
171
172       unsigned int reserved0 : 12;
173       unsigned int rcode : 4;
174       unsigned int source : 16;
175
176       unsigned long reserved1;
177
178       unsigned int extended_tcode : 16;
179       unsigned int data_length : 16;
180
181       unsigned long crc; 
182
183       unsigned long data[0];
184
185       /* crc and ack follows. */
186
187     } read_block_response;
188
189     struct {
190       unsigned int priority : 4;
191       unsigned int tcode : 4;
192       unsigned int rt : 2;
193       unsigned int tlabel : 6;
194       unsigned int destination : 16;
195
196       unsigned int offset_high : 16;
197       unsigned int source : 16;
198
199       unsigned long offset_low;
200
201       unsigned long data;
202  
203       unsigned long crc; 
204
205     } write_quadlet;
206
207     struct {
208       unsigned int priority : 4;
209       unsigned int tcode : 4;
210       unsigned int rt : 2;
211       unsigned int tlabel : 6;
212       unsigned int destination : 16;
213
214       unsigned int offset_high : 16;
215       unsigned int source : 16;
216
217       unsigned int offset_low : 32;
218
219       unsigned int extended_tcode : 16;
220       unsigned int data_length : 16;
221  
222       unsigned long crc; 
223       unsigned long data[0];
224
225       /* crc and ack follows. */
226
227     } write_block;
228
229     struct {
230       unsigned int priority : 4;
231       unsigned int tcode : 4;
232       unsigned int rt : 2;
233       unsigned int tlabel : 6;
234       unsigned int destination : 16;
235
236       unsigned int reserved0 : 12;
237       unsigned int rcode : 4;
238       unsigned int source : 16;
239
240       unsigned long reserved1;
241
242       unsigned long crc; 
243     } write_response;
244
245     struct {
246       unsigned int priority : 4;
247       unsigned int tcode : 4;
248       unsigned int rt : 2;
249       unsigned int tlabel : 6;
250       unsigned int destination : 16;
251
252       unsigned int offset_high : 16;
253       unsigned int source : 16;
254
255       unsigned long offset_low;
256
257       unsigned long data;
258
259       unsigned long crc; 
260     } cycle_start;
261
262     struct {
263       unsigned int sy : 4;
264       unsigned int tcode : 4;
265       unsigned int channel : 6;
266       unsigned int tag : 2;
267       unsigned int data_length : 16;
268
269       unsigned long crc;
270     } iso_data;
271
272   };
273
274 };
275
276 struct subaction {
277   unsigned long ack;
278   size_t length;
279   struct list link;
280   struct link_packet packet;
281 };
282
283 struct link_transaction {
284   int request_node, response_node, tlabel;
285   struct subaction *request, *response;
286   struct list request_list, response_list;
287   struct list link;
288 };
289
290 int decode_fcp(struct link_transaction *t);
291
292 #endif /* __nosy_dump_h__ */