xref: /OK3568_Linux_fs/kernel/tools/usb/usbip/libsrc/usbip_host_common.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (C) 2015-2016 Samsung Electronics
4*4882a593Smuzhiyun  *               Igor Kotrasinski <i.kotrasinsk@samsung.com>
5*4882a593Smuzhiyun  *               Krzysztof Opasiak <k.opasiak@samsung.com>
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Refactored from usbip_host_driver.c, which is:
8*4882a593Smuzhiyun  * Copyright (C) 2011 matt mooney <mfm@muteddisk.com>
9*4882a593Smuzhiyun  *               2005-2007 Takahiro Hirofuchi
10*4882a593Smuzhiyun  */
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #ifndef __USBIP_HOST_COMMON_H
13*4882a593Smuzhiyun #define __USBIP_HOST_COMMON_H
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun #include <stdint.h>
16*4882a593Smuzhiyun #include <libudev.h>
17*4882a593Smuzhiyun #include <errno.h>
18*4882a593Smuzhiyun #include "list.h"
19*4882a593Smuzhiyun #include "usbip_common.h"
20*4882a593Smuzhiyun #include "sysfs_utils.h"
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun struct usbip_host_driver;
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun struct usbip_host_driver_ops {
25*4882a593Smuzhiyun 	int (*open)(struct usbip_host_driver *hdriver);
26*4882a593Smuzhiyun 	void (*close)(struct usbip_host_driver *hdriver);
27*4882a593Smuzhiyun 	int (*refresh_device_list)(struct usbip_host_driver *hdriver);
28*4882a593Smuzhiyun 	struct usbip_exported_device * (*get_device)(
29*4882a593Smuzhiyun 		struct usbip_host_driver *hdriver, int num);
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun 	int (*read_device)(struct udev_device *sdev,
32*4882a593Smuzhiyun 			   struct usbip_usb_device *dev);
33*4882a593Smuzhiyun 	int (*read_interface)(struct usbip_usb_device *udev, int i,
34*4882a593Smuzhiyun 			      struct usbip_usb_interface *uinf);
35*4882a593Smuzhiyun 	int (*is_my_device)(struct udev_device *udev);
36*4882a593Smuzhiyun };
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun struct usbip_host_driver {
39*4882a593Smuzhiyun 	int ndevs;
40*4882a593Smuzhiyun 	/* list of exported device */
41*4882a593Smuzhiyun 	struct list_head edev_list;
42*4882a593Smuzhiyun 	const char *udev_subsystem;
43*4882a593Smuzhiyun 	struct usbip_host_driver_ops ops;
44*4882a593Smuzhiyun };
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun struct usbip_exported_device {
47*4882a593Smuzhiyun 	struct udev_device *sudev;
48*4882a593Smuzhiyun 	int32_t status;
49*4882a593Smuzhiyun 	struct usbip_usb_device udev;
50*4882a593Smuzhiyun 	struct list_head node;
51*4882a593Smuzhiyun 	struct usbip_usb_interface uinf[];
52*4882a593Smuzhiyun };
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun /* External API to access the driver */
usbip_driver_open(struct usbip_host_driver * hdriver)55*4882a593Smuzhiyun static inline int usbip_driver_open(struct usbip_host_driver *hdriver)
56*4882a593Smuzhiyun {
57*4882a593Smuzhiyun 	if (!hdriver->ops.open)
58*4882a593Smuzhiyun 		return -EOPNOTSUPP;
59*4882a593Smuzhiyun 	return hdriver->ops.open(hdriver);
60*4882a593Smuzhiyun }
61*4882a593Smuzhiyun 
usbip_driver_close(struct usbip_host_driver * hdriver)62*4882a593Smuzhiyun static inline void usbip_driver_close(struct usbip_host_driver *hdriver)
63*4882a593Smuzhiyun {
64*4882a593Smuzhiyun 	if (!hdriver->ops.close)
65*4882a593Smuzhiyun 		return;
66*4882a593Smuzhiyun 	hdriver->ops.close(hdriver);
67*4882a593Smuzhiyun }
68*4882a593Smuzhiyun 
usbip_refresh_device_list(struct usbip_host_driver * hdriver)69*4882a593Smuzhiyun static inline int usbip_refresh_device_list(struct usbip_host_driver *hdriver)
70*4882a593Smuzhiyun {
71*4882a593Smuzhiyun 	if (!hdriver->ops.refresh_device_list)
72*4882a593Smuzhiyun 		return -EOPNOTSUPP;
73*4882a593Smuzhiyun 	return hdriver->ops.refresh_device_list(hdriver);
74*4882a593Smuzhiyun }
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun static inline struct usbip_exported_device *
usbip_get_device(struct usbip_host_driver * hdriver,int num)77*4882a593Smuzhiyun usbip_get_device(struct usbip_host_driver *hdriver, int num)
78*4882a593Smuzhiyun {
79*4882a593Smuzhiyun 	if (!hdriver->ops.get_device)
80*4882a593Smuzhiyun 		return NULL;
81*4882a593Smuzhiyun 	return hdriver->ops.get_device(hdriver, num);
82*4882a593Smuzhiyun }
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun /* Helper functions for implementing driver backend */
85*4882a593Smuzhiyun int usbip_generic_driver_open(struct usbip_host_driver *hdriver);
86*4882a593Smuzhiyun void usbip_generic_driver_close(struct usbip_host_driver *hdriver);
87*4882a593Smuzhiyun int usbip_generic_refresh_device_list(struct usbip_host_driver *hdriver);
88*4882a593Smuzhiyun int usbip_export_device(struct usbip_exported_device *edev, int sockfd);
89*4882a593Smuzhiyun struct usbip_exported_device *usbip_generic_get_device(
90*4882a593Smuzhiyun 		struct usbip_host_driver *hdriver, int num);
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun #endif /* __USBIP_HOST_COMMON_H */
93