2008-07-09 14:56:51 -06:00
/*
* Copyright ( C ) 2003 - 2008 Takahiro Hirofuchi
2016-06-13 11:33:40 +09:00
* Copyright ( C ) 2015 Nobuo Iwata
2008-07-09 14:56:51 -06:00
*
* This is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
*/
2011-08-22 08:53:28 +02:00
# ifndef __USBIP_VHCI_H
# define __USBIP_VHCI_H
2011-05-11 22:33:43 -07:00
# include <linux/device.h>
# include <linux/list.h>
# include <linux/spinlock.h>
# include <linux/sysfs.h>
# include <linux/types.h>
# include <linux/usb.h>
2010-04-24 23:21:52 +02:00
# include <linux/usb/hcd.h>
2011-05-11 22:33:43 -07:00
# include <linux/wait.h>
2008-07-09 14:56:51 -06:00
struct vhci_device {
struct usb_device * udev ;
/*
* devid specifies a remote usb device uniquely instead
* of combination of busnum and devnum .
*/
__u32 devid ;
/* speed of a remote device */
enum usb_device_speed speed ;
2011-05-06 03:47:49 -07:00
/* vhci root-hub port to which this device is attached */
2008-07-09 14:56:51 -06:00
__u32 rhport ;
struct usbip_device ud ;
/* lock for the below link lists */
spinlock_t priv_lock ;
/* vhci_priv is linked to one of them. */
struct list_head priv_tx ;
struct list_head priv_rx ;
/* vhci_unlink is linked to one of them */
struct list_head unlink_tx ;
struct list_head unlink_rx ;
/* vhci_tx thread sleeps for this queue */
wait_queue_head_t waitq_tx ;
} ;
/* urb->hcpriv, use container_of() */
struct vhci_priv {
unsigned long seqnum ;
struct list_head list ;
struct vhci_device * vdev ;
struct urb * urb ;
} ;
struct vhci_unlink {
/* seqnum of this request */
unsigned long seqnum ;
struct list_head list ;
/* seqnum of the unlink target */
unsigned long unlink_seqnum ;
} ;
2012-06-11 16:57:30 -04:00
/* Number of supported ports. Value has an upperbound of USB_MAXCHILDREN */
2016-06-13 11:33:40 +09:00
# ifdef CONFIG_USBIP_VHCI_HC_PORTS
# define VHCI_HC_PORTS CONFIG_USBIP_VHCI_HC_PORTS
# else
# define VHCI_HC_PORTS 8
# endif
# ifdef CONFIG_USBIP_VHCI_NR_HCS
# define VHCI_NR_HCS CONFIG_USBIP_VHCI_NR_HCS
# else
# define VHCI_NR_HCS 1
# endif
# define MAX_STATUS_NAME 16
2008-07-09 14:56:51 -06:00
/* for usb_bus.hcpriv */
struct vhci_hcd {
2011-05-06 03:47:49 -07:00
spinlock_t lock ;
2008-07-09 14:56:51 -06:00
2016-06-13 11:33:40 +09:00
u32 port_status [ VHCI_HC_PORTS ] ;
2008-07-09 14:56:51 -06:00
2011-05-06 03:47:49 -07:00
unsigned resuming : 1 ;
unsigned long re_timeout ;
2008-07-09 14:56:51 -06:00
atomic_t seqnum ;
/*
* NOTE :
* wIndex shows the port number and begins from 1.
* But , the index of this array begins from 0.
*/
2016-06-13 11:33:40 +09:00
struct vhci_device vdev [ VHCI_HC_PORTS ] ;
2008-07-09 14:56:51 -06:00
} ;
2016-06-13 11:33:40 +09:00
extern int vhci_num_controllers ;
extern struct platform_device * * vhci_pdevs ;
extern struct attribute_group vhci_attr_group ;
2008-07-09 14:56:51 -06:00
/* vhci_hcd.c */
2016-06-13 11:33:40 +09:00
void rh_port_connect ( struct vhci_device * vdev , enum usb_device_speed speed ) ;
/* vhci_sysfs.c */
int vhci_init_attr_group ( void ) ;
void vhci_finish_attr_group ( void ) ;
2008-07-09 14:56:51 -06:00
2011-05-11 01:54:23 -07:00
/* vhci_rx.c */
2011-05-06 03:47:49 -07:00
struct urb * pickup_urb_and_free_priv ( struct vhci_device * vdev , __u32 seqnum ) ;
2011-05-11 01:54:23 -07:00
int vhci_rx_loop ( void * data ) ;
2011-01-12 15:02:01 +02:00
2011-05-11 01:54:23 -07:00
/* vhci_tx.c */
int vhci_tx_loop ( void * data ) ;
2008-07-09 14:56:51 -06:00
2016-06-13 11:33:40 +09:00
static inline __u32 port_to_rhport ( __u32 port )
{
return port % VHCI_HC_PORTS ;
}
static inline int port_to_pdev_nr ( __u32 port )
2008-07-09 14:56:51 -06:00
{
2016-06-13 11:33:40 +09:00
return port / VHCI_HC_PORTS ;
2008-07-09 14:56:51 -06:00
}
static inline struct vhci_hcd * hcd_to_vhci ( struct usb_hcd * hcd )
{
return ( struct vhci_hcd * ) ( hcd - > hcd_priv ) ;
}
2016-06-13 11:33:40 +09:00
static inline struct device * hcd_dev ( struct usb_hcd * hcd )
{
return ( hcd ) - > self . controller ;
}
static inline const char * hcd_name ( struct usb_hcd * hcd )
{
return ( hcd ) - > self . bus_name ;
}
2008-07-09 14:56:51 -06:00
static inline struct usb_hcd * vhci_to_hcd ( struct vhci_hcd * vhci )
{
return container_of ( ( void * ) vhci , struct usb_hcd , hcd_priv ) ;
}
2016-06-13 11:33:40 +09:00
static inline struct vhci_hcd * vdev_to_vhci ( struct vhci_device * vdev )
2008-07-09 14:56:51 -06:00
{
2016-06-13 11:33:40 +09:00
return container_of (
( void * ) ( vdev - vdev - > rhport ) , struct vhci_hcd , vdev ) ;
2008-07-09 14:56:51 -06:00
}
2011-08-22 08:53:28 +02:00
# endif /* __USBIP_VHCI_H */