xref: /OK3568_Linux_fs/kernel/drivers/usb/usbip/vhci.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0+
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (C) 2003-2008 Takahiro Hirofuchi
4*4882a593Smuzhiyun  * Copyright (C) 2015 Nobuo Iwata
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #ifndef __USBIP_VHCI_H
8*4882a593Smuzhiyun #define __USBIP_VHCI_H
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <linux/device.h>
11*4882a593Smuzhiyun #include <linux/list.h>
12*4882a593Smuzhiyun #include <linux/spinlock.h>
13*4882a593Smuzhiyun #include <linux/sysfs.h>
14*4882a593Smuzhiyun #include <linux/types.h>
15*4882a593Smuzhiyun #include <linux/usb.h>
16*4882a593Smuzhiyun #include <linux/usb/hcd.h>
17*4882a593Smuzhiyun #include <linux/wait.h>
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun struct vhci_device {
20*4882a593Smuzhiyun 	struct usb_device *udev;
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun 	/*
23*4882a593Smuzhiyun 	 * devid specifies a remote usb device uniquely instead
24*4882a593Smuzhiyun 	 * of combination of busnum and devnum.
25*4882a593Smuzhiyun 	 */
26*4882a593Smuzhiyun 	__u32 devid;
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun 	/* speed of a remote device */
29*4882a593Smuzhiyun 	enum usb_device_speed speed;
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun 	/* vhci root-hub port to which this device is attached */
32*4882a593Smuzhiyun 	__u32 rhport;
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun 	struct usbip_device ud;
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun 	/* lock for the below link lists */
37*4882a593Smuzhiyun 	spinlock_t priv_lock;
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun 	/* vhci_priv is linked to one of them. */
40*4882a593Smuzhiyun 	struct list_head priv_tx;
41*4882a593Smuzhiyun 	struct list_head priv_rx;
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun 	/* vhci_unlink is linked to one of them */
44*4882a593Smuzhiyun 	struct list_head unlink_tx;
45*4882a593Smuzhiyun 	struct list_head unlink_rx;
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun 	/* vhci_tx thread sleeps for this queue */
48*4882a593Smuzhiyun 	wait_queue_head_t waitq_tx;
49*4882a593Smuzhiyun };
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun /* urb->hcpriv, use container_of() */
52*4882a593Smuzhiyun struct vhci_priv {
53*4882a593Smuzhiyun 	unsigned long seqnum;
54*4882a593Smuzhiyun 	struct list_head list;
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun 	struct vhci_device *vdev;
57*4882a593Smuzhiyun 	struct urb *urb;
58*4882a593Smuzhiyun };
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun struct vhci_unlink {
61*4882a593Smuzhiyun 	/* seqnum of this request */
62*4882a593Smuzhiyun 	unsigned long seqnum;
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun 	struct list_head list;
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun 	/* seqnum of the unlink target */
67*4882a593Smuzhiyun 	unsigned long unlink_seqnum;
68*4882a593Smuzhiyun };
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun enum hub_speed {
71*4882a593Smuzhiyun 	HUB_SPEED_HIGH = 0,
72*4882a593Smuzhiyun 	HUB_SPEED_SUPER,
73*4882a593Smuzhiyun };
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun /* Number of supported ports. Value has an upperbound of USB_MAXCHILDREN */
76*4882a593Smuzhiyun #ifdef CONFIG_USBIP_VHCI_HC_PORTS
77*4882a593Smuzhiyun #define VHCI_HC_PORTS CONFIG_USBIP_VHCI_HC_PORTS
78*4882a593Smuzhiyun #else
79*4882a593Smuzhiyun #define VHCI_HC_PORTS 8
80*4882a593Smuzhiyun #endif
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun /* Each VHCI has 2 hubs (USB2 and USB3), each has VHCI_HC_PORTS ports */
83*4882a593Smuzhiyun #define VHCI_PORTS	(VHCI_HC_PORTS*2)
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun #ifdef CONFIG_USBIP_VHCI_NR_HCS
86*4882a593Smuzhiyun #define VHCI_NR_HCS CONFIG_USBIP_VHCI_NR_HCS
87*4882a593Smuzhiyun #else
88*4882a593Smuzhiyun #define VHCI_NR_HCS 1
89*4882a593Smuzhiyun #endif
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun #define MAX_STATUS_NAME 16
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun struct vhci {
94*4882a593Smuzhiyun 	spinlock_t lock;
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun 	struct platform_device *pdev;
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun 	struct vhci_hcd *vhci_hcd_hs;
99*4882a593Smuzhiyun 	struct vhci_hcd *vhci_hcd_ss;
100*4882a593Smuzhiyun };
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun /* for usb_hcd.hcd_priv[0] */
103*4882a593Smuzhiyun struct vhci_hcd {
104*4882a593Smuzhiyun 	struct vhci *vhci;
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun 	u32 port_status[VHCI_HC_PORTS];
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun 	unsigned resuming:1;
109*4882a593Smuzhiyun 	unsigned long re_timeout;
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun 	atomic_t seqnum;
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun 	/*
114*4882a593Smuzhiyun 	 * NOTE:
115*4882a593Smuzhiyun 	 * wIndex shows the port number and begins from 1.
116*4882a593Smuzhiyun 	 * But, the index of this array begins from 0.
117*4882a593Smuzhiyun 	 */
118*4882a593Smuzhiyun 	struct vhci_device vdev[VHCI_HC_PORTS];
119*4882a593Smuzhiyun };
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun extern int vhci_num_controllers;
122*4882a593Smuzhiyun extern struct vhci *vhcis;
123*4882a593Smuzhiyun extern struct attribute_group vhci_attr_group;
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun /* vhci_hcd.c */
126*4882a593Smuzhiyun void rh_port_connect(struct vhci_device *vdev, enum usb_device_speed speed);
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun /* vhci_sysfs.c */
129*4882a593Smuzhiyun int vhci_init_attr_group(void);
130*4882a593Smuzhiyun void vhci_finish_attr_group(void);
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun /* vhci_rx.c */
133*4882a593Smuzhiyun struct urb *pickup_urb_and_free_priv(struct vhci_device *vdev, __u32 seqnum);
134*4882a593Smuzhiyun int vhci_rx_loop(void *data);
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun /* vhci_tx.c */
137*4882a593Smuzhiyun int vhci_tx_loop(void *data);
138*4882a593Smuzhiyun 
port_to_rhport(__u32 port)139*4882a593Smuzhiyun static inline __u32 port_to_rhport(__u32 port)
140*4882a593Smuzhiyun {
141*4882a593Smuzhiyun 	return port % VHCI_HC_PORTS;
142*4882a593Smuzhiyun }
143*4882a593Smuzhiyun 
port_to_pdev_nr(__u32 port)144*4882a593Smuzhiyun static inline int port_to_pdev_nr(__u32 port)
145*4882a593Smuzhiyun {
146*4882a593Smuzhiyun 	return port / VHCI_PORTS;
147*4882a593Smuzhiyun }
148*4882a593Smuzhiyun 
hcd_to_vhci_hcd(struct usb_hcd * hcd)149*4882a593Smuzhiyun static inline struct vhci_hcd *hcd_to_vhci_hcd(struct usb_hcd *hcd)
150*4882a593Smuzhiyun {
151*4882a593Smuzhiyun 	return (struct vhci_hcd *) (hcd->hcd_priv);
152*4882a593Smuzhiyun }
153*4882a593Smuzhiyun 
hcd_dev(struct usb_hcd * hcd)154*4882a593Smuzhiyun static inline struct device *hcd_dev(struct usb_hcd *hcd)
155*4882a593Smuzhiyun {
156*4882a593Smuzhiyun 	return (hcd)->self.controller;
157*4882a593Smuzhiyun }
158*4882a593Smuzhiyun 
hcd_name(struct usb_hcd * hcd)159*4882a593Smuzhiyun static inline const char *hcd_name(struct usb_hcd *hcd)
160*4882a593Smuzhiyun {
161*4882a593Smuzhiyun 	return (hcd)->self.bus_name;
162*4882a593Smuzhiyun }
163*4882a593Smuzhiyun 
vhci_hcd_to_hcd(struct vhci_hcd * vhci_hcd)164*4882a593Smuzhiyun static inline struct usb_hcd *vhci_hcd_to_hcd(struct vhci_hcd *vhci_hcd)
165*4882a593Smuzhiyun {
166*4882a593Smuzhiyun 	return container_of((void *) vhci_hcd, struct usb_hcd, hcd_priv);
167*4882a593Smuzhiyun }
168*4882a593Smuzhiyun 
vdev_to_vhci_hcd(struct vhci_device * vdev)169*4882a593Smuzhiyun static inline struct vhci_hcd *vdev_to_vhci_hcd(struct vhci_device *vdev)
170*4882a593Smuzhiyun {
171*4882a593Smuzhiyun 	return container_of((void *)(vdev - vdev->rhport), struct vhci_hcd, vdev);
172*4882a593Smuzhiyun }
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun #endif /* __USBIP_VHCI_H */
175