1  /* SPDX-License-Identifier: GPL-2.0 */
2  /*
3   * usb hub driver head file
4   *
5   * Copyright (C) 1999 Linus Torvalds
6   * Copyright (C) 1999 Johannes Erdfelt
7   * Copyright (C) 1999 Gregory P. Smith
8   * Copyright (C) 2001 Brad Hards (bhards@bigpond.net.au)
9   * Copyright (C) 2012 Intel Corp (tianyu.lan@intel.com)
10   *
11   *  move struct usb_hub to this file.
12   */
13  
14  #include <linux/usb.h>
15  #include <linux/usb/ch11.h>
16  #include <linux/usb/hcd.h>
17  #include <linux/usb/typec.h>
18  #include "usb.h"
19  
20  struct usb_hub {
21  	struct device		*intfdev;	/* the "interface" device */
22  	struct usb_device	*hdev;
23  	struct kref		kref;
24  	struct urb		*urb;		/* for interrupt polling pipe */
25  
26  	/* buffer for urb ... with extra space in case of babble */
27  	u8			(*buffer)[8];
28  	union {
29  		struct usb_hub_status	hub;
30  		struct usb_port_status	port;
31  	}			*status;	/* buffer for status reports */
32  	struct mutex		status_mutex;	/* for the status buffer */
33  
34  	int			error;		/* last reported error */
35  	int			nerrors;	/* track consecutive errors */
36  
37  	unsigned long		event_bits[1];	/* status change bitmask */
38  	unsigned long		change_bits[1];	/* ports with logical connect
39  							status change */
40  	unsigned long		removed_bits[1]; /* ports with a "removed"
41  							device present */
42  	unsigned long		wakeup_bits[1];	/* ports that have signaled
43  							remote wakeup */
44  	unsigned long		power_bits[1]; /* ports that are powered */
45  	unsigned long		child_usage_bits[1]; /* ports powered on for
46  							children */
47  	unsigned long		warm_reset_bits[1]; /* ports requesting warm
48  							reset recovery */
49  #if USB_MAXCHILDREN > 31 /* 8*sizeof(unsigned long) - 1 */
50  #error event_bits[] is too short!
51  #endif
52  
53  	struct usb_hub_descriptor *descriptor;	/* class descriptor */
54  	struct usb_tt		tt;		/* Transaction Translator */
55  
56  	unsigned		mA_per_port;	/* current for each child */
57  #ifdef	CONFIG_PM
58  	unsigned		wakeup_enabled_descendants;
59  #endif
60  
61  	unsigned		limited_power:1;
62  	unsigned		quiescing:1;
63  	unsigned		disconnected:1;
64  	unsigned		in_reset:1;
65  	unsigned		quirk_disable_autosuspend:1;
66  
67  	unsigned		quirk_check_port_auto_suspend:1;
68  
69  	unsigned		has_indicators:1;
70  	u8			indicator[USB_MAXCHILDREN];
71  	struct delayed_work	leds;
72  	struct delayed_work	init_work;
73  	struct work_struct      events;
74  	spinlock_t		irq_urb_lock;
75  	struct timer_list	irq_urb_retry;
76  	struct usb_port		**ports;
77  	struct list_head        onboard_devs;
78  };
79  
80  /**
81   * struct usb port - kernel's representation of a usb port
82   * @child: usb device attached to the port
83   * @dev: generic device interface
84   * @port_owner: port's owner
85   * @peer: related usb2 and usb3 ports (share the same connector)
86   * @connector: USB Type-C connector
87   * @req: default pm qos request for hubs without port power control
88   * @connect_type: port's connect type
89   * @state: device state of the usb device attached to the port
90   * @state_kn: kernfs_node of the sysfs attribute that accesses @state
91   * @location: opaque representation of platform connector location
92   * @status_lock: synchronize port_event() vs usb_port_{suspend|resume}
93   * @portnum: port index num based one
94   * @is_superspeed cache super-speed status
95   * @usb3_lpm_u1_permit: whether USB3 U1 LPM is permitted.
96   * @usb3_lpm_u2_permit: whether USB3 U2 LPM is permitted.
97   * @early_stop: whether port initialization will be stopped earlier.
98   * @ignore_event: whether events of the port are ignored.
99   */
100  struct usb_port {
101  	struct usb_device *child;
102  	struct device dev;
103  	struct usb_dev_state *port_owner;
104  	struct usb_port *peer;
105  	struct typec_connector *connector;
106  	struct dev_pm_qos_request *req;
107  	enum usb_port_connect_type connect_type;
108  	enum usb_device_state state;
109  	struct kernfs_node *state_kn;
110  	usb_port_location_t location;
111  	struct mutex status_lock;
112  	u32 over_current_count;
113  	u8 portnum;
114  	u32 quirks;
115  	unsigned int early_stop:1;
116  	unsigned int ignore_event:1;
117  	unsigned int is_superspeed:1;
118  	unsigned int usb3_lpm_u1_permit:1;
119  	unsigned int usb3_lpm_u2_permit:1;
120  };
121  
122  #define to_usb_port(_dev) \
123  	container_of(_dev, struct usb_port, dev)
124  
125  extern int usb_hub_create_port_device(struct usb_hub *hub,
126  		int port1);
127  extern void usb_hub_remove_port_device(struct usb_hub *hub,
128  		int port1);
129  extern int usb_hub_set_port_power(struct usb_device *hdev, struct usb_hub *hub,
130  		int port1, bool set);
131  extern struct usb_hub *usb_hub_to_struct_hub(struct usb_device *hdev);
132  extern void hub_get(struct usb_hub *hub);
133  extern void hub_put(struct usb_hub *hub);
134  extern int hub_port_debounce(struct usb_hub *hub, int port1,
135  		bool must_be_connected);
136  extern int usb_clear_port_feature(struct usb_device *hdev,
137  		int port1, int feature);
138  extern int usb_hub_port_status(struct usb_hub *hub, int port1,
139  		u16 *status, u16 *change);
140  extern int usb_port_is_power_on(struct usb_hub *hub, unsigned int portstatus);
141  
hub_is_port_power_switchable(struct usb_hub * hub)142  static inline bool hub_is_port_power_switchable(struct usb_hub *hub)
143  {
144  	__le16 hcs;
145  
146  	if (!hub)
147  		return false;
148  	hcs = hub->descriptor->wHubCharacteristics;
149  	return (le16_to_cpu(hcs) & HUB_CHAR_LPSM) < HUB_CHAR_NO_LPSM;
150  }
151  
hub_is_superspeed(struct usb_device * hdev)152  static inline int hub_is_superspeed(struct usb_device *hdev)
153  {
154  	return hdev->descriptor.bDeviceProtocol == USB_HUB_PR_SS;
155  }
156  
hub_is_superspeedplus(struct usb_device * hdev)157  static inline int hub_is_superspeedplus(struct usb_device *hdev)
158  {
159  	return (hdev->descriptor.bDeviceProtocol == USB_HUB_PR_SS &&
160  		le16_to_cpu(hdev->descriptor.bcdUSB) >= 0x0310 &&
161  		hdev->bos && hdev->bos->ssp_cap);
162  }
163  
hub_power_on_good_delay(struct usb_hub * hub)164  static inline unsigned hub_power_on_good_delay(struct usb_hub *hub)
165  {
166  	unsigned delay = hub->descriptor->bPwrOn2PwrGood * 2;
167  
168  	if (!hub->hdev->parent)	/* root hub */
169  		return delay;
170  	else /* Wait at least 100 msec for power to become stable */
171  		return max(delay, 100U);
172  }
173  
hub_port_debounce_be_connected(struct usb_hub * hub,int port1)174  static inline int hub_port_debounce_be_connected(struct usb_hub *hub,
175  		int port1)
176  {
177  	return hub_port_debounce(hub, port1, true);
178  }
179  
hub_port_debounce_be_stable(struct usb_hub * hub,int port1)180  static inline int hub_port_debounce_be_stable(struct usb_hub *hub,
181  		int port1)
182  {
183  	return hub_port_debounce(hub, port1, false);
184  }
185