Bluetooth: controller: ull/lll: Workaround CPR procedure collision

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.

Signed-off-by: Alexander Svensen <alsv@nordicsemi.no>
This commit is contained in:
Alexander Svensen 2019-05-02 13:49:22 +02:00 committed by Anas Nashif
commit 8a4c13146e

View file

@ -3485,29 +3485,26 @@ static inline void reject_ind_conn_upd_recv(struct ll_conn *conn,
goto reject_ind_conn_upd_recv_exit; goto reject_ind_conn_upd_recv_exit;
} }
/* Same Procedure or Different Procedure Collision */ /* FIXME: handle unsupported LL parameters error */
/* If not same procedure, stop procedure timeout, else
* continue timer until phy upd ind is received.
*/
else if (rej_ext_ind->error_code != BT_HCI_ERR_LL_PROC_COLLISION) { else if (rej_ext_ind->error_code != BT_HCI_ERR_LL_PROC_COLLISION) {
/* update to next ticks offset */
if (lll->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(conn_upd_curr == conn); LL_ASSERT(conn_upd_curr == conn);
/* reset mutex */ /* reset mutex */
conn_upd_curr = NULL; conn_upd_curr = NULL;
/* Procedure complete */ /* Procedure complete */
conn->llcp_conn_param.ack = conn->llcp_conn_param.ack = conn->llcp_conn_param.req;
conn->llcp_conn_param.req;
/* Stop procedure timeout */ /* Stop procedure timeout */
conn->procedure_expire = 0U; conn->procedure_expire = 0U;
/* update to next ticks offsets */
if (lll->role) {
conn->slave.ticks_to_offset =
conn->llcp_conn_param.ticks_to_offset_next;
}
} }
/* skip event generation if not cmd initiated */ /* skip event generation if not cmd initiated */