1/* 2 * Copyright (C) 2015-2016 Samsung Electronics 3 * Igor Kotrasinski <i.kotrasinsk@samsung.com> 4 * Krzysztof Opasiak <k.opasiak@samsung.com> 5 * 6 * Refactored from usbip_host_driver.c, which is: 7 * Copyright (C) 2011 matt mooney <mfm@muteddisk.com> 8 * 2005-2007 Takahiro Hirofuchi 9 * 10 * This program is free software: you can redistribute it and/or modify 11 * it under the terms of the GNU General Public License as published by 12 * the Free Software Foundation, either version 2 of the License, or 13 * (at your option) any later version. 14 * 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU General Public License for more details. 19 * 20 * You should have received a copy of the GNU General Public License 21 * along with this program. If not, see <http://www.gnu.org/licenses/>. 22 */ 23 24#ifndef __USBIP_HOST_COMMON_H 25#define __USBIP_HOST_COMMON_H 26 27#include <stdint.h> 28#include <libudev.h> 29#include <errno.h> 30#include "list.h" 31#include "usbip_common.h" 32#include "sysfs_utils.h" 33 34struct usbip_host_driver; 35 36struct usbip_host_driver_ops { 37 int (*open)(struct usbip_host_driver *hdriver); 38 void (*close)(struct usbip_host_driver *hdriver); 39 int (*refresh_device_list)(struct usbip_host_driver *hdriver); 40 struct usbip_exported_device * (*get_device)( 41 struct usbip_host_driver *hdriver, int num); 42 43 int (*read_device)(struct udev_device *sdev, 44 struct usbip_usb_device *dev); 45 int (*read_interface)(struct usbip_usb_device *udev, int i, 46 struct usbip_usb_interface *uinf); 47 int (*is_my_device)(struct udev_device *udev); 48}; 49 50struct usbip_host_driver { 51 int ndevs; 52 /* list of exported device */ 53 struct list_head edev_list; 54 const char *udev_subsystem; 55 struct usbip_host_driver_ops ops; 56}; 57 58struct usbip_exported_device { 59 struct udev_device *sudev; 60 int32_t status; 61 struct usbip_usb_device udev; 62 struct list_head node; 63 struct usbip_usb_interface uinf[]; 64}; 65 66/* External API to access the driver */ 67static inline int usbip_driver_open(struct usbip_host_driver *hdriver) 68{ 69 if (!hdriver->ops.open) 70 return -EOPNOTSUPP; 71 return hdriver->ops.open(hdriver); 72} 73 74static inline void usbip_driver_close(struct usbip_host_driver *hdriver) 75{ 76 if (!hdriver->ops.close) 77 return; 78 hdriver->ops.close(hdriver); 79} 80 81static inline int usbip_refresh_device_list(struct usbip_host_driver *hdriver) 82{ 83 if (!hdriver->ops.refresh_device_list) 84 return -EOPNOTSUPP; 85 return hdriver->ops.refresh_device_list(hdriver); 86} 87 88static inline struct usbip_exported_device * 89usbip_get_device(struct usbip_host_driver *hdriver, int num) 90{ 91 if (!hdriver->ops.get_device) 92 return NULL; 93 return hdriver->ops.get_device(hdriver, num); 94} 95 96/* Helper functions for implementing driver backend */ 97int usbip_generic_driver_open(struct usbip_host_driver *hdriver); 98void usbip_generic_driver_close(struct usbip_host_driver *hdriver); 99int usbip_generic_refresh_device_list(struct usbip_host_driver *hdriver); 100int usbip_export_device(struct usbip_exported_device *edev, int sockfd); 101struct usbip_exported_device *usbip_generic_get_device( 102 struct usbip_host_driver *hdriver, int num); 103 104#endif /* __USBIP_HOST_COMMON_H */ 105