firewire_ohci.h 3.4 KB

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