Linux Audio

Check our new training course

Loading...
  1/* SPDX-License-Identifier: GPL-2.0-only */
  2/*
  3 * Copyright (C) 2022 Google Corporation
  4 */
  5
  6#ifndef __COREDUMP_H
  7#define __COREDUMP_H
  8
  9#define DEVCOREDUMP_TIMEOUT	msecs_to_jiffies(10000)	/* 10 sec */
 10
 11typedef void (*coredump_t)(struct hci_dev *hdev);
 12typedef void (*dmp_hdr_t)(struct hci_dev *hdev, struct sk_buff *skb);
 13typedef void (*notify_change_t)(struct hci_dev *hdev, int state);
 14
 15/* struct hci_devcoredump - Devcoredump state
 16 *
 17 * @supported: Indicates if FW dump collection is supported by driver
 18 * @state: Current state of dump collection
 19 * @timeout: Indicates a timeout for collecting the devcoredump
 20 *
 21 * @alloc_size: Total size of the dump
 22 * @head: Start of the dump
 23 * @tail: Pointer to current end of dump
 24 * @end: head + alloc_size for easy comparisons
 25 *
 26 * @dump_q: Dump queue for state machine to process
 27 * @dump_rx: Devcoredump state machine work
 28 * @dump_timeout: Devcoredump timeout work
 29 *
 30 * @coredump: Called from the driver's .coredump() function.
 31 * @dmp_hdr: Create a dump header to identify controller/fw/driver info
 32 * @notify_change: Notify driver when devcoredump state has changed
 33 */
 34struct hci_devcoredump {
 35	bool		supported;
 36
 37	enum devcoredump_state {
 38		HCI_DEVCOREDUMP_IDLE,
 39		HCI_DEVCOREDUMP_ACTIVE,
 40		HCI_DEVCOREDUMP_DONE,
 41		HCI_DEVCOREDUMP_ABORT,
 42		HCI_DEVCOREDUMP_TIMEOUT,
 43	} state;
 44
 45	unsigned long	timeout;
 46
 47	size_t		alloc_size;
 48	char		*head;
 49	char		*tail;
 50	char		*end;
 51
 52	struct sk_buff_head	dump_q;
 53	struct work_struct	dump_rx;
 54	struct delayed_work	dump_timeout;
 55
 56	coredump_t		coredump;
 57	dmp_hdr_t		dmp_hdr;
 58	notify_change_t		notify_change;
 59};
 60
 61#ifdef CONFIG_DEV_COREDUMP
 62
 63void hci_devcd_reset(struct hci_dev *hdev);
 64void hci_devcd_rx(struct work_struct *work);
 65void hci_devcd_timeout(struct work_struct *work);
 66
 67int hci_devcd_register(struct hci_dev *hdev, coredump_t coredump,
 68		       dmp_hdr_t dmp_hdr, notify_change_t notify_change);
 69int hci_devcd_init(struct hci_dev *hdev, u32 dump_size);
 70int hci_devcd_append(struct hci_dev *hdev, struct sk_buff *skb);
 71int hci_devcd_append_pattern(struct hci_dev *hdev, u8 pattern, u32 len);
 72int hci_devcd_complete(struct hci_dev *hdev);
 73int hci_devcd_abort(struct hci_dev *hdev);
 74
 75#else
 76
 77static inline void hci_devcd_reset(struct hci_dev *hdev) {}
 78static inline void hci_devcd_rx(struct work_struct *work) {}
 79static inline void hci_devcd_timeout(struct work_struct *work) {}
 80
 81static inline int hci_devcd_register(struct hci_dev *hdev, coredump_t coredump,
 82				     dmp_hdr_t dmp_hdr,
 83				     notify_change_t notify_change)
 84{
 85	return -EOPNOTSUPP;
 86}
 87
 88static inline int hci_devcd_init(struct hci_dev *hdev, u32 dump_size)
 89{
 90	return -EOPNOTSUPP;
 91}
 92
 93static inline int hci_devcd_append(struct hci_dev *hdev, struct sk_buff *skb)
 94{
 95	return -EOPNOTSUPP;
 96}
 97
 98static inline int hci_devcd_append_pattern(struct hci_dev *hdev,
 99					   u8 pattern, u32 len)
100{
101	return -EOPNOTSUPP;
102}
103
104static inline int hci_devcd_complete(struct hci_dev *hdev)
105{
106	return -EOPNOTSUPP;
107}
108
109static inline int hci_devcd_abort(struct hci_dev *hdev)
110{
111	return -EOPNOTSUPP;
112}
113
114#endif /* CONFIG_DEV_COREDUMP */
115
116#endif /* __COREDUMP_H */