* [PATCH v2] driver: bluetooth: hci_qca: fix ssr fail when BT_EN is pulled up by hw
@ 2025-06-27 6:17 Shuai Zhang
2025-06-27 6:42 ` [v2] " bluez.test.bot
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Shuai Zhang @ 2025-06-27 6:17 UTC (permalink / raw)
To: linux-bluetooth; +Cc: quic_bt, Shuai Zhang
Q1:
If the SoC always enables the bt_en pin via hardware and the driver
cannot control the bt_en pin of the SoC chip, then during SSR,
the QCA_SSR_TRIGGERED and QCA_IBS_DISABLED bits cannot be cleared.
This leads to a reset command timeout failure.
Fix1:
To address this, clear QCA_SSR_TRIGGERED and QCA_IBS_DISABLED bits
after the coredump collection is complete.
Also, add msleep delay to wait for controller to complete SSR.
Q2:
When the SSR (Sub-System Restart) duration exceeds 2 seconds, it triggers
host tx_idle_timeout, which sets host TX state to sleep. due to the
hardware pulling up bt_en, the firmware is not downloaded after the SSR.
As a result, the controller does not enter sleep mode. Consequently,
when the host sends a command afterward, it sends 0xFD to the controller,
but the controller does not respond, leading to a command timeout.
Fix2:
Reset the tx_idle_timer after SSR (Sub-System Restart).
Changes in v2:
- Modified the format.
- Add changes to fix tx_idle_timeout
- Link to v1: https://lore.kernel.org/all/20250609105553.3756688-1-quic_shuaz@quicinc.com/
Signed-off-by: Shuai Zhang <quic_shuaz@quicinc.com>
---
drivers/bluetooth/hci_qca.c | 20 +++++++++++++++++++-
1 file changed, 19 insertions(+), 1 deletion(-)
diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c
index 4e56782b0..d415a3f31 100644
--- a/drivers/bluetooth/hci_qca.c
+++ b/drivers/bluetooth/hci_qca.c
@@ -1653,6 +1653,24 @@ static void qca_hw_error(struct hci_dev *hdev, u8 code)
skb_queue_purge(&qca->rx_memdump_q);
}
+ /* If the SoC always enables the bt_en pin via hardware and the driver
+ * cannot control the bt_en pin of the SoC chip, then during SSR,
+ * the QCA_SSR_TRIGGERED and QCA_IBS_DISABLED bits cannot be cleared.
+ * This leads to a reset command timeout failure.
+ *
+ * To address this, clear QCA_SSR_TRIGGERED and QCA_IBS_DISABLED bits
+ * after the coredump collection is complete.
+ * Also, add msleep delay to wait for controller to complete SSR.
+ */
+ if (!test_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks)) {
+ clear_bit(QCA_SSR_TRIGGERED, &qca->flags);
+ clear_bit(QCA_IBS_DISABLED, &qca->flags);
+ mod_timer(&qca->tx_idle_timer, jiffies +
+ msecs_to_jiffies(qca->tx_idle_delay));
+ qca->tx_ibs_state = HCI_IBS_TX_AWAKE;
+ msleep(50);
+ }
+
clear_bit(QCA_HW_ERROR_EVENT, &qca->flags);
}
@@ -2478,7 +2496,7 @@ static int qca_serdev_probe(struct serdev_device *serdev)
return PTR_ERR(qcadev->susclk);
}
}
-
+
err = hci_uart_register_device(&qcadev->serdev_hu, &qca_proto);
if (err) {
BT_ERR("serdev registration failed");
--
2.34.1
^ permalink raw reply related [flat|nested] 6+ messages in thread* RE: [v2] driver: bluetooth: hci_qca: fix ssr fail when BT_EN is pulled up by hw 2025-06-27 6:17 [PATCH v2] driver: bluetooth: hci_qca: fix ssr fail when BT_EN is pulled up by hw Shuai Zhang @ 2025-06-27 6:42 ` bluez.test.bot 2025-07-07 7:22 ` [PATCH v2] " Shuai Zhang 2025-07-07 18:39 ` Luiz Augusto von Dentz 2 siblings, 0 replies; 6+ messages in thread From: bluez.test.bot @ 2025-06-27 6:42 UTC (permalink / raw) To: linux-bluetooth, quic_shuaz [-- Attachment #1: Type: text/plain, Size: 2195 bytes --] This is automated email and please do not reply to this email! Dear submitter, Thank you for submitting the patches to the linux bluetooth mailing list. This is a CI test results with your patch series: PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=976474 ---Test result--- Test Summary: CheckPatch PENDING 0.33 seconds GitLint PENDING 0.33 seconds SubjectPrefix FAIL 0.32 seconds BuildKernel PASS 25.64 seconds CheckAllWarning PASS 28.16 seconds CheckSparse PASS 31.37 seconds BuildKernel32 PASS 25.80 seconds TestRunnerSetup PASS 478.55 seconds TestRunner_l2cap-tester PASS 25.47 seconds TestRunner_iso-tester PASS 38.83 seconds TestRunner_bnep-tester PASS 5.90 seconds TestRunner_mgmt-tester PASS 134.75 seconds TestRunner_rfcomm-tester PASS 9.22 seconds TestRunner_sco-tester PASS 14.83 seconds TestRunner_ioctl-tester PASS 10.07 seconds TestRunner_mesh-tester FAIL 11.37 seconds TestRunner_smp-tester PASS 8.53 seconds TestRunner_userchan-tester PASS 6.08 seconds IncrementalBuild PENDING 0.64 seconds Details ############################## Test: CheckPatch - PENDING Desc: Run checkpatch.pl script Output: ############################## Test: GitLint - PENDING Desc: Run gitlint Output: ############################## Test: SubjectPrefix - FAIL Desc: Check subject contains "Bluetooth" prefix Output: "Bluetooth: " prefix is not specified in the subject ############################## Test: TestRunner_mesh-tester - FAIL Desc: Run mesh-tester with test-runner Output: Total: 10, Passed: 8 (80.0%), Failed: 2, Not Run: 0 Failed Test Cases Mesh - Send cancel - 1 Timed out 2.123 seconds Mesh - Send cancel - 2 Timed out 2.000 seconds ############################## Test: IncrementalBuild - PENDING Desc: Incremental build with the patches in the series Output: --- Regards, Linux Bluetooth ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2] driver: bluetooth: hci_qca: fix ssr fail when BT_EN is pulled up by hw 2025-06-27 6:17 [PATCH v2] driver: bluetooth: hci_qca: fix ssr fail when BT_EN is pulled up by hw Shuai Zhang 2025-06-27 6:42 ` [v2] " bluez.test.bot @ 2025-07-07 7:22 ` Shuai Zhang 2025-07-07 7:23 ` Shuai Zhang 2025-07-07 18:39 ` Luiz Augusto von Dentz 2 siblings, 1 reply; 6+ messages in thread From: Shuai Zhang @ 2025-07-07 7:22 UTC (permalink / raw) To: linux-bluetooth; +Cc: quic_bt Dear all On 2025/6/27 14:17, Shuai Zhang wrote: > Q1: > If the SoC always enables the bt_en pin via hardware and the driver > cannot control the bt_en pin of the SoC chip, then during SSR, > the QCA_SSR_TRIGGERED and QCA_IBS_DISABLED bits cannot be cleared. > This leads to a reset command timeout failure. > > Fix1: > To address this, clear QCA_SSR_TRIGGERED and QCA_IBS_DISABLED bits > after the coredump collection is complete. > Also, add msleep delay to wait for controller to complete SSR. > > Q2: > When the SSR (Sub-System Restart) duration exceeds 2 seconds, it triggers > host tx_idle_timeout, which sets host TX state to sleep. due to the > hardware pulling up bt_en, the firmware is not downloaded after the SSR. > As a result, the controller does not enter sleep mode. Consequently, > when the host sends a command afterward, it sends 0xFD to the controller, > but the controller does not respond, leading to a command timeout. > > Fix2: > Reset the tx_idle_timer after SSR (Sub-System Restart). > > Changes in v2: > - Modified the format. > - Add changes to fix tx_idle_timeout > - Link to v1: https://lore.kernel.org/all/20250609105553.3756688-1-quic_shuaz@quicinc.com/ > > Signed-off-by: Shuai Zhang <quic_shuaz@quicinc.com> > --- > drivers/bluetooth/hci_qca.c | 20 +++++++++++++++++++- > 1 file changed, 19 insertions(+), 1 deletion(-) > > diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c > index 4e56782b0..d415a3f31 100644 > --- a/drivers/bluetooth/hci_qca.c > +++ b/drivers/bluetooth/hci_qca.c > @@ -1653,6 +1653,24 @@ static void qca_hw_error(struct hci_dev *hdev, u8 code) > skb_queue_purge(&qca->rx_memdump_q); > } > > + /* If the SoC always enables the bt_en pin via hardware and the driver > + * cannot control the bt_en pin of the SoC chip, then during SSR, > + * the QCA_SSR_TRIGGERED and QCA_IBS_DISABLED bits cannot be cleared. > + * This leads to a reset command timeout failure. > + * > + * To address this, clear QCA_SSR_TRIGGERED and QCA_IBS_DISABLED bits > + * after the coredump collection is complete. > + * Also, add msleep delay to wait for controller to complete SSR. > + */ > + if (!test_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks)) { > + clear_bit(QCA_SSR_TRIGGERED, &qca->flags); > + clear_bit(QCA_IBS_DISABLED, &qca->flags); > + mod_timer(&qca->tx_idle_timer, jiffies + > + msecs_to_jiffies(qca->tx_idle_delay)); > + qca->tx_ibs_state = HCI_IBS_TX_AWAKE; > + msleep(50); > + } > + > clear_bit(QCA_HW_ERROR_EVENT, &qca->flags); > } > > @@ -2478,7 +2496,7 @@ static int qca_serdev_probe(struct serdev_device *serdev) > return PTR_ERR(qcadev->susclk); > } > } > - > + > err = hci_uart_register_device(&qcadev->serdev_hu, &qca_proto); > if (err) { > BT_ERR("serdev registration failed"); Is there any update? thanks, Shuai ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2] driver: bluetooth: hci_qca: fix ssr fail when BT_EN is pulled up by hw 2025-07-07 7:22 ` [PATCH v2] " Shuai Zhang @ 2025-07-07 7:23 ` Shuai Zhang 0 siblings, 0 replies; 6+ messages in thread From: Shuai Zhang @ 2025-07-07 7:23 UTC (permalink / raw) To: linux-bluetooth; +Cc: quic_bt, linux-arm-msm +++ On 2025/7/7 15:22, Shuai Zhang wrote: > Dear all > > On 2025/6/27 14:17, Shuai Zhang wrote: >> Q1: >> If the SoC always enables the bt_en pin via hardware and the driver >> cannot control the bt_en pin of the SoC chip, then during SSR, >> the QCA_SSR_TRIGGERED and QCA_IBS_DISABLED bits cannot be cleared. >> This leads to a reset command timeout failure. >> >> Fix1: >> To address this, clear QCA_SSR_TRIGGERED and QCA_IBS_DISABLED bits >> after the coredump collection is complete. >> Also, add msleep delay to wait for controller to complete SSR. >> >> Q2: >> When the SSR (Sub-System Restart) duration exceeds 2 seconds, it triggers >> host tx_idle_timeout, which sets host TX state to sleep. due to the >> hardware pulling up bt_en, the firmware is not downloaded after the SSR. >> As a result, the controller does not enter sleep mode. Consequently, >> when the host sends a command afterward, it sends 0xFD to the controller, >> but the controller does not respond, leading to a command timeout. >> >> Fix2: >> Reset the tx_idle_timer after SSR (Sub-System Restart). >> >> Changes in v2: >> - Modified the format. >> - Add changes to fix tx_idle_timeout >> - Link to v1: https://lore.kernel.org/all/20250609105553.3756688-1-quic_shuaz@quicinc.com/ >> >> Signed-off-by: Shuai Zhang <quic_shuaz@quicinc.com> >> --- >> drivers/bluetooth/hci_qca.c | 20 +++++++++++++++++++- >> 1 file changed, 19 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c >> index 4e56782b0..d415a3f31 100644 >> --- a/drivers/bluetooth/hci_qca.c >> +++ b/drivers/bluetooth/hci_qca.c >> @@ -1653,6 +1653,24 @@ static void qca_hw_error(struct hci_dev *hdev, u8 code) >> skb_queue_purge(&qca->rx_memdump_q); >> } >> >> + /* If the SoC always enables the bt_en pin via hardware and the driver >> + * cannot control the bt_en pin of the SoC chip, then during SSR, >> + * the QCA_SSR_TRIGGERED and QCA_IBS_DISABLED bits cannot be cleared. >> + * This leads to a reset command timeout failure. >> + * >> + * To address this, clear QCA_SSR_TRIGGERED and QCA_IBS_DISABLED bits >> + * after the coredump collection is complete. >> + * Also, add msleep delay to wait for controller to complete SSR. >> + */ >> + if (!test_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks)) { >> + clear_bit(QCA_SSR_TRIGGERED, &qca->flags); >> + clear_bit(QCA_IBS_DISABLED, &qca->flags); >> + mod_timer(&qca->tx_idle_timer, jiffies + >> + msecs_to_jiffies(qca->tx_idle_delay)); >> + qca->tx_ibs_state = HCI_IBS_TX_AWAKE; >> + msleep(50); >> + } >> + >> clear_bit(QCA_HW_ERROR_EVENT, &qca->flags); >> } >> >> @@ -2478,7 +2496,7 @@ static int qca_serdev_probe(struct serdev_device *serdev) >> return PTR_ERR(qcadev->susclk); >> } >> } >> - >> + >> err = hci_uart_register_device(&qcadev->serdev_hu, &qca_proto); >> if (err) { >> BT_ERR("serdev registration failed"); > > Is there any update? > > thanks, > Shuai ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2] driver: bluetooth: hci_qca: fix ssr fail when BT_EN is pulled up by hw 2025-06-27 6:17 [PATCH v2] driver: bluetooth: hci_qca: fix ssr fail when BT_EN is pulled up by hw Shuai Zhang 2025-06-27 6:42 ` [v2] " bluez.test.bot 2025-07-07 7:22 ` [PATCH v2] " Shuai Zhang @ 2025-07-07 18:39 ` Luiz Augusto von Dentz 2025-07-11 11:59 ` Shuai Zhang 2 siblings, 1 reply; 6+ messages in thread From: Luiz Augusto von Dentz @ 2025-07-07 18:39 UTC (permalink / raw) To: Shuai Zhang; +Cc: linux-bluetooth, quic_bt Hi Shuai, On Fri, Jun 27, 2025 at 2:17 AM Shuai Zhang <quic_shuaz@quicinc.com> wrote: > > Q1: > If the SoC always enables the bt_en pin via hardware and the driver > cannot control the bt_en pin of the SoC chip, then during SSR, > the QCA_SSR_TRIGGERED and QCA_IBS_DISABLED bits cannot be cleared. > This leads to a reset command timeout failure. > > Fix1: > To address this, clear QCA_SSR_TRIGGERED and QCA_IBS_DISABLED bits > after the coredump collection is complete. > Also, add msleep delay to wait for controller to complete SSR. Not sure why you are sending with Q and Fix tags, never seen this format being used for kernel patches before, each fix shall be sent separately. > Q2: > When the SSR (Sub-System Restart) duration exceeds 2 seconds, it triggers > host tx_idle_timeout, which sets host TX state to sleep. due to the > hardware pulling up bt_en, the firmware is not downloaded after the SSR. > As a result, the controller does not enter sleep mode. Consequently, > when the host sends a command afterward, it sends 0xFD to the controller, > but the controller does not respond, leading to a command timeout. > > Fix2: > Reset the tx_idle_timer after SSR (Sub-System Restart). > > Changes in v2: > - Modified the format. > - Add changes to fix tx_idle_timeout > - Link to v1: https://lore.kernel.org/all/20250609105553.3756688-1-quic_shuaz@quicinc.com/ The version history shouldn't be part of patch description, either add it as comments after the description or add a cover letter to capture the history. > Signed-off-by: Shuai Zhang <quic_shuaz@quicinc.com> > --- > drivers/bluetooth/hci_qca.c | 20 +++++++++++++++++++- > 1 file changed, 19 insertions(+), 1 deletion(-) > > diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c > index 4e56782b0..d415a3f31 100644 > --- a/drivers/bluetooth/hci_qca.c > +++ b/drivers/bluetooth/hci_qca.c > @@ -1653,6 +1653,24 @@ static void qca_hw_error(struct hci_dev *hdev, u8 code) > skb_queue_purge(&qca->rx_memdump_q); > } > > + /* If the SoC always enables the bt_en pin via hardware and the driver > + * cannot control the bt_en pin of the SoC chip, then during SSR, > + * the QCA_SSR_TRIGGERED and QCA_IBS_DISABLED bits cannot be cleared. > + * This leads to a reset command timeout failure. > + * > + * To address this, clear QCA_SSR_TRIGGERED and QCA_IBS_DISABLED bits > + * after the coredump collection is complete. > + * Also, add msleep delay to wait for controller to complete SSR. > + */ > + if (!test_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks)) { > + clear_bit(QCA_SSR_TRIGGERED, &qca->flags); > + clear_bit(QCA_IBS_DISABLED, &qca->flags); > + mod_timer(&qca->tx_idle_timer, jiffies + > + msecs_to_jiffies(qca->tx_idle_delay)); > + qca->tx_ibs_state = HCI_IBS_TX_AWAKE; > + msleep(50); This is probably racy since it doesn't seem you are able to validate SSR has been completed after 50 ms. > + } > + > clear_bit(QCA_HW_ERROR_EVENT, &qca->flags); > } > > @@ -2478,7 +2496,7 @@ static int qca_serdev_probe(struct serdev_device *serdev) > return PTR_ERR(qcadev->susclk); > } > } > - > + > err = hci_uart_register_device(&qcadev->serdev_hu, &qca_proto); > if (err) { > BT_ERR("serdev registration failed"); > -- > 2.34.1 > > -- Luiz Augusto von Dentz ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2] driver: bluetooth: hci_qca: fix ssr fail when BT_EN is pulled up by hw 2025-07-07 18:39 ` Luiz Augusto von Dentz @ 2025-07-11 11:59 ` Shuai Zhang 0 siblings, 0 replies; 6+ messages in thread From: Shuai Zhang @ 2025-07-11 11:59 UTC (permalink / raw) To: Luiz Augusto von Dentz; +Cc: linux-bluetooth, quic_bt, linux-arm-msm Hi Luiz On 2025/7/8 2:39, Luiz Augusto von Dentz wrote: > Hi Shuai, > > On Fri, Jun 27, 2025 at 2:17 AM Shuai Zhang <quic_shuaz@quicinc.com> wrote: >> >> Q1: >> If the SoC always enables the bt_en pin via hardware and the driver >> cannot control the bt_en pin of the SoC chip, then during SSR, >> the QCA_SSR_TRIGGERED and QCA_IBS_DISABLED bits cannot be cleared. >> This leads to a reset command timeout failure. >> >> Fix1: >> To address this, clear QCA_SSR_TRIGGERED and QCA_IBS_DISABLED bits >> after the coredump collection is complete. >> Also, add msleep delay to wait for controller to complete SSR. > > Not sure why you are sending with Q and Fix tags, never seen this > format being used for kernel patches before, each fix shall be sent > separately. I will submit it in two parts. > >> Q2: >> When the SSR (Sub-System Restart) duration exceeds 2 seconds, it triggers >> host tx_idle_timeout, which sets host TX state to sleep. due to the >> hardware pulling up bt_en, the firmware is not downloaded after the SSR. >> As a result, the controller does not enter sleep mode. Consequently, >> when the host sends a command afterward, it sends 0xFD to the controller, >> but the controller does not respond, leading to a command timeout. >> >> Fix2: >> Reset the tx_idle_timer after SSR (Sub-System Restart). >> >> Changes in v2: >> - Modified the format. >> - Add changes to fix tx_idle_timeout >> - Link to v1: https://lore.kernel.org/all/20250609105553.3756688-1-quic_shuaz@quicinc.com/ > > The version history shouldn't be part of patch description, either add > it as comments after the description or add a cover letter to capture > the history. I will add a cover. > >> Signed-off-by: Shuai Zhang <quic_shuaz@quicinc.com> >> --- >> drivers/bluetooth/hci_qca.c | 20 +++++++++++++++++++- >> 1 file changed, 19 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c >> index 4e56782b0..d415a3f31 100644 >> --- a/drivers/bluetooth/hci_qca.c >> +++ b/drivers/bluetooth/hci_qca.c >> @@ -1653,6 +1653,24 @@ static void qca_hw_error(struct hci_dev *hdev, u8 code) >> skb_queue_purge(&qca->rx_memdump_q); >> } >> >> + /* If the SoC always enables the bt_en pin via hardware and the driver >> + * cannot control the bt_en pin of the SoC chip, then during SSR, >> + * the QCA_SSR_TRIGGERED and QCA_IBS_DISABLED bits cannot be cleared. >> + * This leads to a reset command timeout failure. >> + * >> + * To address this, clear QCA_SSR_TRIGGERED and QCA_IBS_DISABLED bits >> + * after the coredump collection is complete. >> + * Also, add msleep delay to wait for controller to complete SSR. >> + */ >> + if (!test_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks)) { >> + clear_bit(QCA_SSR_TRIGGERED, &qca->flags); >> + clear_bit(QCA_IBS_DISABLED, &qca->flags); >> + mod_timer(&qca->tx_idle_timer, jiffies + >> + msecs_to_jiffies(qca->tx_idle_delay)); >> + qca->tx_ibs_state = HCI_IBS_TX_AWAKE; >> + msleep(50); > > This is probably racy since it doesn't seem you are able to validate > SSR has been completed after 50 ms. This position has already submitted the core dump data. Before sending the command, the controller should be allowed to stabilize. From qca_regulator_init, it can be seen that the controller requires up to 50ms to stabilize after powering on. Therefore, an additional 50ms delay is added at this position. qca_regulator_init: gpiod_set_value_cansleep(qcadev->bt_en, 0); msleep(50); gpiod_set_value_cansleep(qcadev->bt_en, 1); msleep(50); > >> + } >> + >> clear_bit(QCA_HW_ERROR_EVENT, &qca->flags); >> } >> >> @@ -2478,7 +2496,7 @@ static int qca_serdev_probe(struct serdev_device *serdev) >> return PTR_ERR(qcadev->susclk); >> } >> } >> - >> + >> err = hci_uart_register_device(&qcadev->serdev_hu, &qca_proto); >> if (err) { >> BT_ERR("serdev registration failed"); >> -- >> 2.34.1 >> >> > > thanks, shuai ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-07-11 11:59 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-06-27 6:17 [PATCH v2] driver: bluetooth: hci_qca: fix ssr fail when BT_EN is pulled up by hw Shuai Zhang 2025-06-27 6:42 ` [v2] " bluez.test.bot 2025-07-07 7:22 ` [PATCH v2] " Shuai Zhang 2025-07-07 7:23 ` Shuai Zhang 2025-07-07 18:39 ` Luiz Augusto von Dentz 2025-07-11 11:59 ` Shuai Zhang
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox