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