1 | // SPDX-License-Identifier: GPL-2.0-or-later |
2 | // Copyright (c) 2024 Takashi Sakamoto |
3 | |
4 | #undef TRACE_SYSTEM |
5 | #define TRACE_SYSTEM firewire_ohci |
6 | |
7 | #if !defined(_FIREWIRE_OHCI_TRACE_EVENT_H) || defined(TRACE_HEADER_MULTI_READ) |
8 | #define _FIREWIRE_OHCI_TRACE_EVENT_H |
9 | |
10 | #include <linux/tracepoint.h> |
11 | |
12 | // Some macros and helper functions are defined in 'drivers/firewire/ohci.c'. |
13 | |
14 | TRACE_EVENT(irqs, |
15 | TP_PROTO(unsigned int card_index, u32 events), |
16 | TP_ARGS(card_index, events), |
17 | TP_STRUCT__entry( |
18 | __field(u8, card_index) |
19 | __field(u32, events) |
20 | ), |
21 | TP_fast_assign( |
22 | __entry->card_index = card_index; |
23 | __entry->events = events; |
24 | ), |
25 | TP_printk( |
26 | "card_index=%u events=%s" , |
27 | __entry->card_index, |
28 | __print_flags(__entry->events, "|" , |
29 | { OHCI1394_selfIDComplete, "selfIDComplete" }, |
30 | { OHCI1394_RQPkt, "RQPkt" }, |
31 | { OHCI1394_RSPkt, "RSPkt" }, |
32 | { OHCI1394_reqTxComplete, "reqTxComplete" }, |
33 | { OHCI1394_respTxComplete, "respTxComplete" }, |
34 | { OHCI1394_isochRx, "isochRx" }, |
35 | { OHCI1394_isochTx, "isochTx" }, |
36 | { OHCI1394_postedWriteErr, "postedWriteErr" }, |
37 | { OHCI1394_cycleTooLong, "cycleTooLong" }, |
38 | { OHCI1394_cycle64Seconds, "cycle64Seconds" }, |
39 | { OHCI1394_cycleInconsistent, "cycleInconsistent" }, |
40 | { OHCI1394_regAccessFail, "regAccessFail" }, |
41 | { OHCI1394_unrecoverableError, "unrecoverableError" }, |
42 | { OHCI1394_busReset, "busReset" } |
43 | ) |
44 | ) |
45 | ); |
46 | |
47 | #define QUADLET_SIZE 4 |
48 | |
49 | #define SELF_ID_COUNT_IS_ERROR(reg) \ |
50 | (!!(((reg) & OHCI1394_SelfIDCount_selfIDError_MASK) >> OHCI1394_SelfIDCount_selfIDError_SHIFT)) |
51 | |
52 | #define SELF_ID_COUNT_GET_GENERATION(reg) \ |
53 | (((reg) & OHCI1394_SelfIDCount_selfIDGeneration_MASK) >> OHCI1394_SelfIDCount_selfIDGeneration_SHIFT) |
54 | |
55 | #define SELF_ID_RECEIVE_Q0_GET_GENERATION(quadlet) \ |
56 | (((quadlet) & OHCI1394_SELF_ID_RECEIVE_Q0_GENERATION_MASK) >> OHCI1394_SELF_ID_RECEIVE_Q0_GENERATION_SHIFT) |
57 | |
58 | #define SELF_ID_RECEIVE_Q0_GET_TIMESTAMP(quadlet) \ |
59 | (((quadlet) & OHCI1394_SELF_ID_RECEIVE_Q0_TIMESTAMP_MASK) >> OHCI1394_SELF_ID_RECEIVE_Q0_TIMESTAMP_SHIFT) |
60 | |
61 | TRACE_EVENT(self_id_complete, |
62 | TP_PROTO(unsigned int card_index, u32 reg, const __le32 *self_id_receive, bool ), |
63 | TP_ARGS(card_index, reg, self_id_receive, has_be_header_quirk), |
64 | TP_STRUCT__entry( |
65 | __field(u8, card_index) |
66 | __field(u32, reg) |
67 | __dynamic_array(u32, self_id_receive, ohci1394_self_id_count_get_size(reg)) |
68 | ), |
69 | TP_fast_assign( |
70 | __entry->card_index = card_index; |
71 | __entry->reg = reg; |
72 | { |
73 | u32 *ptr = __get_dynamic_array(self_id_receive); |
74 | int i; |
75 | |
76 | for (i = 0; i < __get_dynamic_array_len(self_id_receive) / QUADLET_SIZE; ++i) |
77 | ptr[i] = cond_le32_to_cpu(self_id_receive[i], has_be_header_quirk); |
78 | } |
79 | ), |
80 | TP_printk( |
81 | "card_index=%u is_error=%s generation_at_bus_reset=%u generation_at_completion=%u timestamp=0x%04x packet_data=%s" , |
82 | __entry->card_index, |
83 | SELF_ID_COUNT_IS_ERROR(__entry->reg) ? "true" : "false" , |
84 | SELF_ID_COUNT_GET_GENERATION(__entry->reg), |
85 | SELF_ID_RECEIVE_Q0_GET_GENERATION(((const u32 *)__get_dynamic_array(self_id_receive))[0]), |
86 | SELF_ID_RECEIVE_Q0_GET_TIMESTAMP(((const u32 *)__get_dynamic_array(self_id_receive))[0]), |
87 | __print_array(((const u32 *)__get_dynamic_array(self_id_receive)) + 1, |
88 | (__get_dynamic_array_len(self_id_receive) / QUADLET_SIZE) - 1, QUADLET_SIZE) |
89 | ) |
90 | ); |
91 | |
92 | #undef SELF_ID_COUNT_IS_ERROR |
93 | #undef SELF_ID_COUNT_GET_GENERATION |
94 | #undef SELF_ID_RECEIVE_Q0_GET_GENERATION |
95 | #undef SELF_ID_RECEIVE_Q0_GET_TIMESTAMP |
96 | |
97 | #undef QUADLET_SIZE |
98 | |
99 | #endif // _FIREWIRE_OHCI_TRACE_EVENT_H |
100 | |
101 | #include <trace/define_trace.h> |
102 | |