Received: by 2002:a05:6358:3188:b0:123:57c1:9b43 with SMTP id q8csp1449172rwd; Wed, 31 May 2023 14:15:06 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ76oXhi8rGTPaVdEYkDuO+e/iy1qqPnl2B4+jdVPIn7F8q9p6/1faXBfmsbQfMKluFAXZex X-Received: by 2002:a05:6870:a243:b0:19e:cc9f:8a45 with SMTP id g3-20020a056870a24300b0019ecc9f8a45mr4571197oai.38.1685567706247; Wed, 31 May 2023 14:15:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1685567706; cv=none; d=google.com; s=arc-20160816; b=NRfVTWj0CXcChN+1rlNoZ/d4fhhwOcID0h2eSd9NGK95Ae8k8VvW2Zau+k+b991dZv PoEv0dKiEMqsHVP1RrlAq8XFhCeJ6lzn7kYMyY6+aTpa1evCbUKx6na7umqi2SdX2U6+ rla8WIABk9jDGElPSGQxxvBxboeEtkTUIL8HygVHWBGsWfSMgWiiMfGveUeI4XJJ7SET wqEM4sK3xNky/9s4ZOKBVdf/+yVdxBw5K8PNmf7GPbPs4bhJ+7KBV8kc/OHpbKkxsTGN eeoFwlbqrDzHUSS4LEJUJ0teqJji0RSnrVLCBB6tZl522qSCWa8hLNy253MYmjLyBXbw 1Z7Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=uwHelr9epidNx4TlyEwPNGxb8mG0HmBux+ZYLk+0kkE=; b=WDXU8xu9DLg5UEs7smqeMBt8Wz/xUWuSjVNV9itzAgFpjB8Q9GxA+S4msx5IWXciiz RdJHE+NBif/uS1B6DAywG68uBztltvW7Umiz2gBr5py1+5bHAttdZ/C2WDRxbpiVX74L GIlokL4vKqked7KEWbARuIs0iwUK3RyB5TuRVsby0iSgDnPL/84samYBTWowMiBCn8A9 VSL0LU5alIFAfqNds07cwQkIBYOmZj5ag0RqVaTsbrw/q/u0DGSmhpvmaVJXt0gSD93C JXRN/8uQkxNXiRqVesRuCfracpwFifje3A1WDvCrjD2SpuU5gjsUb6ZYdUn4vp9GIfN6 zgvg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id a70-20020a639049000000b005287f5fbf5esi1691883pge.254.2023.05.31.14.14.49; Wed, 31 May 2023 14:15:06 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230027AbjEaVIF (ORCPT + 99 others); Wed, 31 May 2023 17:08:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59888 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229473AbjEaVIB (ORCPT ); Wed, 31 May 2023 17:08:01 -0400 Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.142]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B31CB12C for ; Wed, 31 May 2023 14:07:56 -0700 (PDT) Received: from submission (posteo.de [185.67.36.169]) by mout02.posteo.de (Postfix) with ESMTPS id 1C54A240107 for ; Wed, 31 May 2023 23:07:54 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 4QWhgF0dN0z9rxQ; Wed, 31 May 2023 23:07:52 +0200 (CEST) From: Pauli Virtanen To: linux-bluetooth@vger.kernel.org Cc: Pauli Virtanen Subject: [PATCH v2 1/4] Bluetooth: ISO: use hci_sync for setting CIG parameters Date: Wed, 31 May 2023 21:07:46 +0000 Message-Id: <97114b5f17f44d913c564f4ac8b41726c3a8eeae.1685565568.git.pav@iki.fi> In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-3.4 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_NEUTRAL,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org When reconfiguring CIG after disconnection of the last CIS, LE Remove CIG shall be sent before LE Set CIG Parameters. Otherwise, it fails because CIG is in the inactive state and not configurable (Core v5.3 Vol 6 Part B Sec. 4.5.14.3). This ordering is currently wrong under suitable timing conditions, because LE Remove CIG is sent via the hci_sync queue and may be delayed, but Set CIG Parameters is via hci_send_cmd. Make the ordering well-defined by sending also Set CIG Parameters via hci_sync. Fixes: 26afbd826ee3 ("Bluetooth: Add initial implementation of CIS connections") Signed-off-by: Pauli Virtanen --- Notes: v2: rebased, no changes net/bluetooth/hci_conn.c | 47 +++++++++++++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c index 795b2daa5bac..f45476deca82 100644 --- a/net/bluetooth/hci_conn.c +++ b/net/bluetooth/hci_conn.c @@ -775,6 +775,11 @@ static void le_conn_timeout(struct work_struct *work) hci_abort_conn(conn, HCI_ERROR_REMOTE_USER_TERM); } +struct iso_cig_params { + struct hci_cp_le_set_cig_params cp; + struct hci_cis_params cis[0x1f]; +}; + struct iso_list_data { union { u8 cig; @@ -786,10 +791,7 @@ struct iso_list_data { u16 sync_handle; }; int count; - struct { - struct hci_cp_le_set_cig_params cp; - struct hci_cis_params cis[0x11]; - } pdu; + struct iso_cig_params pdu; bool big_term; }; @@ -1783,10 +1785,33 @@ static int hci_le_create_big(struct hci_conn *conn, struct bt_iso_qos *qos) return hci_send_cmd(hdev, HCI_OP_LE_CREATE_BIG, sizeof(cp), &cp); } +static void set_cig_params_complete(struct hci_dev *hdev, void *data, int err) +{ + struct iso_cig_params *pdu = data; + + bt_dev_dbg(hdev, ""); + + if (err) + bt_dev_err(hdev, "Unable to set CIG parameters: %d", err); + + kfree(pdu); +} + +static int set_cig_params_sync(struct hci_dev *hdev, void *data) +{ + struct iso_cig_params *pdu = data; + u32 plen; + + plen = sizeof(pdu->cp) + pdu->cp.num_cis * sizeof(pdu->cis[0]); + return __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_CIG_PARAMS, plen, pdu, + HCI_CMD_TIMEOUT); +} + static bool hci_le_set_cig_params(struct hci_conn *conn, struct bt_iso_qos *qos) { struct hci_dev *hdev = conn->hdev; struct iso_list_data data; + struct iso_cig_params *pdu; memset(&data, 0, sizeof(data)); @@ -1856,12 +1881,18 @@ static bool hci_le_set_cig_params(struct hci_conn *conn, struct bt_iso_qos *qos) if (qos->ucast.cis == BT_ISO_QOS_CIS_UNSET || !data.pdu.cp.num_cis) return false; - if (hci_send_cmd(hdev, HCI_OP_LE_SET_CIG_PARAMS, - sizeof(data.pdu.cp) + - (data.pdu.cp.num_cis * sizeof(*data.pdu.cis)), - &data.pdu) < 0) + pdu = kzalloc(sizeof(*pdu), GFP_KERNEL); + if (!pdu) return false; + memcpy(pdu, &data.pdu, sizeof(*pdu)); + + if (hci_cmd_sync_queue(hdev, set_cig_params_sync, pdu, + set_cig_params_complete) < 0) { + kfree(pdu); + return false; + } + return true; } -- 2.40.1