Commit ec4e86f5 authored by Mariusz Skamra's avatar Mariusz Skamra Committed by Carles Cufi
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.

Signed-off-by: default avatarMariusz Skamra <mariusz.skamra@codecoup.pl>
Signed-off-by: default avatarVinayak Kariappa Chettimada <vich@nordicsemi.no>
parent 84ae2f11
Loading
Loading
Loading
Loading
+10 −13
Original line number Diff line number Diff line
@@ -1957,29 +1957,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 offsets */
		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 = 0;

		/* 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 */