xref: /kernel/linux/linux-6.6/drivers/usb/mon/usb_mon.h (revision 62306a36)
162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * The USB Monitor, inspired by Dave Harding's USBMon.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2005 Pete Zaitcev (zaitcev@redhat.com)
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef __USB_MON_H
962306a36Sopenharmony_ci#define __USB_MON_H
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/list.h>
1262306a36Sopenharmony_ci#include <linux/slab.h>
1362306a36Sopenharmony_ci#include <linux/kref.h>
1462306a36Sopenharmony_ci/* #include <linux/usb.h> */	/* We use struct pointers only in this header */
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#define TAG "usbmon"
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_cistruct mon_bus {
1962306a36Sopenharmony_ci	struct list_head bus_link;
2062306a36Sopenharmony_ci	spinlock_t lock;
2162306a36Sopenharmony_ci	struct usb_bus *u_bus;
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci	int text_inited;
2462306a36Sopenharmony_ci	int bin_inited;
2562306a36Sopenharmony_ci	struct dentry *dent_s;		/* Debugging file */
2662306a36Sopenharmony_ci	struct dentry *dent_t;		/* Text interface file */
2762306a36Sopenharmony_ci	struct dentry *dent_u;		/* Second text interface file */
2862306a36Sopenharmony_ci	struct device *classdev;	/* Device in usbmon class */
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci	/* Ref */
3162306a36Sopenharmony_ci	int nreaders;			/* Under mon_lock AND mbus->lock */
3262306a36Sopenharmony_ci	struct list_head r_list;	/* Chain of readers (usually one) */
3362306a36Sopenharmony_ci	struct kref ref;		/* Under mon_lock */
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci	/* Stats */
3662306a36Sopenharmony_ci	unsigned int cnt_events;
3762306a36Sopenharmony_ci	unsigned int cnt_text_lost;
3862306a36Sopenharmony_ci};
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci/*
4162306a36Sopenharmony_ci * An instance of a process which opened a file (but can fork later)
4262306a36Sopenharmony_ci */
4362306a36Sopenharmony_cistruct mon_reader {
4462306a36Sopenharmony_ci	struct list_head r_link;
4562306a36Sopenharmony_ci	struct mon_bus *m_bus;
4662306a36Sopenharmony_ci	void *r_data;		/* Use container_of instead? */
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci	void (*rnf_submit)(void *data, struct urb *urb);
4962306a36Sopenharmony_ci	void (*rnf_error)(void *data, struct urb *urb, int error);
5062306a36Sopenharmony_ci	void (*rnf_complete)(void *data, struct urb *urb, int status);
5162306a36Sopenharmony_ci};
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_civoid mon_reader_add(struct mon_bus *mbus, struct mon_reader *r);
5462306a36Sopenharmony_civoid mon_reader_del(struct mon_bus *mbus, struct mon_reader *r);
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_cistruct mon_bus *mon_bus_lookup(unsigned int num);
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ciint /*bool*/ mon_text_add(struct mon_bus *mbus, const struct usb_bus *ubus);
5962306a36Sopenharmony_civoid mon_text_del(struct mon_bus *mbus);
6062306a36Sopenharmony_ciint /*bool*/ mon_bin_add(struct mon_bus *mbus, const struct usb_bus *ubus);
6162306a36Sopenharmony_civoid mon_bin_del(struct mon_bus *mbus);
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ciint __init mon_text_init(void);
6462306a36Sopenharmony_civoid mon_text_exit(void);
6562306a36Sopenharmony_ciint __init mon_bin_init(void);
6662306a36Sopenharmony_civoid mon_bin_exit(void);
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci/*
6962306a36Sopenharmony_ci */
7062306a36Sopenharmony_ciextern struct mutex mon_lock;
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ciextern const struct file_operations mon_fops_stat;
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ciextern struct mon_bus mon_bus0;		/* Only for redundant checks */
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci#endif /* __USB_MON_H */
77