Bluetooth: controller: Rework TX data pause

Change LLCP TX data pause into using mask to allow for pausing from
multiple different sources - but only once per source
(the underlying TX queue still just has an integer counter).

Signed-off-by: Erik Brockhoff <erbr@oticon.com>
Signed-off-by: Thomas Ebert Hansen <thoh@oticon.com>
This commit is contained in:
Thomas Ebert Hansen 2022-03-24 11:21:21 +01:00 committed by Carles Cufí
commit 79092c3cf4
8 changed files with 107 additions and 26 deletions

View file

@ -342,7 +342,7 @@ static void lp_enc_st_unencrypted(struct ll_conn *conn, struct proc_ctx *ctx, ui
switch (evt) {
case LP_ENC_EVT_RUN:
/* Pause Tx data */
llcp_tx_pause_data(conn);
llcp_tx_pause_data(conn, LLCP_TX_QUEUE_PAUSE_DATA_ENCRYPTION);
llcp_tx_flush(conn);
lp_enc_send_enc_req(conn, ctx, evt, param);
break;
@ -407,7 +407,7 @@ static void lp_enc_st_wait_rx_start_enc_req(struct ll_conn *conn, struct proc_ct
break;
case LP_ENC_EVT_REJECT:
/* Resume Tx data */
llcp_tx_resume_data(conn);
llcp_tx_resume_data(conn, LLCP_TX_QUEUE_PAUSE_DATA_ENCRYPTION);
/* Resume Rx data */
ull_conn_resume_rx_data(conn);
ctx->data.enc.error = (pdu->llctrl.opcode == PDU_DATA_LLCTRL_TYPE_REJECT_IND) ?
@ -443,7 +443,7 @@ static void lp_enc_st_wait_rx_start_enc_rsp(struct ll_conn *conn, struct proc_ct
switch (evt) {
case LP_ENC_EVT_START_ENC_RSP:
/* Resume Tx data */
llcp_tx_resume_data(conn);
llcp_tx_resume_data(conn, LLCP_TX_QUEUE_PAUSE_DATA_ENCRYPTION);
/* Resume Rx data */
ull_conn_resume_rx_data(conn);
ctx->data.enc.error = BT_HCI_ERR_SUCCESS;
@ -477,7 +477,7 @@ static void lp_enc_state_encrypted(struct ll_conn *conn, struct proc_ctx *ctx, u
switch (evt) {
case LP_ENC_EVT_RUN:
/* Pause Tx data */
llcp_tx_pause_data(conn);
llcp_tx_pause_data(conn, LLCP_TX_QUEUE_PAUSE_DATA_ENCRYPTION);
llcp_tx_flush(conn);
lp_enc_send_pause_enc_req(conn, ctx, evt, param);
break;
@ -822,7 +822,7 @@ static void rp_enc_send_reject_ind(struct ll_conn *conn, struct proc_ctx *ctx, u
ctx->state = RP_ENC_STATE_UNENCRYPTED;
/* Resume Tx data */
llcp_tx_resume_data(conn);
llcp_tx_resume_data(conn, LLCP_TX_QUEUE_PAUSE_DATA_ENCRYPTION);
/* Resume Rx data */
ull_conn_resume_rx_data(conn);
/* Resume possibly paused local procedure */
@ -841,7 +841,7 @@ static void rp_enc_send_start_enc_rsp(struct ll_conn *conn, struct proc_ctx *ctx
ctx->state = RP_ENC_STATE_UNENCRYPTED;
/* Resume Tx data */
llcp_tx_resume_data(conn);
llcp_tx_resume_data(conn, LLCP_TX_QUEUE_PAUSE_DATA_ENCRYPTION);
/* Resume Rx data */
ull_conn_resume_rx_data(conn);
@ -907,7 +907,7 @@ static void rp_enc_state_wait_rx_enc_req(struct ll_conn *conn, struct proc_ctx *
switch (evt) {
case RP_ENC_EVT_ENC_REQ:
/* Pause Tx data */
llcp_tx_pause_data(conn);
llcp_tx_pause_data(conn, LLCP_TX_QUEUE_PAUSE_DATA_ENCRYPTION);
llcp_tx_flush(conn);
/* Pause Rx data */
ull_conn_pause_rx_data(conn);
@ -1050,7 +1050,7 @@ static void rp_enc_state_wait_rx_pause_enc_req(struct ll_conn *conn, struct proc
switch (evt) {
case RP_ENC_EVT_PAUSE_ENC_REQ:
/* Pause Tx data */
llcp_tx_pause_data(conn);
llcp_tx_pause_data(conn, LLCP_TX_QUEUE_PAUSE_DATA_ENCRYPTION);
llcp_tx_flush(conn);
/*
* Pause Rx data; will be resumed when the encapsulated