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