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