Message ID | 2d7bef70b876e4cbd447c5109956f716bad5bc2d.1687565769.git.objelf@gmail.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp7744542vqr; Mon, 26 Jun 2023 13:45:39 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ6zR2fDls5Z0pbWdIlmY7gPl3oKzTcaCeaol6d1p8J80mI/z/eX0ewfksR1O0QC2Sd8zCy8 X-Received: by 2002:a05:6402:10c9:b0:51b:f669:9df3 with SMTP id p9-20020a05640210c900b0051bf6699df3mr6859683edu.4.1687812338805; Mon, 26 Jun 2023 13:45:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1687812338; cv=none; d=google.com; s=arc-20160816; b=AIPzF59pQKUh3v8OqXu+w6rqTqd2sK3BlnGHeuCTzIS+9IOfJb6F+PFC/IyVFZJ3A8 k5GMLgdgmPf/bYZfAT7pJ09OSaCLC96mo3xsAa0Hazc96SdH3S4dIVQDq5FNiqIJf/qF eGuYdSQcTrhDQGzSekWEDK+u5/oQ42iuyJgRVJlW1+PpcaS4oxLGSApoEdWa0i+pkjda qCZlzs+7hjTc9O6CKLion7c5WUX0e0nwe08SHDxhr1qqZknBkzbUIckb9cKldnEuYQgo K96T4K8HeBr1ZkAbYX972fPd8Iu/GRkMsXP1HySJjMGK7DF5RpsJE+9UNoYKlORF4GkH peYg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:message-id:date:subject:cc:to:from :dkim-signature; bh=mdBJu5Y3AOIrw1CB5Gdk1NzvwZhl7p/0c17OHhPgCXE=; fh=MfYcnxMXx18yilM26hO1nicoVWM3Rgq3nme/lW8JXfE=; b=JTndThA6fz1L6lTMg/lXKz2DIxyQR+nqJlqyvK+Dv1ANqB8ni/LtWo576lVtp5tiET Ink8VHEJmVTKD1byZzjtre5ydzBakl50JSQKlFUm4n9LcQlRDWRhhOvKyZarUn/dKzz5 ZeZo3nOo/FcyVs/CTZn4XLKqRd/cDLs9/vwLoq2M2kPuUtNJuQe0EiQsRkhlNMEPerTF /yMAuLtzKtg7r+Vlr4lOA/fIAoXdnTQ/O5iDnrzPF0y0q5gfKhBypEIGL2mlX8uuc/7S Aqw+8m2aYIx0m2vcpZRTiiLrAc831TIljWsr02TVkpBffOBqL5ETnhPnmofv9uaE1PtE 2zeQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@mediatek.com header.s=dk header.b=C0izFOEz; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=mediatek.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id k12-20020aa7c38c000000b0051a5acd425esi3017555edq.403.2023.06.26.13.45.14; Mon, 26 Jun 2023 13:45:38 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-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; dkim=pass header.i=@mediatek.com header.s=dk header.b=C0izFOEz; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=mediatek.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230078AbjFZUl4 (ORCPT <rfc822;filip.gregor98@gmail.com> + 99 others); Mon, 26 Jun 2023 16:41:56 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41786 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229677AbjFZUly (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Mon, 26 Jun 2023 16:41:54 -0400 Received: from mailgw02.mediatek.com (unknown [210.61.82.184]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 44CE412C; Mon, 26 Jun 2023 13:41:47 -0700 (PDT) X-UUID: dbaf4d3a146111eeb20a276fd37b9834-20230627 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Type:MIME-Version:Message-ID:Date:Subject:CC:To:From; bh=mdBJu5Y3AOIrw1CB5Gdk1NzvwZhl7p/0c17OHhPgCXE=; b=C0izFOEzJvPZoJfjuZhCWTAs5i7pIOjZz2m50lfKyQTWVJ083lPRkntlQhdqdVAQUY1XreDAUmlngzgutZCO3nTtyAm1VCXQ39Vi/5sNk4maAwYUlYuCXNfnbLuph+A30eHCMPT/y0VJnoWPXBrF9LWcXt74LxXW5TQxDt4Psjo=; X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.1.27,REQID:b6259bdc-1410-4098-89d5-bb3a08f4ffdc,IP:0,U RL:0,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION: release,TS:0 X-CID-META: VersionHash:01c9525,CLOUDID:cf65b93f-7aa7-41f3-a6bd-0433bee822f3,B ulkID:nil,BulkQuantity:0,Recheck:0,SF:102,TC:nil,Content:0,EDM:-3,IP:nil,U RL:11|1,File:nil,Bulk:nil,QS:nil,BEC:nil,COL:0,OSI:0,OSA:0,AV:0,LES:1,SPR: NO X-CID-BVR: 0,NGT X-CID-BAS: 0,NGT,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR,TF_CID_SPAM_ULN X-UUID: dbaf4d3a146111eeb20a276fd37b9834-20230627 Received: from mtkmbs13n2.mediatek.inc [(172.21.101.108)] by mailgw02.mediatek.com (envelope-from <sean.wang@mediatek.com>) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 256/256) with ESMTP id 2089480672; Tue, 27 Jun 2023 04:41:42 +0800 Received: from mtkmbs11n1.mediatek.inc (172.21.101.186) by mtkmbs13n2.mediatek.inc (172.21.101.108) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1118.26; Tue, 27 Jun 2023 04:41:41 +0800 Received: from mtkswgap22.mediatek.inc (172.21.77.33) by mtkmbs11n1.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.2.1118.26 via Frontend Transport; Tue, 27 Jun 2023 04:41:41 +0800 From: <sean.wang@mediatek.com> To: <marcel@holtmann.org>, <johan.hedberg@gmail.com>, <luiz.dentz@gmail.com> CC: <sean.wang@mediatek.com>, <chris.lu@mediatek.com>, <Soul.Huang@mediatek.com>, <Leon.Yen@mediatek.com>, <Deren.Wu@mediatek.com>, <km.lin@mediatek.com>, <robin.chiu@mediatek.com>, <Eddie.Chen@mediatek.com>, <ch.yeh@mediatek.com>, <jenhao.yang@mediatek.com>, <Stella.Chang@mediatek.com>, <Tom.Chou@mediatek.com>, <steve.lee@mediatek.com>, <jsiuda@google.com>, <frankgor@google.com>, <abhishekpandit@google.com>, <michaelfsun@google.com>, <abhishekpandit@chromium.org>, <mcchou@chromium.org>, <shawnku@google.com>, <linux-bluetooth@vger.kernel.org>, <linux-mediatek@lists.infradead.org>, <linux-kernel@vger.kernel.org> Subject: [PATCH v7 1/3] Bluetooth: btusb: mediatek: use readx_poll_timeout instead of open coding Date: Tue, 27 Jun 2023 04:41:37 +0800 Message-ID: <2d7bef70b876e4cbd447c5109956f716bad5bc2d.1687565769.git.objelf@gmail.com> X-Mailer: git-send-email 1.7.9.5 MIME-Version: 1.0 Content-Type: text/plain X-MTK: N X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_MSPIKE_H5, RCVD_IN_MSPIKE_WL,SPF_HELO_PASS,T_SCC_BODY_TEXT_LINE,T_SPF_TEMPERROR, UNPARSEABLE_RELAY 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: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1769799510868883547?= X-GMAIL-MSGID: =?utf-8?q?1769799510868883547?= |
Series |
[v7,1/3] Bluetooth: btusb: mediatek: use readx_poll_timeout instead of open coding
|
|
Commit Message
sean.wang@mediatek.com
June 26, 2023, 8:41 p.m. UTC
From: Sean Wang <sean.wang@mediatek.com> Use readx_poll_timeout instead of open coding to poll the hardware reset status until it is done. Signed-off-by: Sean Wang <sean.wang@mediatek.com> --- v2: use 20ms as the unit to poll according to the requirement of readx_poll_timeout v3: refine btusb_mtk_reset_done and drop the necessary error check in btusb_mtk_cmd_timeout v4, v5, v6 and v7: rebase onto the latest codebase --- drivers/bluetooth/btusb.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-)
Comments
Hi Sean, On Mon, Jun 26, 2023 at 1:41 PM <sean.wang@mediatek.com> wrote: > > From: Jing Cai <jing.cai@mediatek.com> > > Introduce btmtk_reset_work which can be called whenever the firmware abort, > HCI command timeout, other fatal error happen. > > Co-developed-by: Chris Lu <chris.lu@mediatek.com> > Signed-off-by: Chris Lu <chris.lu@mediatek.com> > Co-developed-by: Sean Wang <sean.wang@mediatek.com> > Signed-off-by: Sean Wang <sean.wang@mediatek.com> > Signed-off-by: Jing Cai <jing.cai@mediatek.com> > --- > v2, v3, v4: rebase onto the latest codebase > v5: reset the device on hdev basis and use hci_cmd_sync_queue to > schedule reset work > v6 and v7: rebase onto the latest codebase > --- > drivers/bluetooth/btmtk.c | 15 ++++ > drivers/bluetooth/btmtk.h | 8 +++ > drivers/bluetooth/btusb.c | 145 +++++++++++++++++++------------------- > 3 files changed, 97 insertions(+), 71 deletions(-) > > diff --git a/drivers/bluetooth/btmtk.c b/drivers/bluetooth/btmtk.c > index 9482401d97fa..b8678b75276e 100644 > --- a/drivers/bluetooth/btmtk.c > +++ b/drivers/bluetooth/btmtk.c > @@ -280,6 +280,21 @@ int btmtk_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr) > } > EXPORT_SYMBOL_GPL(btmtk_set_bdaddr); > > +void btmtk_reset_sync(struct hci_dev *hdev) > +{ > + struct btmediatek_data *reset_work = hci_get_priv(hdev); > + int err; > + > + hci_dev_lock(hdev); > + > + err = hci_cmd_sync_queue(hdev, reset_work->reset_sync, NULL, NULL); > + if (err) > + bt_dev_err(hdev, "failed to reset (%d)", err); > + > + hci_dev_unlock(hdev); > +} > +EXPORT_SYMBOL_GPL(btmtk_reset_sync); > + > MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>"); > MODULE_AUTHOR("Mark Chen <mark-yw.chen@mediatek.com>"); > MODULE_DESCRIPTION("Bluetooth support for MediaTek devices ver " VERSION); > diff --git a/drivers/bluetooth/btmtk.h b/drivers/bluetooth/btmtk.h > index fadc1a520652..75d8e71efcd3 100644 > --- a/drivers/bluetooth/btmtk.h > +++ b/drivers/bluetooth/btmtk.h > @@ -120,8 +120,11 @@ struct btmtk_hci_wmt_params { > u32 *status; > }; > > +typedef int (*btmtk_reset_sync_func_t)(struct hci_dev *, void *); > + > struct btmediatek_data { > u32 dev_id; > + btmtk_reset_sync_func_t reset_sync; > }; > > typedef int (*wmt_cmd_sync_func_t)(struct hci_dev *, > @@ -136,6 +139,8 @@ int btmtk_setup_firmware_79xx(struct hci_dev *hdev, const char *fwname, > > int btmtk_setup_firmware(struct hci_dev *hdev, const char *fwname, > wmt_cmd_sync_func_t wmt_cmd_sync); > + > +void btmtk_reset_sync(struct hci_dev *hdev); > #else > > static inline int btmtk_set_bdaddr(struct hci_dev *hdev, > @@ -156,4 +161,7 @@ static int btmtk_setup_firmware(struct hci_dev *hdev, const char *fwname, > return -EOPNOTSUPP; > } > > +static void btmtk_reset_sync(struct hci_dev *hdev) > +{ > +} > #endif > diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c > index 71b119bcff29..4ebab61c288c 100644 > --- a/drivers/bluetooth/btusb.c > +++ b/drivers/bluetooth/btusb.c > @@ -3037,6 +3037,78 @@ static u32 btusb_mtk_reset_done(struct hci_dev *hdev) > return val & MTK_BT_RST_DONE; > } > > +static int btusb_mtk_reset_work(struct hci_dev *hdev, void *rst_data) You can probably drop _work suffix since it no longer runs on its own dedicated work. > +{ > + struct btusb_data *data = hci_get_drvdata(hdev); > + struct btmediatek_data *mediatek; > + u32 val; > + int err; > + > + /* It's MediaTek specific bluetooth reset mechanism via USB */ > + if (test_and_set_bit(BTUSB_HW_RESET_ACTIVE, &data->flags)) { > + bt_dev_err(hdev, "last reset failed? Not resetting again"); > + return -EBUSY; > + } > + > + err = usb_autopm_get_interface(data->intf); > + if (err < 0) > + return err; > + > + btusb_stop_traffic(data); > + usb_kill_anchored_urbs(&data->tx_anchor); > + mediatek = hci_get_priv(hdev); > + > + if (mediatek->dev_id == 0x7925) { > + btusb_mtk_uhw_reg_read(data, MTK_BT_RESET_REG_CONNV3, &val); > + val |= (1 << 5); > + btusb_mtk_uhw_reg_write(data, MTK_BT_RESET_REG_CONNV3, val); > + btusb_mtk_uhw_reg_read(data, MTK_BT_RESET_REG_CONNV3, &val); > + val &= 0xFFFF00FF; > + val |= (1 << 13); > + btusb_mtk_uhw_reg_write(data, MTK_BT_RESET_REG_CONNV3, val); > + btusb_mtk_uhw_reg_write(data, MTK_EP_RST_OPT, 0x00010001); > + btusb_mtk_uhw_reg_read(data, MTK_BT_RESET_REG_CONNV3, &val); > + val |= (1 << 0); > + btusb_mtk_uhw_reg_write(data, MTK_BT_RESET_REG_CONNV3, val); > + btusb_mtk_uhw_reg_write(data, MTK_UDMA_INT_STA_BT, 0x000000FF); > + btusb_mtk_uhw_reg_read(data, MTK_UDMA_INT_STA_BT, &val); > + btusb_mtk_uhw_reg_write(data, MTK_UDMA_INT_STA_BT1, 0x000000FF); > + btusb_mtk_uhw_reg_read(data, MTK_UDMA_INT_STA_BT1, &val); > + msleep(100); > + } else { > + /* It's Device EndPoint Reset Option Register */ > + bt_dev_dbg(hdev, "Initiating reset mechanism via uhw"); > + btusb_mtk_uhw_reg_write(data, MTK_EP_RST_OPT, MTK_EP_RST_IN_OUT_OPT); > + btusb_mtk_uhw_reg_read(data, MTK_BT_WDT_STATUS, &val); > + > + /* Reset the bluetooth chip via USB interface. */ > + btusb_mtk_uhw_reg_write(data, MTK_BT_SUBSYS_RST, 1); > + btusb_mtk_uhw_reg_write(data, MTK_UDMA_INT_STA_BT, 0x000000FF); > + btusb_mtk_uhw_reg_read(data, MTK_UDMA_INT_STA_BT, &val); > + btusb_mtk_uhw_reg_write(data, MTK_UDMA_INT_STA_BT1, 0x000000FF); > + btusb_mtk_uhw_reg_read(data, MTK_UDMA_INT_STA_BT1, &val); > + /* MT7921 need to delay 20ms between toggle reset bit */ > + msleep(20); > + btusb_mtk_uhw_reg_write(data, MTK_BT_SUBSYS_RST, 0); > + btusb_mtk_uhw_reg_read(data, MTK_BT_SUBSYS_RST, &val); > + } > + > + err = readx_poll_timeout(btusb_mtk_reset_done, hdev, val, > + val & MTK_BT_RST_DONE, 20000, 1000000); > + if (err < 0) > + bt_dev_err(hdev, "Reset timeout"); > + > + btusb_mtk_id_get(data, 0x70010200, &val); > + if (!val) > + bt_dev_err(hdev, "Can't get device id, subsys reset fail."); > + > + usb_queue_reset_device(data->intf); > + > + clear_bit(BTUSB_HW_RESET_ACTIVE, &data->flags); > + > + return err; > +} > + > static int btusb_mtk_setup(struct hci_dev *hdev) > { > struct btusb_data *data = hci_get_drvdata(hdev); > @@ -3076,6 +3148,7 @@ static int btusb_mtk_setup(struct hci_dev *hdev) > > mediatek = hci_get_priv(hdev); > mediatek->dev_id = dev_id; > + mediatek->reset_sync = btusb_mtk_reset_work; > > switch (dev_id) { > case 0x7663: > @@ -3233,76 +3306,6 @@ static int btusb_mtk_shutdown(struct hci_dev *hdev) > return 0; > } > > -static void btusb_mtk_cmd_timeout(struct hci_dev *hdev) > -{ > - struct btusb_data *data = hci_get_drvdata(hdev); > - u32 val; > - int err; > - struct btmediatek_data *mediatek; > - > - /* It's MediaTek specific bluetooth reset mechanism via USB */ > - if (test_and_set_bit(BTUSB_HW_RESET_ACTIVE, &data->flags)) { > - bt_dev_err(hdev, "last reset failed? Not resetting again"); > - return; > - } > - > - err = usb_autopm_get_interface(data->intf); > - if (err < 0) > - return; > - > - btusb_stop_traffic(data); > - usb_kill_anchored_urbs(&data->tx_anchor); > - mediatek = hci_get_priv(hdev); > - > - if (mediatek->dev_id == 0x7925) { > - btusb_mtk_uhw_reg_read(data, MTK_BT_RESET_REG_CONNV3, &val); > - val |= (1 << 5); > - btusb_mtk_uhw_reg_write(data, MTK_BT_RESET_REG_CONNV3, val); > - btusb_mtk_uhw_reg_read(data, MTK_BT_RESET_REG_CONNV3, &val); > - val &= 0xFFFF00FF; > - val |= (1 << 13); > - btusb_mtk_uhw_reg_write(data, MTK_BT_RESET_REG_CONNV3, val); > - btusb_mtk_uhw_reg_write(data, MTK_EP_RST_OPT, 0x00010001); > - btusb_mtk_uhw_reg_read(data, MTK_BT_RESET_REG_CONNV3, &val); > - val |= (1 << 0); > - btusb_mtk_uhw_reg_write(data, MTK_BT_RESET_REG_CONNV3, val); > - btusb_mtk_uhw_reg_write(data, MTK_UDMA_INT_STA_BT, 0x000000FF); > - btusb_mtk_uhw_reg_read(data, MTK_UDMA_INT_STA_BT, &val); > - btusb_mtk_uhw_reg_write(data, MTK_UDMA_INT_STA_BT1, 0x000000FF); > - btusb_mtk_uhw_reg_read(data, MTK_UDMA_INT_STA_BT1, &val); > - msleep(100); > - } else { > - /* It's Device EndPoint Reset Option Register */ > - bt_dev_dbg(hdev, "Initiating reset mechanism via uhw"); > - btusb_mtk_uhw_reg_write(data, MTK_EP_RST_OPT, MTK_EP_RST_IN_OUT_OPT); > - btusb_mtk_uhw_reg_read(data, MTK_BT_WDT_STATUS, &val); > - > - /* Reset the bluetooth chip via USB interface. */ > - btusb_mtk_uhw_reg_write(data, MTK_BT_SUBSYS_RST, 1); > - btusb_mtk_uhw_reg_write(data, MTK_UDMA_INT_STA_BT, 0x000000FF); > - btusb_mtk_uhw_reg_read(data, MTK_UDMA_INT_STA_BT, &val); > - btusb_mtk_uhw_reg_write(data, MTK_UDMA_INT_STA_BT1, 0x000000FF); > - btusb_mtk_uhw_reg_read(data, MTK_UDMA_INT_STA_BT1, &val); > - /* MT7921 need to delay 20ms between toggle reset bit */ > - msleep(20); > - btusb_mtk_uhw_reg_write(data, MTK_BT_SUBSYS_RST, 0); > - btusb_mtk_uhw_reg_read(data, MTK_BT_SUBSYS_RST, &val); > - } > - > - err = readx_poll_timeout(btusb_mtk_reset_done, hdev, val, > - val & MTK_BT_RST_DONE, 20000, 1000000); > - if (err < 0) > - bt_dev_err(hdev, "Reset timeout"); > - > - btusb_mtk_id_get(data, 0x70010200, &val); > - if (!val) > - bt_dev_err(hdev, "Can't get device id, subsys reset fail."); > - > - usb_queue_reset_device(data->intf); > - > - clear_bit(BTUSB_HW_RESET_ACTIVE, &data->flags); > -} > - > static int btusb_recv_acl_mtk(struct hci_dev *hdev, struct sk_buff *skb) > { > struct btusb_data *data = hci_get_drvdata(hdev); > @@ -4429,7 +4432,7 @@ static int btusb_probe(struct usb_interface *intf, > hdev->setup = btusb_mtk_setup; > hdev->shutdown = btusb_mtk_shutdown; > hdev->manufacturer = 70; > - hdev->cmd_timeout = btusb_mtk_cmd_timeout; > + hdev->cmd_timeout = btmtk_reset_sync; > hdev->set_bdaddr = btmtk_set_bdaddr; > set_bit(HCI_QUIRK_BROKEN_ENHANCED_SETUP_SYNC_CONN, &hdev->quirks); > set_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks); > -- > 2.25.1 >
Hello: This series was applied to bluetooth/bluetooth-next.git (master) by Luiz Augusto von Dentz <luiz.von.dentz@intel.com>: On Tue, 27 Jun 2023 04:41:37 +0800 you wrote: > From: Sean Wang <sean.wang@mediatek.com> > > Use readx_poll_timeout instead of open coding to poll the hardware reset > status until it is done. > > Signed-off-by: Sean Wang <sean.wang@mediatek.com> > > [...] Here is the summary with links: - [v7,1/3] Bluetooth: btusb: mediatek: use readx_poll_timeout instead of open coding https://git.kernel.org/bluetooth/bluetooth-next/c/c56e5f834e13 - [v7,2/3] Bluetooth: btmtk: introduce btmtk reset work (no matching commit) - [v7,3/3] Bluetooth: btusb: mediatek: add MediaTek devcoredump support (no matching commit) You are awesome, thank you!
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index 1c0879601735..71b119bcff29 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c @@ -2654,8 +2654,6 @@ static int btusb_recv_event_realtek(struct hci_dev *hdev, struct sk_buff *skb) #define MTK_EP_RST_OPT 0x74011890 #define MTK_EP_RST_IN_OUT_OPT 0x00010001 #define MTK_BT_RST_DONE 0x00000100 -#define MTK_BT_RESET_WAIT_MS 100 -#define MTK_BT_RESET_NUM_TRIES 10 #define MTK_BT_RESET_REG_CONNV3 0x70028610 #define MTK_BT_READ_DEV_ID 0x70010200 @@ -3029,6 +3027,16 @@ static int btusb_mtk_id_get(struct btusb_data *data, u32 reg, u32 *id) return btusb_mtk_reg_read(data, reg, id); } +static u32 btusb_mtk_reset_done(struct hci_dev *hdev) +{ + struct btusb_data *data = hci_get_drvdata(hdev); + u32 val = 0; + + btusb_mtk_uhw_reg_read(data, MTK_BT_MISC, &val); + + return val & MTK_BT_RST_DONE; +} + static int btusb_mtk_setup(struct hci_dev *hdev) { struct btusb_data *data = hci_get_drvdata(hdev); @@ -3229,7 +3237,7 @@ static void btusb_mtk_cmd_timeout(struct hci_dev *hdev) { struct btusb_data *data = hci_get_drvdata(hdev); u32 val; - int err, retry = 0; + int err; struct btmediatek_data *mediatek; /* It's MediaTek specific bluetooth reset mechanism via USB */ @@ -3281,18 +3289,10 @@ static void btusb_mtk_cmd_timeout(struct hci_dev *hdev) btusb_mtk_uhw_reg_read(data, MTK_BT_SUBSYS_RST, &val); } - /* Poll the register until reset is completed */ - do { - btusb_mtk_uhw_reg_read(data, MTK_BT_MISC, &val); - if (val & MTK_BT_RST_DONE) { - bt_dev_dbg(hdev, "Bluetooth Reset Successfully"); - break; - } - - bt_dev_dbg(hdev, "Polling Bluetooth Reset CR"); - retry++; - msleep(MTK_BT_RESET_WAIT_MS); - } while (retry < MTK_BT_RESET_NUM_TRIES); + err = readx_poll_timeout(btusb_mtk_reset_done, hdev, val, + val & MTK_BT_RST_DONE, 20000, 1000000); + if (err < 0) + bt_dev_err(hdev, "Reset timeout"); btusb_mtk_id_get(data, 0x70010200, &val); if (!val)