0001
0002 #ifndef __nosy_dump_h__
0003 #define __nosy_dump_h__
0004
0005 #define array_length(array) (sizeof(array) / sizeof(array[0]))
0006
0007 #define ACK_NO_ACK 0x0
0008 #define ACK_DONE(a) ((a >> 2) == 0)
0009 #define ACK_BUSY(a) ((a >> 2) == 1)
0010 #define ACK_ERROR(a) ((a >> 2) == 3)
0011
0012 #include <stdint.h>
0013
0014 struct phy_packet {
0015 uint32_t timestamp;
0016 union {
0017 struct {
0018 uint32_t zero:24;
0019 uint32_t phy_id:6;
0020 uint32_t identifier:2;
0021 } common, link_on;
0022
0023 struct {
0024 uint32_t zero:16;
0025 uint32_t gap_count:6;
0026 uint32_t set_gap_count:1;
0027 uint32_t set_root:1;
0028 uint32_t root_id:6;
0029 uint32_t identifier:2;
0030 } phy_config;
0031
0032 struct {
0033 uint32_t more_packets:1;
0034 uint32_t initiated_reset:1;
0035 uint32_t port2:2;
0036 uint32_t port1:2;
0037 uint32_t port0:2;
0038 uint32_t power_class:3;
0039 uint32_t contender:1;
0040 uint32_t phy_delay:2;
0041 uint32_t phy_speed:2;
0042 uint32_t gap_count:6;
0043 uint32_t link_active:1;
0044 uint32_t extended:1;
0045 uint32_t phy_id:6;
0046 uint32_t identifier:2;
0047 } self_id;
0048
0049 struct {
0050 uint32_t more_packets:1;
0051 uint32_t reserved1:1;
0052 uint32_t porth:2;
0053 uint32_t portg:2;
0054 uint32_t portf:2;
0055 uint32_t porte:2;
0056 uint32_t portd:2;
0057 uint32_t portc:2;
0058 uint32_t portb:2;
0059 uint32_t porta:2;
0060 uint32_t reserved0:2;
0061 uint32_t sequence:3;
0062 uint32_t extended:1;
0063 uint32_t phy_id:6;
0064 uint32_t identifier:2;
0065 } ext_self_id;
0066 };
0067 uint32_t inverted;
0068 uint32_t ack;
0069 };
0070
0071 #define TCODE_PHY_PACKET 0x10
0072
0073 #define PHY_PACKET_CONFIGURATION 0x00
0074 #define PHY_PACKET_LINK_ON 0x01
0075 #define PHY_PACKET_SELF_ID 0x02
0076
0077 struct link_packet {
0078 uint32_t timestamp;
0079 union {
0080 struct {
0081 uint32_t priority:4;
0082 uint32_t tcode:4;
0083 uint32_t rt:2;
0084 uint32_t tlabel:6;
0085 uint32_t destination:16;
0086
0087 uint32_t offset_high:16;
0088 uint32_t source:16;
0089
0090 uint32_t offset_low;
0091 } common;
0092
0093 struct {
0094 uint32_t common[3];
0095 uint32_t crc;
0096 } read_quadlet;
0097
0098 struct {
0099 uint32_t common[3];
0100 uint32_t data;
0101 uint32_t crc;
0102 } read_quadlet_response;
0103
0104 struct {
0105 uint32_t common[3];
0106 uint32_t extended_tcode:16;
0107 uint32_t data_length:16;
0108 uint32_t crc;
0109 } read_block;
0110
0111 struct {
0112 uint32_t common[3];
0113 uint32_t extended_tcode:16;
0114 uint32_t data_length:16;
0115 uint32_t crc;
0116 uint32_t data[0];
0117
0118 } read_block_response;
0119
0120 struct {
0121 uint32_t common[3];
0122 uint32_t data;
0123 uint32_t crc;
0124 } write_quadlet;
0125
0126 struct {
0127 uint32_t common[3];
0128 uint32_t extended_tcode:16;
0129 uint32_t data_length:16;
0130 uint32_t crc;
0131 uint32_t data[0];
0132
0133 } write_block;
0134
0135 struct {
0136 uint32_t common[3];
0137 uint32_t crc;
0138 } write_response;
0139
0140 struct {
0141 uint32_t common[3];
0142 uint32_t data;
0143 uint32_t crc;
0144 } cycle_start;
0145
0146 struct {
0147 uint32_t sy:4;
0148 uint32_t tcode:4;
0149 uint32_t channel:6;
0150 uint32_t tag:2;
0151 uint32_t data_length:16;
0152
0153 uint32_t crc;
0154 } iso_data;
0155 };
0156 };
0157
0158 struct subaction {
0159 uint32_t ack;
0160 size_t length;
0161 struct list link;
0162 struct link_packet packet;
0163 };
0164
0165 struct link_transaction {
0166 int request_node, response_node, tlabel;
0167 struct subaction *request, *response;
0168 struct list request_list, response_list;
0169 struct list link;
0170 };
0171
0172 int decode_fcp(struct link_transaction *t);
0173
0174 #endif