xref: /OK3568_Linux_fs/kernel/tools/firewire/nosy-dump.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef __nosy_dump_h__
3*4882a593Smuzhiyun #define __nosy_dump_h__
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #define array_length(array) (sizeof(array) / sizeof(array[0]))
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #define ACK_NO_ACK   0x0
8*4882a593Smuzhiyun #define ACK_DONE(a)  ((a >> 2) == 0)
9*4882a593Smuzhiyun #define ACK_BUSY(a)  ((a >> 2) == 1)
10*4882a593Smuzhiyun #define ACK_ERROR(a) ((a >> 2) == 3)
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #include <stdint.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun struct phy_packet {
15*4882a593Smuzhiyun 	uint32_t timestamp;
16*4882a593Smuzhiyun 	union {
17*4882a593Smuzhiyun 		struct {
18*4882a593Smuzhiyun 			uint32_t zero:24;
19*4882a593Smuzhiyun 			uint32_t phy_id:6;
20*4882a593Smuzhiyun 			uint32_t identifier:2;
21*4882a593Smuzhiyun 		} common, link_on;
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun 		struct {
24*4882a593Smuzhiyun 			uint32_t zero:16;
25*4882a593Smuzhiyun 			uint32_t gap_count:6;
26*4882a593Smuzhiyun 			uint32_t set_gap_count:1;
27*4882a593Smuzhiyun 			uint32_t set_root:1;
28*4882a593Smuzhiyun 			uint32_t root_id:6;
29*4882a593Smuzhiyun 			uint32_t identifier:2;
30*4882a593Smuzhiyun 		} phy_config;
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun 		struct {
33*4882a593Smuzhiyun 			uint32_t more_packets:1;
34*4882a593Smuzhiyun 			uint32_t initiated_reset:1;
35*4882a593Smuzhiyun 			uint32_t port2:2;
36*4882a593Smuzhiyun 			uint32_t port1:2;
37*4882a593Smuzhiyun 			uint32_t port0:2;
38*4882a593Smuzhiyun 			uint32_t power_class:3;
39*4882a593Smuzhiyun 			uint32_t contender:1;
40*4882a593Smuzhiyun 			uint32_t phy_delay:2;
41*4882a593Smuzhiyun 			uint32_t phy_speed:2;
42*4882a593Smuzhiyun 			uint32_t gap_count:6;
43*4882a593Smuzhiyun 			uint32_t link_active:1;
44*4882a593Smuzhiyun 			uint32_t extended:1;
45*4882a593Smuzhiyun 			uint32_t phy_id:6;
46*4882a593Smuzhiyun 			uint32_t identifier:2;
47*4882a593Smuzhiyun 		} self_id;
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun 		struct {
50*4882a593Smuzhiyun 			uint32_t more_packets:1;
51*4882a593Smuzhiyun 			uint32_t reserved1:1;
52*4882a593Smuzhiyun 			uint32_t porth:2;
53*4882a593Smuzhiyun 			uint32_t portg:2;
54*4882a593Smuzhiyun 			uint32_t portf:2;
55*4882a593Smuzhiyun 			uint32_t porte:2;
56*4882a593Smuzhiyun 			uint32_t portd:2;
57*4882a593Smuzhiyun 			uint32_t portc:2;
58*4882a593Smuzhiyun 			uint32_t portb:2;
59*4882a593Smuzhiyun 			uint32_t porta:2;
60*4882a593Smuzhiyun 			uint32_t reserved0:2;
61*4882a593Smuzhiyun 			uint32_t sequence:3;
62*4882a593Smuzhiyun 			uint32_t extended:1;
63*4882a593Smuzhiyun 			uint32_t phy_id:6;
64*4882a593Smuzhiyun 			uint32_t identifier:2;
65*4882a593Smuzhiyun 		} ext_self_id;
66*4882a593Smuzhiyun 	};
67*4882a593Smuzhiyun 	uint32_t inverted;
68*4882a593Smuzhiyun 	uint32_t ack;
69*4882a593Smuzhiyun };
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun #define TCODE_PHY_PACKET 0x10
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun #define PHY_PACKET_CONFIGURATION 0x00
74*4882a593Smuzhiyun #define PHY_PACKET_LINK_ON 0x01
75*4882a593Smuzhiyun #define PHY_PACKET_SELF_ID 0x02
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun struct link_packet {
78*4882a593Smuzhiyun 	uint32_t timestamp;
79*4882a593Smuzhiyun 	union {
80*4882a593Smuzhiyun 		struct {
81*4882a593Smuzhiyun 			uint32_t priority:4;
82*4882a593Smuzhiyun 			uint32_t tcode:4;
83*4882a593Smuzhiyun 			uint32_t rt:2;
84*4882a593Smuzhiyun 			uint32_t tlabel:6;
85*4882a593Smuzhiyun 			uint32_t destination:16;
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun 			uint32_t offset_high:16;
88*4882a593Smuzhiyun 			uint32_t source:16;
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun 			uint32_t offset_low;
91*4882a593Smuzhiyun 		} common;
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun 		struct {
94*4882a593Smuzhiyun 			uint32_t common[3];
95*4882a593Smuzhiyun 			uint32_t crc;
96*4882a593Smuzhiyun 		} read_quadlet;
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun 		struct {
99*4882a593Smuzhiyun 			uint32_t common[3];
100*4882a593Smuzhiyun 			uint32_t data;
101*4882a593Smuzhiyun 			uint32_t crc;
102*4882a593Smuzhiyun 		} read_quadlet_response;
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun 		struct {
105*4882a593Smuzhiyun 			uint32_t common[3];
106*4882a593Smuzhiyun 			uint32_t extended_tcode:16;
107*4882a593Smuzhiyun 			uint32_t data_length:16;
108*4882a593Smuzhiyun 			uint32_t crc;
109*4882a593Smuzhiyun 		} read_block;
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun 		struct {
112*4882a593Smuzhiyun 			uint32_t common[3];
113*4882a593Smuzhiyun 			uint32_t extended_tcode:16;
114*4882a593Smuzhiyun 			uint32_t data_length:16;
115*4882a593Smuzhiyun 			uint32_t crc;
116*4882a593Smuzhiyun 			uint32_t data[0];
117*4882a593Smuzhiyun 			/* crc and ack follows. */
118*4882a593Smuzhiyun 		} read_block_response;
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun 		struct {
121*4882a593Smuzhiyun 			uint32_t common[3];
122*4882a593Smuzhiyun 			uint32_t data;
123*4882a593Smuzhiyun 			uint32_t crc;
124*4882a593Smuzhiyun 		} write_quadlet;
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun 		struct {
127*4882a593Smuzhiyun 			uint32_t common[3];
128*4882a593Smuzhiyun 			uint32_t extended_tcode:16;
129*4882a593Smuzhiyun 			uint32_t data_length:16;
130*4882a593Smuzhiyun 			uint32_t crc;
131*4882a593Smuzhiyun 			uint32_t data[0];
132*4882a593Smuzhiyun 			/* crc and ack follows. */
133*4882a593Smuzhiyun 		} write_block;
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun 		struct {
136*4882a593Smuzhiyun 			uint32_t common[3];
137*4882a593Smuzhiyun 			uint32_t crc;
138*4882a593Smuzhiyun 		} write_response;
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun 		struct {
141*4882a593Smuzhiyun 			uint32_t common[3];
142*4882a593Smuzhiyun 			uint32_t data;
143*4882a593Smuzhiyun 			uint32_t crc;
144*4882a593Smuzhiyun 		} cycle_start;
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun 		struct {
147*4882a593Smuzhiyun 			uint32_t sy:4;
148*4882a593Smuzhiyun 			uint32_t tcode:4;
149*4882a593Smuzhiyun 			uint32_t channel:6;
150*4882a593Smuzhiyun 			uint32_t tag:2;
151*4882a593Smuzhiyun 			uint32_t data_length:16;
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun 			uint32_t crc;
154*4882a593Smuzhiyun 		} iso_data;
155*4882a593Smuzhiyun 	};
156*4882a593Smuzhiyun };
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun struct subaction {
159*4882a593Smuzhiyun 	uint32_t ack;
160*4882a593Smuzhiyun 	size_t length;
161*4882a593Smuzhiyun 	struct list link;
162*4882a593Smuzhiyun 	struct link_packet packet;
163*4882a593Smuzhiyun };
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun struct link_transaction {
166*4882a593Smuzhiyun 	int request_node, response_node, tlabel;
167*4882a593Smuzhiyun 	struct subaction *request, *response;
168*4882a593Smuzhiyun 	struct list request_list, response_list;
169*4882a593Smuzhiyun 	struct list link;
170*4882a593Smuzhiyun };
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun int decode_fcp(struct link_transaction *t);
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun #endif /* __nosy_dump_h__ */
175