Эх сурвалжийг харах

component/bt: use OSI utility "osi_event" for HCI downstream data processing

Karl Wang 3 жил өмнө
parent
commit
2462003fde

+ 1 - 1
components/bt/host/bluedroid/hci/hci_hal_h4.c

@@ -528,7 +528,7 @@ static void host_send_pkt_available_cb(void)
 {
     //Controller rx cache buffer is ready for receiving new host packet
     //Just Call Host main thread task to process pending packets.
-    hci_host_task_post(OSI_THREAD_MAX_TIMEOUT);
+    hci_downstream_data_post(OSI_THREAD_MAX_TIMEOUT);
 }
 
 static int host_recv_pkt_cb(uint8_t *data, uint16_t len)

+ 30 - 19
components/bt/host/bluedroid/hci/hci_layer.c

@@ -42,8 +42,10 @@
 #define HCI_HOST_TASK_PRIO              (BT_TASK_MAX_PRIORITIES - 3)
 #define HCI_HOST_TASK_NAME              "hciT"
 #define HCI_HOST_TASK_WORKQUEUE_NUM     (2)
-#define HCI_HOST_TASK_WORKQUEUE0_LEN    (0)
-#define HCI_HOST_TASK_WORKQUEUE1_LEN    (5)
+#define HCI_HOST_TASK_WORKQUEUE0_LEN    (1) // for downstream datapath
+#define HCI_HOST_TASK_WORKQUEUE1_LEN    (1) // for upstream datapath
+
+#define HCI_DOWNSTREAM_DATA_QUEUE_IDX   (0)
 
 typedef struct {
     bool timer_is_set;
@@ -56,7 +58,7 @@ typedef struct {
     int command_credits;
     fixed_pkt_queue_t *command_queue;
     fixed_queue_t *packet_queue;
-
+    struct osi_event *downstream_data_ready;
     command_waiting_response_t cmd_waiting_q;
 
     /*
@@ -84,7 +86,7 @@ static const packet_fragmenter_callbacks_t packet_fragmenter_callbacks;
 
 static int hci_layer_init_env(void);
 static void hci_layer_deinit_env(void);
-static void hci_host_thread_handler(void *arg);
+static void hci_downstream_data_handler(void *arg);
 static void event_command_ready(fixed_pkt_queue_t *queue);
 static void event_packet_ready(fixed_queue_t *queue);
 static void restart_command_waiting_response_timer(command_waiting_response_t *cmd_wait_q);
@@ -110,6 +112,8 @@ int hci_start_up(void)
         return -2;
     }
 
+    osi_event_bind(hci_host_env.downstream_data_ready, hci_host_thread, HCI_DOWNSTREAM_DATA_QUEUE_IDX);
+
     packet_fragmenter->init(&packet_fragmenter_callbacks);
     hal->open(&hal_callbacks, hci_host_thread);
 
@@ -134,10 +138,9 @@ void hci_shut_down(void)
     hci_host_thread = NULL;
 }
 
-
-bool hci_host_task_post(uint32_t timeout)
+bool hci_downstream_data_post(uint32_t timeout)
 {
-    return osi_thread_post(hci_host_thread, hci_host_thread_handler, NULL, 0, timeout);
+    return osi_thread_post_event(hci_host_env.downstream_data_ready, timeout);
 }
 
 static int hci_layer_init_env(void)
@@ -156,6 +159,10 @@ static int hci_layer_init_env(void)
         return -1;
     }
 
+    struct osi_event *event = osi_event_create(hci_downstream_data_handler, NULL);
+    assert(event != NULL);
+    hci_host_env.downstream_data_ready = event;
+
     hci_host_env.packet_queue = fixed_queue_new(QUEUE_SIZE_MAX);
     if (hci_host_env.packet_queue) {
         fixed_queue_register_dequeue(hci_host_env.packet_queue, event_packet_ready);
@@ -189,6 +196,9 @@ static void hci_layer_deinit_env(void)
 {
     command_waiting_response_t *cmd_wait_q;
 
+    osi_event_delete(hci_host_env.downstream_data_ready);
+    hci_host_env.downstream_data_ready = NULL;
+
     if (hci_host_env.command_queue) {
         fixed_pkt_queue_free(hci_host_env.command_queue, (fixed_pkt_queue_free_cb)osi_free_func);
     }
@@ -206,7 +216,7 @@ static void hci_layer_deinit_env(void)
 #endif // #if (BLE_50_FEATURE_SUPPORT == TRUE)
 }
 
-static void hci_host_thread_handler(void *arg)
+static void hci_downstream_data_handler(void *arg)
 {
     /*
      * Previous task handles RX queue and two TX Queues, Since there is
@@ -216,18 +226,19 @@ static void hci_host_thread_handler(void *arg)
      * All packets will be directly copied to single queue in driver layer with
      * H4 type header added (1 byte).
      */
-    if (esp_vhci_host_check_send_available()) {
+    while (esp_vhci_host_check_send_available()) {
         /*Now Target only allowed one packet per TX*/
         BT_HDR *pkt = packet_fragmenter->fragment_current_packet();
         if (pkt != NULL) {
             packet_fragmenter->fragment_and_dispatch(pkt);
-        } else {
-            if (!fixed_pkt_queue_is_empty(hci_host_env.command_queue) &&
+        } else if (!fixed_pkt_queue_is_empty(hci_host_env.command_queue) &&
                     hci_host_env.command_credits > 0) {
-                fixed_pkt_queue_process(hci_host_env.command_queue);
-            } else if (!fixed_queue_is_empty(hci_host_env.packet_queue)) {
-                fixed_queue_process(hci_host_env.packet_queue);
-            }
+            fixed_pkt_queue_process(hci_host_env.command_queue);
+        } else if (!fixed_queue_is_empty(hci_host_env.packet_queue)) {
+            fixed_queue_process(hci_host_env.packet_queue);
+        } else {
+            // No downstream packet to send, stop processing
+            break;
         }
     }
 }
@@ -252,7 +263,7 @@ static void transmit_command(
     BTTRC_DUMP_BUFFER(NULL, command->data + command->offset, command->len);
 
     fixed_pkt_queue_enqueue(hci_host_env.command_queue, linked_pkt, FIXED_PKT_QUEUE_MAX_TIMEOUT);
-    hci_host_task_post(OSI_THREAD_MAX_TIMEOUT);
+    hci_downstream_data_post(OSI_THREAD_MAX_TIMEOUT);
 
 }
 
@@ -273,7 +284,7 @@ static future_t *transmit_command_futured(BT_HDR *command)
     command->event = MSG_STACK_TO_HC_HCI_CMD;
 
     fixed_pkt_queue_enqueue(hci_host_env.command_queue, linked_pkt, FIXED_PKT_QUEUE_MAX_TIMEOUT);
-    hci_host_task_post(OSI_THREAD_MAX_TIMEOUT);
+    hci_downstream_data_post(OSI_THREAD_MAX_TIMEOUT);
     return future;
 }
 
@@ -286,7 +297,7 @@ static void transmit_downward(uint16_t type, void *data)
         fixed_queue_enqueue(hci_host_env.packet_queue, data, FIXED_QUEUE_MAX_TIMEOUT);
     }
 
-    hci_host_task_post(OSI_THREAD_MAX_TIMEOUT);
+    hci_downstream_data_post(OSI_THREAD_MAX_TIMEOUT);
 }
 
 
@@ -479,7 +490,7 @@ intercepted:
     /*Tell HCI Host Task to continue TX Pending commands*/
     if (hci_host_env.command_credits &&
             !fixed_pkt_queue_is_empty(hci_host_env.command_queue)) {
-        hci_host_task_post(OSI_THREAD_MAX_TIMEOUT);
+        hci_downstream_data_post(OSI_THREAD_MAX_TIMEOUT);
     }
 
     if (wait_entry) {

+ 1 - 1
components/bt/host/bluedroid/hci/include/hci/hci_layer.h

@@ -102,7 +102,7 @@ const hci_t *hci_layer_get_interface(void);
 int hci_start_up(void);
 void hci_shut_down(void);
 
-bool hci_host_task_post(uint32_t timeout);
+bool hci_downstream_data_post(uint32_t timeout);
 
 #if (BLE_ADV_REPORT_FLOW_CONTROL == TRUE)
 int hci_adv_credits_prep_to_release(uint16_t num);