Skip to content
Permalink
Browse files

Bluetooth: controller: Workaround CPR procedure collision at CPU instant

This is a workaround for IOP issue, where peer rejects LLCP Slave
Connection Parameter Request with LMP Error Transaction Collision
error code even if previous request is complete at the instant.

Relates to #15366.

Signed-off-by: Mariusz Skamra <mariusz.skamra@codecoup.pl>
Signed-off-by: Vinayak Kariappa Chettimada <vich@nordicsemi.no>
  • Loading branch information...
MariuszSkamra authored and nashif committed Apr 25, 2019
1 parent f9e89e5 commit 44739f4427c157990b1f9eb01f8c9162b8205ec6
Showing with 10 additions and 13 deletions.
  1. +10 −13 subsys/bluetooth/controller/ll_sw/ctrl.c
@@ -2064,29 +2064,26 @@ isr_rx_conn_pkt_ctrl_rej_conn_upd(struct radio_pdu_node_rx *node_rx,

return;
}
/* Same Procedure or Different Procedure Collision */

/* If not same procedure, stop procedure timeout, else
* continue timer until phy upd ind is received.
*/
/* FIXME: handle unsupported LL parameters error */
else if (rej_ext_ind->error_code != BT_HCI_ERR_LL_PROC_COLLISION) {
/* update to next ticks offset */
if (conn->role) {
conn->slave.ticks_to_offset =
conn->llcp_conn_param.ticks_to_offset_next;
}
}

if (conn->llcp_conn_param.state == LLCP_CPR_STATE_RSP_WAIT) {
LL_ASSERT(_radio.conn_upd == conn);

/* reset mutex */
_radio.conn_upd = NULL;

/* Procedure complete */
conn->llcp_conn_param.ack =
conn->llcp_conn_param.req;
conn->llcp_conn_param.ack = conn->llcp_conn_param.req;

/* Stop procedure timeout */
conn->procedure_expire = 0U;

/* update to next ticks offsets */
if (conn->role) {
conn->slave.ticks_to_offset =
conn->llcp_conn_param.ticks_to_offset_next;
}
}

/* skip event generation if not cmd initiated */

0 comments on commit 44739f4

Please sign in to comment.
You can’t perform that action at this time.