mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Max Chou <max.chou@realtek.com>
To: Kai-Heng Feng <kai.heng.feng@canonical.com>,
	alex_lu <alex_lu@realsil.com.cn>
Cc: Marcel Holtmann <marcel@holtmann.org>,
	Johan Hedberg <johan.hedberg@gmail.com>,
	"open list:BLUETOOTH DRIVERS" <linux-bluetooth@vger.kernel.org>,
	open list <linux-kernel@vger.kernel.org>
Subject: RE: [PATCH v2] Bluetooth: btrtl: Ask 8821C to drop old firmware
Date: Tue, 3 Nov 2020 02:30:57 +0000	[thread overview]
Message-ID: <9f663bf0e4ce4101b688127de088d477@realtek.com> (raw)
In-Reply-To: <1A6AB99C-425D-42D5-B1F4-818AD7525F53@canonical.com>

Dear guys,
I agree this patch.


BRs,
Max


-----Original Message-----
From: Kai-Heng Feng <kai.heng.feng@canonical.com> 
Sent: Monday, November 2, 2020 9:33 PM
To: Max Chou <max.chou@realtek.com>; alex_lu <alex_lu@realsil.com.cn>
Cc: Marcel Holtmann <marcel@holtmann.org>; Johan Hedberg <johan.hedberg@gmail.com>; open list:BLUETOOTH DRIVERS <linux-bluetooth@vger.kernel.org>; open list <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v2] Bluetooth: btrtl: Ask 8821C to drop old firmware

> On Oct 26, 2020, at 16:28, Kai-Heng Feng <kai.heng.feng@canonical.com> wrote:
> 
> Some platforms keep USB power even when they are powered off and in 
> S5, this makes Realtek 8821C keep its firmware even after a cold boot, 
> and make 8821C never load new firmware.
> 
> So use vendor specific HCI command to ask 8821C drop its firmware 
> after system shutdown.
> 
> Newer firmware doesn't have this issue so we only use this trick for 
> old 8821C firmware version.
> 
> Suggested-by: Max Chou <max.chou@realtek.com>
> Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>

Max and Alex,

Can you please ack or review the patch?

Kai-Heng

> ---
> v2:
> - Fix incorrect parAnthesis on le16_to_cpu.
> - Ensure firmware gets re-uploaded in initialization.
> 
> drivers/bluetooth/btrtl.c | 46 +++++++++++++++++++++++++++++++++++++++
> 1 file changed, 46 insertions(+)
> 
> diff --git a/drivers/bluetooth/btrtl.c b/drivers/bluetooth/btrtl.c 
> index 3a9afc905f24..37e24bbb2eb4 100644
> --- a/drivers/bluetooth/btrtl.c
> +++ b/drivers/bluetooth/btrtl.c
> @@ -55,6 +55,7 @@ struct btrtl_device_info {
> 	int fw_len;
> 	u8 *cfg_data;
> 	int cfg_len;
> +	bool drop_fw;
> };
> 
> static const struct id_table ic_id_table[] = { @@ -563,6 +564,8 @@ 
> struct btrtl_device_info *btrtl_initialize(struct hci_dev *hdev,
> 	u16 hci_rev, lmp_subver;
> 	u8 hci_ver;
> 	int ret;
> +	u16 opcode;
> +	u8 cmd[2];
> 
> 	btrtl_dev = kzalloc(sizeof(*btrtl_dev), GFP_KERNEL);
> 	if (!btrtl_dev) {
> @@ -584,6 +587,49 @@ struct btrtl_device_info *btrtl_initialize(struct hci_dev *hdev,
> 	hci_ver = resp->hci_ver;
> 	hci_rev = le16_to_cpu(resp->hci_rev);
> 	lmp_subver = le16_to_cpu(resp->lmp_subver);
> +
> +	if (resp->hci_ver == 0x8 && le16_to_cpu(resp->hci_rev) == 0x826c &&
> +	    resp->lmp_ver == 0x8 && le16_to_cpu(resp->lmp_subver) == 0xa99e)
> +		btrtl_dev->drop_fw = true;
> +
> +	if (btrtl_dev->drop_fw) {
> +		opcode = hci_opcode_pack(0x3f, 0x66);
> +		cmd[0] = opcode & 0xff;
> +		cmd[1] = opcode >> 8;
> +
> +		skb = bt_skb_alloc(sizeof(cmd), GFP_KERNEL);
> +		if (IS_ERR(skb))
> +			goto out_free;
> +
> +		skb_put_data(skb, cmd, sizeof(cmd));
> +		hci_skb_pkt_type(skb) = HCI_COMMAND_PKT;
> +
> +		hdev->send(hdev, skb);
> +
> +		/* Ensure the above vendor command is sent to controller and
> +		 * process has done.
> +		 */
> +		msleep(200);
> +
> +		/* Read the local version again. Expect to have the vanilla
> +		 * version as cold boot.
> +		 */
> +		skb = btrtl_read_local_version(hdev);
> +		if (IS_ERR(skb)) {
> +			ret = PTR_ERR(skb);
> +			goto err_free;
> +		}
> +
> +		resp = (struct hci_rp_read_local_version *)skb->data;
> +		rtl_dev_info(hdev, "examining hci_ver=%02x hci_rev=%04x lmp_ver=%02x lmp_subver=%04x",
> +			     resp->hci_ver, resp->hci_rev,
> +			     resp->lmp_ver, resp->lmp_subver);
> +
> +		hci_ver = resp->hci_ver;
> +		hci_rev = le16_to_cpu(resp->hci_rev);
> +		lmp_subver = le16_to_cpu(resp->lmp_subver);
> +	}
> +out_free:
> 	kfree_skb(skb);
> 
> 	btrtl_dev->ic_info = btrtl_match_ic(lmp_subver, hci_rev, hci_ver,
> --
> 2.17.1
> 


------Please consider the environment before printing this e-mail.

  reply	other threads:[~2020-11-03  2:31 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-26  8:28 Kai-Heng Feng
2020-11-02 13:32 ` Kai-Heng Feng
2020-11-03  2:30   ` Max Chou [this message]
2020-11-09 12:39 ` Marcel Holtmann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=9f663bf0e4ce4101b688127de088d477@realtek.com \
    --to=max.chou@realtek.com \
    --cc=alex_lu@realsil.com.cn \
    --cc=johan.hedberg@gmail.com \
    --cc=kai.heng.feng@canonical.com \
    --cc=linux-bluetooth@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=marcel@holtmann.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome