Skip to content

Commit ac14663

Browse files
committed
refactor(hub): Moved list to dymanic member as the get parent info could come any moment
1 parent b3f4109 commit ac14663

File tree

1 file changed

+20
-14
lines changed

1 file changed

+20
-14
lines changed

host/usb/src/hub.c

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)