From patchwork Mon Apr 23 17:59:39 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Loic Poulain X-Patchwork-Id: 134022 Delivered-To: patch@linaro.org Received: by 10.46.151.6 with SMTP id r6csp1287394lji; Mon, 23 Apr 2018 10:59:46 -0700 (PDT) X-Google-Smtp-Source: AIpwx48ste1z2d/uJJE5XhrxZIXBOCsXNPPv1VfuSQRZxaC+bNgFlAe0eqY601toj3y5WQtPuaxQ X-Received: by 10.99.112.70 with SMTP id a6mr17563237pgn.294.1524506386845; Mon, 23 Apr 2018 10:59:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524506386; cv=none; d=google.com; s=arc-20160816; b=0EDFYibobunHtxh0YS3hpUyN9LoKnojmk8Qpa7zQVXpdOhssT7hQM2BQnbr4g6aZxO L2C1XsIqBVPgdbA01Msa+IKnEr9y5gOKFds7yTcvY086JnWhngoS9xQt64T7J6lCUYyj xQ3IH50le4BqGa4iij0sm62BSVLUKbjcCuFmGtWOuhNoP5gFgUK8EvD5HzRjJSADkeiP Ah20e/o2nNi8uIgJJZMxPiSV5Hebsdn4WnpgLCkLUdIZwKnYhvrub+IubS59j/py45da 0JG2LoGupvI4Dbbw3BAaliK1avq7P9Hz8UkC6vrmbClHVBqJjmwTa0KZw3mtbhtDHqr0 j2nA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=WvOr5fBei3wFbXEi3hVlUQqWKsdQ+0iFPX5Z6pZ5iII=; b=bhUCQAaXY45t/dhbRTkQq7Vi1Wt2/7QTRcn4tTqNHzuxmd2TnkgSti9CcSiRPQnwak 8tbNCndrXrBjwPliV+alsom/TcZ3Rw+fjA3PTC9wcRxdR2FOqWnc49Sxo4IhOd0Db66m 4vZr++jT7lzpbald/wvS8VWGC78bkvIfftqbckLHAf7Z/mhIrNerKPjGXSHQotm9arPP Q1B8eEV0MgSaOUS3dBoKlUfuPS6FjAdX2cdO9AVlJrQmH2JeLa8DVFSNGjOfIHNBiUb/ QZxKCw7X4mrTeO11ZZjYFCw3jaNWmVPHgKfbGZ7Ubl3h+PL8a54PqWGF6PHVZmTt11/y oUpw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=Z72gIEZG; spf=pass (google.com: best guess record for domain of linux-arm-msm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-arm-msm-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id w8-v6si12591407plz.373.2018.04.23.10.59.46; Mon, 23 Apr 2018 10:59:46 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-arm-msm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=Z72gIEZG; spf=pass (google.com: best guess record for domain of linux-arm-msm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-arm-msm-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932221AbeDWR7p (ORCPT + 12 others); Mon, 23 Apr 2018 13:59:45 -0400 Received: from mail-wr0-f194.google.com ([209.85.128.194]:34884 "EHLO mail-wr0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932148AbeDWR7o (ORCPT ); Mon, 23 Apr 2018 13:59:44 -0400 Received: by mail-wr0-f194.google.com with SMTP id w3-v6so43683814wrg.2 for ; Mon, 23 Apr 2018 10:59:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id; bh=0LUuHzytuNBwLAcEJjEA+xVBKzJ/Pv/x6YrfevpMyis=; b=Z72gIEZGTcIB2gewZesQllx5/Wdy9YGRc30bpXrx5hcUMG5aoRAQeBysb/vV90x0Yb wDjD0GgOgyo2/RDrYor12OpzTF7DnjpbZjEUKUfZVkn/y0jMBJWCs00h6KGOP3owgIiQ 5bbd4cllH3JovxACT4znHD8IDuIi8AMVd4Ulw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=0LUuHzytuNBwLAcEJjEA+xVBKzJ/Pv/x6YrfevpMyis=; b=pf0qtgASeF3GgHErpD46tvJw2gcUo47Fm6dv5YVjGSaufctXwQsMcmc5B+4eud3OMZ oE0klHJq8YkfTbOvR5WyfQkORig1n4l/TVTZCju4stLtnomfys+ec8CUTKVxLOzgug2B vSJDeJDZXKW+TcZi218zMvNOD278G3nY9xkTmFE02tnbyQBDWAbaejwCUwl4PBrhuK2P uJa05014Y/wRyPx2814oHcQSNjI1wn3hcaO/byplm7WDffiBv0Edi++MajjmAd7s2X3G /7aR0mm+hqRgk8NrUrxEnriwnZ8ktCfKAUVhbUgYmOdllM/mJ46gj7BfgXpf8K7Kd3aV gz2g== X-Gm-Message-State: ALQs6tC7vbp69bXxJEKHMz1eQvaAaIibwJ3dbpdC6gTZEheyg2ceMV8Y HB3ekQVpddpg22Yx9U0S9DlMPQ== X-Received: by 10.28.45.9 with SMTP id t9mr10091389wmt.161.1524506383431; Mon, 23 Apr 2018 10:59:43 -0700 (PDT) Received: from lpoulain-ThinkPad-T470p.home ([2a01:cb19:8349:a800:146c:6b52:c2d0:e9e7]) by smtp.gmail.com with ESMTPSA id o133sm8005139wmo.15.2018.04.23.10.59.42 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 23 Apr 2018 10:59:42 -0700 (PDT) From: Loic Poulain To: marcel@holtmann.org Cc: linux-bluetooth@vger.kernel.org, linux-arm-msm@vger.kernel.org, kkapra@codeaurora.org, Loic Poulain Subject: [PATCH 1/2] Bluetooth: Add __hci_cmd_sync_noev function Date: Mon, 23 Apr 2018 19:59:39 +0200 Message-Id: <1524506380-7417-1-git-send-email-loic.poulain@linaro.org> X-Mailer: git-send-email 2.7.4 Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org This function allows to send a HCI command without expecting any controller event/response in return. Signed-off-by: Loic Poulain --- include/net/bluetooth/hci_core.h | 2 ++ net/bluetooth/hci_core.c | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) -- 2.7.4 -- To unsubscribe from this list: send the line "unsubscribe linux-arm-msm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index b619a19..d48a7df 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h @@ -1393,6 +1393,8 @@ struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen, const void *param, u32 timeout); struct sk_buff *__hci_cmd_sync_ev(struct hci_dev *hdev, u16 opcode, u32 plen, const void *param, u8 event, u32 timeout); +int __hci_cmd_sync_noev(struct hci_dev *hdev, u16 opcode, u32 plen, + const void *param); int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen, const void *param); diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 40d260f..2831c4e 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c @@ -3459,6 +3459,23 @@ struct sk_buff *hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen, } EXPORT_SYMBOL(hci_cmd_sync); +int __hci_cmd_sync_noev(struct hci_dev *hdev, u16 opcode, u32 plen, + const void *param) +{ + struct sk_buff *skb = hci_prepare_cmd(hdev, opcode, plen, param); + + if (!skb) { + bt_dev_err(hdev, "no memory for command (opcode 0x%4.4x)", + opcode); + return -ENOMEM; + } + + hci_send_frame(hdev, skb); + + return 0; +} +EXPORT_SYMBOL(__hci_cmd_sync_noev); + /* Send ACL data */ static void hci_add_acl_hdr(struct sk_buff *skb, __u16 handle, __u16 flags) { From patchwork Mon Apr 23 17:59:40 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Loic Poulain X-Patchwork-Id: 134023 Delivered-To: patch@linaro.org Received: by 10.46.151.6 with SMTP id r6csp1287461lji; Mon, 23 Apr 2018 10:59:51 -0700 (PDT) X-Google-Smtp-Source: AIpwx4/Tc96hrzD8iYvRurnso2C6UIv2nZvA6voLfku3np3lw9iGZjqsVeaASe9Vl1VZ/yxMazFd X-Received: by 10.98.192.80 with SMTP id x77mr19566428pff.67.1524506391322; Mon, 23 Apr 2018 10:59:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524506391; cv=none; d=google.com; s=arc-20160816; b=CLw1ZDtatYWw0wt0Y/Rx1xw/vXQ8ltYIXs6Yka9D3XkdrGylnaPF4HoGtfGQPVTHkO Hct5Ze4ljLjC41TFcsokK+yaeI53CxrhoN+moCLgjZAKj1/wyd5Vq9LCQ4L2S5YtdjLm a+xJX9Jw67XPEK40UXJSw0gEG9cVrYtv9e8VoosQrgp2AYecMZqctnDFdZHpmDk81wUA FdkNEsZuDtbUv6PwyWQzYY1y8BJrxB5XjrAp26Ad6rxOUVF5nZHiOoIYnUmvdFH43KMq QgZ9M6lXYmAx07AzDiLmjYdAQGQENsjaUZg1N1NRq/Asm2RsEV07mYVf5pP6CMPBb2gV PnYg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=GsnIMqKoq31oCAPl5QRoFqklbDOW63eqAh0pLgor8po=; b=PMSHSiop/c+fk0I14HyywmG2l+Y4B1tqRvtC5H4FkTVKmmR05/QnuQyZc4qgM0O1hH OXLeLsSXpIeMRAxrRbEewb8rPiVvAuielI3XNjqN3/J/8EitXpooD6IATtfyTJDv0D7R 4m7+21FMjJ1Anzs/s1gD2cwWh0jjkJDj6igLcVV0SUwXBmb7MESlYaYNn0ShhWX13nfV 6XpPkhIabbnA6X6sUDQ/BjwBZAxYYyeJkDtXyY4uMpVi26z2W1gbFkef87hKcW+4s2d3 auex4WpxZjiYvl/X1WnH523LaZiIC41wwGlqNyrbHuEsYLlAc/bsJeXiJePblpnjh9lb fVYA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=WVyLHc8x; spf=pass (google.com: best guess record for domain of linux-arm-msm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-arm-msm-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id k1si9672943pgo.255.2018.04.23.10.59.51; Mon, 23 Apr 2018 10:59:51 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-arm-msm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=WVyLHc8x; spf=pass (google.com: best guess record for domain of linux-arm-msm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-arm-msm-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932265AbeDWR7u (ORCPT + 12 others); Mon, 23 Apr 2018 13:59:50 -0400 Received: from mail-wr0-f195.google.com ([209.85.128.195]:34897 "EHLO mail-wr0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932247AbeDWR7s (ORCPT ); Mon, 23 Apr 2018 13:59:48 -0400 Received: by mail-wr0-f195.google.com with SMTP id w3-v6so43684180wrg.2 for ; Mon, 23 Apr 2018 10:59:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=BXfjg/MGAY1JZ+NU7B6zBXw3fDAXWzEYeiPzp4l9nbQ=; b=WVyLHc8xi5KjIxCH9bR8cgbKrOsavETLeSPyP9/6ZxcKPFZSNjcIlu4bi6r56lTYuM GZwgTbUfroWB5Z42LB1cefSpD0QdNzmEVNNHlAT/ki/VVuIeQzUqG8+jxnn5VB2lQltY PE9Q8Y0Ia7zGYzsOTvY5JhYiT/g6/ypzdI5x8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=BXfjg/MGAY1JZ+NU7B6zBXw3fDAXWzEYeiPzp4l9nbQ=; b=kwqsrY8nusBZXVCObrq7jIdHtJd/rRBU/hMNjWLBHi1bSAq0/udFIKBIuNYN6HIi7d jNL3U248zGht45knhnDwUbbEJ6qSC9o39yyUjB+i9Pcwp5a8d4Mixzkyi+6pnAzymg0J 6YW1JANpoBycLP4HOBTVgBfknZhDfL7Tyz7hpD2UMW1z/y/9FILBnmYRxxbylbXQHRVD Vg7IMnoN7MFgjY5jubEYjdhSjsvgV2DupfiZLXhvyH4GhG/MEXjEJD1nLEIc/YsgjuPt loHqCr2H+njesNd/n1oDrEIr6ssEIoKMJwU8s8vthIXVcTlWAE4LoJyAzdV8Uh9ezfZd 8tPQ== X-Gm-Message-State: ALQs6tDNKuzFmsxS3KTq5RiKHNIhbK2oktKW68Y/0FT+GaYOIiC0pz4f EiRBRqGmd7186J54Ban1vD4aLg== X-Received: by 10.28.135.149 with SMTP id j143mr948080wmd.149.1524506386688; Mon, 23 Apr 2018 10:59:46 -0700 (PDT) Received: from lpoulain-ThinkPad-T470p.home ([2a01:cb19:8349:a800:146c:6b52:c2d0:e9e7]) by smtp.gmail.com with ESMTPSA id o133sm8005139wmo.15.2018.04.23.10.59.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 23 Apr 2018 10:59:46 -0700 (PDT) From: Loic Poulain To: marcel@holtmann.org Cc: linux-bluetooth@vger.kernel.org, linux-arm-msm@vger.kernel.org, kkapra@codeaurora.org, Loic Poulain Subject: [PATCH 2/2] Bluetooth: btqca: Add AR3002 rampatch support Date: Mon, 23 Apr 2018 19:59:40 +0200 Message-Id: <1524506380-7417-2-git-send-email-loic.poulain@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1524506380-7417-1-git-send-email-loic.poulain@linaro.org> References: <1524506380-7417-1-git-send-email-loic.poulain@linaro.org> Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org This patch adds rampatch download compatibility for ROME >= 3.2. Starting with ROME 3.2, the 'download mode' field of the rampatch header indicates if the controller acknowledges (or not) the received rampatch segments. If not, we need to send all the segments without expecting any event from the controller (except for the last segment). Goal is (I assume) to speed-up rampatch download. This fixes BT on Dragonboard-600c P2 which includes the following BT controller: hci0: ROME Patch Version Request hci0: Product:0x00000008 hci0: Patch :0x00000111 hci0: ROM :0x00000302 hci0: SOC :0x00000023 Signed-off-by: Loic Poulain --- drivers/bluetooth/btqca.c | 106 ++++++++++++++++++++++------------------------ drivers/bluetooth/btqca.h | 11 ++++- 2 files changed, 61 insertions(+), 56 deletions(-) -- 2.7.4 -- To unsubscribe from this list: send the line "unsubscribe linux-arm-msm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c index 2793d41..129779e 100644 --- a/drivers/bluetooth/btqca.c +++ b/drivers/bluetooth/btqca.c @@ -127,28 +127,42 @@ static void rome_tlv_check_data(struct rome_config *config, BT_DBG("TLV Type\t\t : 0x%x", type_len & 0x000000ff); BT_DBG("Length\t\t : %d bytes", length); + config->dnld_mode = ROME_SKIP_EVT_NONE; + switch (config->type) { case TLV_TYPE_PATCH: tlv_patch = (struct tlv_type_patch *)tlv->data; - BT_DBG("Total Length\t\t : %d bytes", + + /* For Rome version 1.1 to 3.1, all segment commands + * are acked by a vendor specific event (VSE). + * For Rome >= 3.2, the download mode field indicates + * if VSE is skipped by the controller. + * In case VSE is skipped, only the last segment is acked. + */ + if (le16_to_cpu(tlv_patch->rom_build) >= 0x0302) + config->dnld_mode = tlv_patch->download_mode; + + BT_DBG("Total Length : %d bytes", le32_to_cpu(tlv_patch->total_size)); - BT_DBG("Patch Data Length\t : %d bytes", + BT_DBG("Patch Data Length : %d bytes", le32_to_cpu(tlv_patch->data_length)); BT_DBG("Signing Format Version : 0x%x", tlv_patch->format_version); - BT_DBG("Signature Algorithm\t : 0x%x", + BT_DBG("Signature Algorithm : 0x%x", tlv_patch->signature); - BT_DBG("Reserved\t\t : 0x%x", - le16_to_cpu(tlv_patch->reserved1)); - BT_DBG("Product ID\t\t : 0x%04x", + BT_DBG("Download mode : 0x%x", + tlv_patch->download_mode); + BT_DBG("Reserved : 0x%x", + tlv_patch->reserved1); + BT_DBG("Product ID : 0x%04x", le16_to_cpu(tlv_patch->product_id)); - BT_DBG("Rom Build Version\t : 0x%04x", + BT_DBG("Rom Build Version : 0x%04x", le16_to_cpu(tlv_patch->rom_build)); - BT_DBG("Patch Version\t\t : 0x%04x", + BT_DBG("Patch Version : 0x%04x", le16_to_cpu(tlv_patch->patch_version)); - BT_DBG("Reserved\t\t : 0x%x", + BT_DBG("Reserved : 0x%x", le16_to_cpu(tlv_patch->reserved2)); - BT_DBG("Patch Entry Address\t : 0x%x", + BT_DBG("Patch Entry Address : 0x%x", le32_to_cpu(tlv_patch->entry)); break; @@ -194,8 +208,8 @@ static void rome_tlv_check_data(struct rome_config *config, } } -static int rome_tlv_send_segment(struct hci_dev *hdev, int idx, int seg_size, - const u8 *data) +static int rome_tlv_send_segment(struct hci_dev *hdev, int seg_size, + const u8 *data, enum rome_tlv_dnld_mode mode) { struct sk_buff *skb; struct edl_event_hdr *edl; @@ -203,12 +217,15 @@ static int rome_tlv_send_segment(struct hci_dev *hdev, int idx, int seg_size, u8 cmd[MAX_SIZE_PER_TLV_SEGMENT + 2]; int err = 0; - BT_DBG("%s: Download segment #%d size %d", hdev->name, idx, seg_size); - cmd[0] = EDL_PATCH_TLV_REQ_CMD; cmd[1] = seg_size; memcpy(cmd + 2, data, seg_size); + if (mode == ROME_SKIP_EVT_VSE_CC || mode == ROME_SKIP_EVT_VSE) { + return __hci_cmd_sync_noev(hdev, EDL_PATCH_CMD_OPCODE, + seg_size + 2, cmd); + } + skb = __hci_cmd_sync_ev(hdev, EDL_PATCH_CMD_OPCODE, seg_size + 2, cmd, HCI_VENDOR_PKT, HCI_INIT_TIMEOUT); if (IS_ERR(skb)) { @@ -245,47 +262,12 @@ static int rome_tlv_send_segment(struct hci_dev *hdev, int idx, int seg_size, return err; } -static int rome_tlv_download_request(struct hci_dev *hdev, - const struct firmware *fw) -{ - const u8 *buffer, *data; - int total_segment, remain_size; - int ret, i; - - if (!fw || !fw->data) - return -EINVAL; - - total_segment = fw->size / MAX_SIZE_PER_TLV_SEGMENT; - remain_size = fw->size % MAX_SIZE_PER_TLV_SEGMENT; - - BT_DBG("%s: Total segment num %d remain size %d total size %zu", - hdev->name, total_segment, remain_size, fw->size); - - data = fw->data; - for (i = 0; i < total_segment; i++) { - buffer = data + i * MAX_SIZE_PER_TLV_SEGMENT; - ret = rome_tlv_send_segment(hdev, i, MAX_SIZE_PER_TLV_SEGMENT, - buffer); - if (ret < 0) - return -EIO; - } - - if (remain_size) { - buffer = data + total_segment * MAX_SIZE_PER_TLV_SEGMENT; - ret = rome_tlv_send_segment(hdev, total_segment, remain_size, - buffer); - if (ret < 0) - return -EIO; - } - - return 0; -} - static int rome_download_firmware(struct hci_dev *hdev, struct rome_config *config) { const struct firmware *fw; - int ret; + const u8 *segment; + int ret, remain, i = 0; bt_dev_info(hdev, "ROME Downloading %s", config->fwname); @@ -298,10 +280,24 @@ static int rome_download_firmware(struct hci_dev *hdev, rome_tlv_check_data(config, fw); - ret = rome_tlv_download_request(hdev, fw); - if (ret) { - BT_ERR("%s: Failed to download file: %s (%d)", hdev->name, - config->fwname, ret); + segment = fw->data; + remain = fw->size; + while (remain > 0) { + int segsize = min(MAX_SIZE_PER_TLV_SEGMENT, remain); + + bt_dev_dbg(hdev, "Send segment %d, size %d", i++, segsize); + + remain -= segsize; + /* The last segment is always acked regardless download mode */ + if (!remain || segsize < MAX_SIZE_PER_TLV_SEGMENT) + config->dnld_mode = ROME_SKIP_EVT_NONE; + + ret = rome_tlv_send_segment(hdev, segsize, segment, + config->dnld_mode); + if (ret) + break; + + segment += segsize; } release_firmware(fw); diff --git a/drivers/bluetooth/btqca.h b/drivers/bluetooth/btqca.h index 65e994b..13d77fd 100644 --- a/drivers/bluetooth/btqca.h +++ b/drivers/bluetooth/btqca.h @@ -61,6 +61,13 @@ enum qca_bardrate { QCA_BAUDRATE_RESERVED }; +enum rome_tlv_dnld_mode { + ROME_SKIP_EVT_NONE, + ROME_SKIP_EVT_VSE, + ROME_SKIP_EVT_CC, + ROME_SKIP_EVT_VSE_CC +}; + enum rome_tlv_type { TLV_TYPE_PATCH = 1, TLV_TYPE_NVM @@ -70,6 +77,7 @@ struct rome_config { u8 type; char fwname[64]; uint8_t user_baud_rate; + enum rome_tlv_dnld_mode dnld_mode; }; struct edl_event_hdr { @@ -94,7 +102,8 @@ struct tlv_type_patch { __le32 data_length; __u8 format_version; __u8 signature; - __le16 reserved1; + __u8 download_mode; + __u8 reserved1; __le16 product_id; __le16 rom_build; __le16 patch_version;