Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp4279485yba; Mon, 29 Apr 2019 17:15:01 -0700 (PDT) X-Google-Smtp-Source: APXvYqyxYbiAnno4wvYRPMgrdmLxRFzECaizCIt3h+6s5vAtz8Zf8+teQiuILPVyPHV2Lfsbsjj/ X-Received: by 2002:a63:4b20:: with SMTP id y32mr63061508pga.244.1556583301366; Mon, 29 Apr 2019 17:15:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1556583301; cv=none; d=google.com; s=arc-20160816; b=MJV0MOOVgHr/b1IlRlO0Os9k6eCZ3xphJpGZSX0iB3Lr1n7W6Dq4sylQtErGzGIPrd zydEt8wk/T/k65FU8Xnig3JesMMX9+YPRrlOFey3/sEwSPXj75931UiW77LsjIMktDkY i85Zr4bSLICpPtIqdanAo5TB4Ue7rtwqhutsS8f71LmiVXbCs8QJbOs6Za6/Zy5KYk6Y ac0VMx32F7MQR6icoc5gQP1NJUCO2I0l7a31MRiX7DtpsnLdzWwqS+JFaOADbEogcNnf FeoJtGWXU5evDjbFRflF62reCsL/bNs679iaXSqwaonWgrCofINJtXGleLuZtuRaFRNl d/cQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature; bh=GDA8JMfknGP5KG93UbG+emkmgs24343xkd/w8E3YJLw=; b=h6xLydqJ1IXsg7iAc0YXbRlJdlsU90zN3ezS2bi6CFQojIRKfvcTwtcIikugbC30XS y1xZhrr6U2Kc9v4M92GXmOB7++uzutnaCct2uz5gH6Jz4G1lYeKoRLmyeZW1166vCE5L FU/EH6ngM64hLI5dXLebDAJCRhPPAIGyYcl8HGJzOmEtNaJ9480/bpEAGYtSsZ7qbe9P I1of7Rq01y5TalbqcieA+Av3CXP37ABTZgliwPso5cs86u2zqWq2cpNe88jpCQFgIV0L c11UUndqft9/uJIDZXybFIIfWlwwWIk6MXFD4UPlkmkqHI0zUEmhruFz+eV73yGTuaiK htSA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=h+UKf1or; spf=pass (google.com: best guess record for domain of linux-bluetooth-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s9si36602916pfa.282.2019.04.29.17.14.46; Mon, 29 Apr 2019 17:15:01 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-bluetooth-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=h+UKf1or; spf=pass (google.com: best guess record for domain of linux-bluetooth-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729104AbfD3AOm (ORCPT + 99 others); Mon, 29 Apr 2019 20:14:42 -0400 Received: from mail-pg1-f196.google.com ([209.85.215.196]:38687 "EHLO mail-pg1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729063AbfD3AOm (ORCPT ); Mon, 29 Apr 2019 20:14:42 -0400 Received: by mail-pg1-f196.google.com with SMTP id j26so5960478pgl.5 for ; Mon, 29 Apr 2019 17:14:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=GDA8JMfknGP5KG93UbG+emkmgs24343xkd/w8E3YJLw=; b=h+UKf1ortX1xrnwMUJiBiYOCr3dazOocpvzYYTc6KHUIYfW2hdzO7qqKdLB8HfNXt5 U4mcrMQ6Nszp7STqkmkdeFTIPTzeketUoYBdn84yWe55jkgOkGZhE/vd3bIAWWHvZ3IH DHm0WggJAhN2BSBSy4Z3uq9eyhdFGEdfZVYGY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=GDA8JMfknGP5KG93UbG+emkmgs24343xkd/w8E3YJLw=; b=MvM239wNwK5k9eKeWhPlF8rtezvKo2edUYfc3Wya6whIB8uH6WXitwSSwesFM6snO0 ryQYasg4bW/MM6shzjR7wEorPeCY1HC6O5CiL3Dd13LOoacTsVr089NC7QsdTLK+RUDO vZyKgJ0lyX71MOynkfV2QnYPyLZTDTh1sMdCzcR8zM8MpprJOAtwknQTKI8KOZCBJh+e IPJ3KlxTbZx33ipih4Uzt9QY0yW9PBxT6wQ2Q5Wy8m/Nh0ffWgdiZ6WlrN16gJjKLFvF FlrIRSg6NxEJ3p2ZQsSpgYNRd+Qo5GPG+BiOcqIwvZWBoUVPg5GUKn6TtzeeXNl7UEo6 h4IA== X-Gm-Message-State: APjAAAVwyJPB09dWE1ibIYISfAvxZs/p5+Dt/0pcuB0mE9y+9NDeh1AO Hhh4GXF8uaL2zR7DvPDR6IZ8ng== X-Received: by 2002:a65:534b:: with SMTP id w11mr3970072pgr.210.1556583281498; Mon, 29 Apr 2019 17:14:41 -0700 (PDT) Received: from localhost ([2620:15c:202:1:75a:3f6e:21d:9374]) by smtp.gmail.com with ESMTPSA id 6sm11989984pfd.85.2019.04.29.17.14.40 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 29 Apr 2019 17:14:41 -0700 (PDT) Date: Mon, 29 Apr 2019 17:14:40 -0700 From: Matthias Kaehlcke To: Marcel Holtmann , Johan Hedberg Cc: linux-bluetooth@vger.kernel.org, linux-kernel@vger.kernel.org, Balakrishna Godavarthi , Harish Bandi , Rocky Liao Subject: Re: [PATCH v8] Bluetooth: btqca: inject command complete event during fw download Message-ID: <20190430001440.GI112750@google.com> References: <20190430001024.209688-1-mka@chromium.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20190430001024.209688-1-mka@chromium.org> User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-bluetooth-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org On Mon, Apr 29, 2019 at 05:10:24PM -0700, Matthias Kaehlcke wrote: > From: Balakrishna Godavarthi > > From: Balakrishna Godavarthi > > Latest qualcomm chips are not sending an command complete event for > every firmware packet sent to chip. They only respond with a vendor > specific event for the last firmware packet. This optimization will > decrease the BT ON time. Due to this we are seeing a timeout error > message logs on the console during firmware download. Now we are > injecting a command complete event once we receive an vendor specific > event for the last RAM firmware packet. > > Signed-off-by: Balakrishna Godavarthi > Tested-by: Matthias Kaehlcke > Reviewed-by: Matthias Kaehlcke > Signed-off-by: Matthias Kaehlcke > --- > Changes in v8: > - renamed QCA_HCI_CC_SUCCESS to QCA_HCI_CC_OPCODE > - use 0xFC00 as opcode of the injected event instead of 0 > - added Matthias' tags from the v7 review > --- > drivers/bluetooth/btqca.c | 39 ++++++++++++++++++++++++++++++++++++++- > drivers/bluetooth/btqca.h | 3 +++ > 2 files changed, 41 insertions(+), 1 deletion(-) > > diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c > index cc12eecd9e4d..ef765ea881b8 100644 > --- a/drivers/bluetooth/btqca.c > +++ b/drivers/bluetooth/btqca.c > @@ -144,6 +144,7 @@ static void qca_tlv_check_data(struct rome_config *config, > * In case VSE is skipped, only the last segment is acked. > */ > config->dnld_mode = tlv_patch->download_mode; > + config->dnld_type = config->dnld_mode; > > BT_DBG("Total Length : %d bytes", > le32_to_cpu(tlv_patch->total_size)); > @@ -264,6 +265,31 @@ static int qca_tlv_send_segment(struct hci_dev *hdev, int seg_size, > return err; > } > > +static int qca_inject_cmd_complete_event(struct hci_dev *hdev) > +{ > + struct hci_event_hdr *hdr; > + struct hci_ev_cmd_complete *evt; > + struct sk_buff *skb; > + > + skb = bt_skb_alloc(sizeof(*hdr) + sizeof(*evt) + 1, GFP_KERNEL); > + if (!skb) > + return -ENOMEM; > + > + hdr = skb_put(skb, sizeof(*hdr)); > + hdr->evt = HCI_EV_CMD_COMPLETE; > + hdr->plen = sizeof(*evt) + 1; > + > + evt = skb_put(skb, sizeof(*evt)); > + evt->ncmd = 1; > + evt->opcode = HCI_OP_NOP; > + > + skb_put_u8(skb, QCA_HCI_CC_SUCCESS); > + > + hci_skb_pkt_type(skb) = HCI_EVENT_PKT; > + > + return hci_recv_frame(hdev, skb); > +} > + > static int qca_download_firmware(struct hci_dev *hdev, > struct rome_config *config) > { > @@ -297,11 +323,22 @@ static int qca_download_firmware(struct hci_dev *hdev, > ret = qca_tlv_send_segment(hdev, segsize, segment, > config->dnld_mode); > if (ret) > - break; > + goto out; > > segment += segsize; > } > > + /* Latest qualcomm chipsets are not sending a command complete event > + * for every fw packet sent. They only respond with a vendor specific > + * event for the last packet. This optimization in the chip will > + * decrease the BT in initialization time. Here we will inject a command > + * complete event to avoid a command timeout error message. > + */ > + if ((config->dnld_type == ROME_SKIP_EVT_VSE_CC || > + config->dnld_type == ROME_SKIP_EVT_VSE)) > + return qca_inject_cmd_complete_event(hdev); > + > +out: > release_firmware(fw); > > return ret; > diff --git a/drivers/bluetooth/btqca.h b/drivers/bluetooth/btqca.h > index 4c4fe2b5b7b7..595abcdaed2d 100644 > --- a/drivers/bluetooth/btqca.h > +++ b/drivers/bluetooth/btqca.h > @@ -41,6 +41,8 @@ > #define QCA_WCN3990_POWERON_PULSE 0xFC > #define QCA_WCN3990_POWEROFF_PULSE 0xC0 > > +#define QCA_HCI_CC_OPCODE 0xFC00 > + > enum qca_baudrate { > QCA_BAUDRATE_115200 = 0, > QCA_BAUDRATE_57600, > @@ -82,6 +84,7 @@ struct rome_config { > char fwname[64]; > uint8_t user_baud_rate; > enum rome_tlv_dnld_mode dnld_mode; > + enum rome_tlv_dnld_mode dnld_type; > }; > > struct edl_event_hdr { In the v7 review (https://lore.kernel.org/patchwork/patch/1028118/) 3 months ago Marcel said he isn't convinced that this solution is needed, but didn't follow up on the discussion, so this is the best we have at the moment. Let's please drive it towards a solution. Thanks Matthias