@@ -87,11 +87,8 @@ typedef struct {
8787 } flags ; /**< Hub flags */
8888 root_port_state_t root_port_state ; /**< Root port state */
8989 unsigned int port_reqs ; /**< Root port request flag */
90- } dynamic ; /**< Dynamic members. Require a critical section */
91-
92- struct {
9390 TAILQ_HEAD (tailhead_devs , dev_tree_node_s ) dev_nodes_tailq ; /**< Tailq of attached devices */
94- } single_thread ; /**< Single thread members don't require a critical section so long as they are never accessed from multiple threads */
91+ } dynamic ; /**< Dynamic members. Require a critical section */
9592
9693 struct {
9794 hcd_port_handle_t root_port_hdl ; /**< Root port HCD handle */
@@ -150,12 +147,14 @@ static dev_tree_node_t *dev_tree_node_get_by_uid(unsigned int node_uid)
150147 dev_tree_node_t * dev_tree_node = NULL ;
151148 dev_tree_node_t * dev_tree_iter ;
152149 // Search the device tree nodes list for a device node with the specified parent
153- TAILQ_FOREACH (dev_tree_iter , & p_hub_driver_obj -> single_thread .dev_nodes_tailq , tailq_entry ) {
150+ HUB_DRIVER_ENTER_CRITICAL ();
151+ TAILQ_FOREACH (dev_tree_iter , & p_hub_driver_obj -> dynamic .dev_nodes_tailq , tailq_entry ) {
154152 if (dev_tree_iter -> uid == node_uid ) {
155153 dev_tree_node = dev_tree_iter ;
156154 break ;
157155 }
158156 }
157+ HUB_DRIVER_EXIT_CRITICAL ();
159158 return dev_tree_node ;
160159}
161160
@@ -200,9 +199,9 @@ static esp_err_t dev_tree_node_new(void *parent, uint8_t port_num, usb_speed_t s
200199 // Device registration may fail if there are no available HCD channels.
201200 goto fail ;
202201 }
203-
204- TAILQ_INSERT_TAIL (& p_hub_driver_obj -> single_thread .dev_nodes_tailq , dev_tree_node , tailq_entry );
205-
202+ HUB_DRIVER_ENTER_CRITICAL ();
203+ TAILQ_INSERT_TAIL (& p_hub_driver_obj -> dynamic .dev_nodes_tailq , dev_tree_node , tailq_entry );
204+ HUB_DRIVER_EXIT_CRITICAL ();
206205 ESP_LOGD (HUB_DRIVER_TAG , "Device tree node (port %d, uid %d): new" , dev_tree_node -> port_num , dev_tree_node -> uid );
207206
208207 hub_event_data_t event_data = {
@@ -225,13 +224,15 @@ static esp_err_t dev_tree_node_reset_completed(void *parent, uint8_t port_num)
225224 dev_tree_node_t * dev_tree_node = NULL ;
226225 dev_tree_node_t * dev_tree_iter ;
227226 // Search the device tree nodes list for a device node with the specified parent
228- TAILQ_FOREACH (dev_tree_iter , & p_hub_driver_obj -> single_thread .dev_nodes_tailq , tailq_entry ) {
227+ HUB_DRIVER_ENTER_CRITICAL ();
228+ TAILQ_FOREACH (dev_tree_iter , & p_hub_driver_obj -> dynamic .dev_nodes_tailq , tailq_entry ) {
229229 if (dev_tree_iter -> parent == parent &&
230230 dev_tree_iter -> port_num == port_num ) {
231231 dev_tree_node = dev_tree_iter ;
232232 break ;
233233 }
234234 }
235+ HUB_DRIVER_EXIT_CRITICAL ();
235236
236237 if (dev_tree_node == NULL ) {
237238 ESP_LOGE (HUB_DRIVER_TAG , "Reset completed, but device tree node (port %d) not found" , port_num );
@@ -253,13 +254,15 @@ static esp_err_t dev_tree_node_dev_gone(void *parent, uint8_t port_num)
253254 dev_tree_node_t * dev_tree_node = NULL ;
254255 dev_tree_node_t * dev_tree_iter ;
255256 // Search the device tree nodes list for a device node with the specified parent
256- TAILQ_FOREACH (dev_tree_iter , & p_hub_driver_obj -> single_thread .dev_nodes_tailq , tailq_entry ) {
257+ HUB_DRIVER_ENTER_CRITICAL ();
258+ TAILQ_FOREACH (dev_tree_iter , & p_hub_driver_obj -> dynamic .dev_nodes_tailq , tailq_entry ) {
257259 if (dev_tree_iter -> parent == parent &&
258260 dev_tree_iter -> port_num == port_num ) {
259261 dev_tree_node = dev_tree_iter ;
260262 break ;
261263 }
262264 }
265+ HUB_DRIVER_EXIT_CRITICAL ();
263266
264267 if (dev_tree_node == NULL ) {
265268 ESP_LOGW (HUB_DRIVER_TAG , "Device tree node (port %d): not found" , port_num );
@@ -289,22 +292,25 @@ static esp_err_t dev_tree_node_remove_by_parent(void *parent, uint8_t port_num)
289292 dev_tree_node_t * dev_tree_node = NULL ;
290293 dev_tree_node_t * dev_tree_iter ;
291294 // Search the device tree nodes list for a device node with the specified parent
292- TAILQ_FOREACH (dev_tree_iter , & p_hub_driver_obj -> single_thread .dev_nodes_tailq , tailq_entry ) {
295+ HUB_DRIVER_ENTER_CRITICAL ();
296+ TAILQ_FOREACH (dev_tree_iter , & p_hub_driver_obj -> dynamic .dev_nodes_tailq , tailq_entry ) {
293297 if (dev_tree_iter -> parent == parent &&
294298 dev_tree_iter -> port_num == port_num ) {
295299 dev_tree_node = dev_tree_iter ;
296300 break ;
297301 }
298302 }
303+ if (dev_tree_node ) {
304+ TAILQ_REMOVE (& p_hub_driver_obj -> dynamic .dev_nodes_tailq , dev_tree_node , tailq_entry );
305+ }
306+ HUB_DRIVER_EXIT_CRITICAL ();
299307
300308 if (dev_tree_node == NULL ) {
301309 ESP_LOGW (HUB_DRIVER_TAG , "Device tree node (port %d): not found" , port_num );
302310 return ESP_ERR_NOT_FOUND ;
303311 }
304312
305313 ESP_LOGD (HUB_DRIVER_TAG , "Device tree node (port %d, uid %d): freeing" , port_num , dev_tree_node -> uid );
306-
307- TAILQ_REMOVE (& p_hub_driver_obj -> single_thread .dev_nodes_tailq , dev_tree_node , tailq_entry );
308314 heap_caps_free (dev_tree_node );
309315 return ESP_OK ;
310316}
@@ -596,8 +602,8 @@ esp_err_t hub_install(hub_config_t *hub_config, void **client_ret)
596602 hub_driver_obj -> constant .proc_req_cb_arg = hub_config -> proc_req_cb_arg ;
597603 hub_driver_obj -> constant .event_cb = hub_config -> event_cb ;
598604 hub_driver_obj -> constant .event_cb_arg = hub_config -> event_cb_arg ;
599- TAILQ_INIT (& hub_driver_obj -> single_thread .dev_nodes_tailq );
600605 // Driver is not installed, we can modify dynamic section outside of the critical section
606+ TAILQ_INIT (& hub_driver_obj -> dynamic .dev_nodes_tailq );
601607 hub_driver_obj -> dynamic .root_port_state = ROOT_PORT_STATE_NOT_POWERED ;
602608
603609 HUB_DRIVER_ENTER_CRITICAL ();
0 commit comments