hc
2024-02-19 1c055e55a242a33e574e48be530e06770a210dcd
kernel/drivers/bluetooth/hci_qca.c
....@@ -50,6 +50,9 @@
5050 #define IBS_HOST_TX_IDLE_TIMEOUT_MS 2000
5151 #define CMD_TRANS_TIMEOUT_MS 100
5252 #define MEMDUMP_TIMEOUT_MS 8000
53
+#define IBS_DISABLE_SSR_TIMEOUT_MS \
54
+ (MEMDUMP_TIMEOUT_MS + FW_DOWNLOAD_TIMEOUT_MS)
55
+#define FW_DOWNLOAD_TIMEOUT_MS 3000
5356
5457 /* susclk rate */
5558 #define SUSCLK_RATE_32KHZ 32768
....@@ -68,12 +71,15 @@
6871 #define QCA_MEMDUMP_BYTE 0xFB
6972
7073 enum qca_flags {
71
- QCA_IBS_ENABLED,
74
+ QCA_IBS_DISABLED,
7275 QCA_DROP_VENDOR_EVENT,
7376 QCA_SUSPENDING,
7477 QCA_MEMDUMP_COLLECTION,
7578 QCA_HW_ERROR_EVENT,
76
- QCA_SSR_TRIGGERED
79
+ QCA_SSR_TRIGGERED,
80
+ QCA_BT_OFF,
81
+ QCA_ROM_FW,
82
+ QCA_DEBUGFS_CREATED,
7783 };
7884
7985 enum qca_capabilities {
....@@ -628,6 +634,9 @@
628634 if (!hdev->debugfs)
629635 return;
630636
637
+ if (test_and_set_bit(QCA_DEBUGFS_CREATED, &qca->flags))
638
+ return;
639
+
631640 ibs_dir = debugfs_create_dir("ibs", hdev->debugfs);
632641
633642 /* read only */
....@@ -870,7 +879,7 @@
870879 * Out-Of-Band(GPIOs control) sleep is selected.
871880 * Don't wake the device up when suspending.
872881 */
873
- if (!test_bit(QCA_IBS_ENABLED, &qca->flags) ||
882
+ if (test_bit(QCA_IBS_DISABLED, &qca->flags) ||
874883 test_bit(QCA_SUSPENDING, &qca->flags)) {
875884 skb_queue_tail(&qca->txq, skb);
876885 spin_unlock_irqrestore(&qca->hci_ibs_lock, flags);
....@@ -905,7 +914,7 @@
905914 default:
906915 BT_ERR("Illegal tx state: %d (losing packet)",
907916 qca->tx_ibs_state);
908
- kfree_skb(skb);
917
+ dev_kfree_skb_irq(skb);
909918 break;
910919 }
911920
....@@ -1015,7 +1024,7 @@
10151024 * the controller to send the dump is 8 seconds. let us
10161025 * start timer to handle this asynchronous activity.
10171026 */
1018
- clear_bit(QCA_IBS_ENABLED, &qca->flags);
1027
+ set_bit(QCA_IBS_DISABLED, &qca->flags);
10191028 set_bit(QCA_MEMDUMP_COLLECTION, &qca->flags);
10201029 dump = (void *) skb->data;
10211030 dump_size = __le32_to_cpu(dump->dump_size);
....@@ -1621,6 +1630,7 @@
16211630 struct hci_uart *hu = hci_get_drvdata(hdev);
16221631 enum qca_btsoc_type soc_type = qca_soc_type(hu);
16231632 struct qca_serdev *qcadev;
1633
+ struct qca_data *qca = hu->priv;
16241634 int ret = 0;
16251635
16261636 /* Non-serdev device usually is powered by external power
....@@ -1640,6 +1650,7 @@
16401650 }
16411651 }
16421652
1653
+ clear_bit(QCA_BT_OFF, &qca->flags);
16431654 return ret;
16441655 }
16451656
....@@ -1658,8 +1669,9 @@
16581669 if (ret)
16591670 return ret;
16601671
1672
+ clear_bit(QCA_ROM_FW, &qca->flags);
16611673 /* Patch downloading has to be done without IBS mode */
1662
- clear_bit(QCA_IBS_ENABLED, &qca->flags);
1674
+ set_bit(QCA_IBS_DISABLED, &qca->flags);
16631675
16641676 /* Enable controller to do both LE scan and BR/EDR inquiry
16651677 * simultaneously.
....@@ -1710,18 +1722,20 @@
17101722 ret = qca_uart_setup(hdev, qca_baudrate, soc_type, soc_ver,
17111723 firmware_name);
17121724 if (!ret) {
1713
- set_bit(QCA_IBS_ENABLED, &qca->flags);
1725
+ clear_bit(QCA_IBS_DISABLED, &qca->flags);
17141726 qca_debugfs_init(hdev);
17151727 hu->hdev->hw_error = qca_hw_error;
17161728 hu->hdev->cmd_timeout = qca_cmd_timeout;
17171729 } else if (ret == -ENOENT) {
17181730 /* No patch/nvm-config found, run with original fw/config */
1731
+ set_bit(QCA_ROM_FW, &qca->flags);
17191732 ret = 0;
17201733 } else if (ret == -EAGAIN) {
17211734 /*
17221735 * Userspace firmware loader will return -EAGAIN in case no
17231736 * patch/nvm-config is found, so run with original fw/config.
17241737 */
1738
+ set_bit(QCA_ROM_FW, &qca->flags);
17251739 ret = 0;
17261740 } else {
17271741 if (retries < MAX_INIT_RETRIES) {
....@@ -1814,7 +1828,7 @@
18141828 * data in skb's.
18151829 */
18161830 spin_lock_irqsave(&qca->hci_ibs_lock, flags);
1817
- clear_bit(QCA_IBS_ENABLED, &qca->flags);
1831
+ set_bit(QCA_IBS_DISABLED, &qca->flags);
18181832 qca_flush(hu);
18191833 spin_unlock_irqrestore(&qca->hci_ibs_lock, flags);
18201834
....@@ -1833,6 +1847,8 @@
18331847 } else if (qcadev->bt_en) {
18341848 gpiod_set_value_cansleep(qcadev->bt_en, 0);
18351849 }
1850
+
1851
+ set_bit(QCA_BT_OFF, &qca->flags);
18361852 }
18371853
18381854 static int qca_power_off(struct hci_dev *hdev)
....@@ -2057,10 +2073,17 @@
20572073 int timeout = msecs_to_jiffies(CMD_TRANS_TIMEOUT_MS);
20582074 struct serdev_device *serdev = to_serdev_device(dev);
20592075 struct qca_serdev *qcadev = serdev_device_get_drvdata(serdev);
2076
+ struct hci_uart *hu = &qcadev->serdev_hu;
2077
+ struct hci_dev *hdev = hu->hdev;
2078
+ struct qca_data *qca = hu->priv;
20602079 const u8 ibs_wake_cmd[] = { 0xFD };
20612080 const u8 edl_reset_soc_cmd[] = { 0x01, 0x00, 0xFC, 0x01, 0x05 };
20622081
20632082 if (qcadev->btsoc_type == QCA_QCA6390) {
2083
+ if (test_bit(QCA_BT_OFF, &qca->flags) ||
2084
+ !test_bit(HCI_RUNNING, &hdev->flags))
2085
+ return;
2086
+
20642087 serdev_device_write_flush(serdev);
20652088 ret = serdev_device_write_buf(serdev, ibs_wake_cmd,
20662089 sizeof(ibs_wake_cmd));
....@@ -2093,13 +2116,44 @@
20932116 bool tx_pending = false;
20942117 int ret = 0;
20952118 u8 cmd;
2119
+ u32 wait_timeout = 0;
20962120
20972121 set_bit(QCA_SUSPENDING, &qca->flags);
20982122
2099
- /* Device is downloading patch or doesn't support in-band sleep. */
2100
- if (!test_bit(QCA_IBS_ENABLED, &qca->flags))
2123
+ /* if BT SoC is running with default firmware then it does not
2124
+ * support in-band sleep
2125
+ */
2126
+ if (test_bit(QCA_ROM_FW, &qca->flags))
21012127 return 0;
21022128
2129
+ /* During SSR after memory dump collection, controller will be
2130
+ * powered off and then powered on.If controller is powered off
2131
+ * during SSR then we should wait until SSR is completed.
2132
+ */
2133
+ if (test_bit(QCA_BT_OFF, &qca->flags) &&
2134
+ !test_bit(QCA_SSR_TRIGGERED, &qca->flags))
2135
+ return 0;
2136
+
2137
+ if (test_bit(QCA_IBS_DISABLED, &qca->flags) ||
2138
+ test_bit(QCA_SSR_TRIGGERED, &qca->flags)) {
2139
+ wait_timeout = test_bit(QCA_SSR_TRIGGERED, &qca->flags) ?
2140
+ IBS_DISABLE_SSR_TIMEOUT_MS :
2141
+ FW_DOWNLOAD_TIMEOUT_MS;
2142
+
2143
+ /* QCA_IBS_DISABLED flag is set to true, During FW download
2144
+ * and during memory dump collection. It is reset to false,
2145
+ * After FW download complete.
2146
+ */
2147
+ wait_on_bit_timeout(&qca->flags, QCA_IBS_DISABLED,
2148
+ TASK_UNINTERRUPTIBLE, msecs_to_jiffies(wait_timeout));
2149
+
2150
+ if (test_bit(QCA_IBS_DISABLED, &qca->flags)) {
2151
+ bt_dev_err(hu->hdev, "SSR or FW download time out");
2152
+ ret = -ETIMEDOUT;
2153
+ goto error;
2154
+ }
2155
+ }
2156
+
21032157 cancel_work_sync(&qca->ws_awake_device);
21042158 cancel_work_sync(&qca->ws_awake_rx);
21052159