summaryrefslogtreecommitdiff
path: root/patches/collateral-evolutions
diff options
context:
space:
mode:
Diffstat (limited to 'patches/collateral-evolutions')
-rw-r--r--patches/collateral-evolutions/network/0053-remove_wait_on_bit_timeout/hci_intel.patch154
1 files changed, 123 insertions, 31 deletions
diff --git a/patches/collateral-evolutions/network/0053-remove_wait_on_bit_timeout/hci_intel.patch b/patches/collateral-evolutions/network/0053-remove_wait_on_bit_timeout/hci_intel.patch
index b8d1e7e3..89e42d14 100644
--- a/patches/collateral-evolutions/network/0053-remove_wait_on_bit_timeout/hci_intel.patch
+++ b/patches/collateral-evolutions/network/0053-remove_wait_on_bit_timeout/hci_intel.patch
@@ -1,63 +1,105 @@
-diff --git a/drivers/bluetooth/hci_intel.c b/drivers/bluetooth/hci_intel.c
-index 21dfa89..f246352 100644
--- a/drivers/bluetooth/hci_intel.c
+++ b/drivers/bluetooth/hci_intel.c
-@@ -383,6 +383,7 @@ static int intel_setup(struct hci_uart *
- * and thus just timeout if that happens and fail the setup
- * of this device.
- */
+@@ -122,8 +122,9 @@ static u8 intel_convert_speed(unsigned i
+ static int intel_wait_booting(struct hci_uart *hu)
+ {
+ struct intel_data *intel = hu->priv;
+- int err;
++ int err = 0;
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0)
- err = wait_on_bit_timeout(&intel->flags, STATE_DOWNLOADING,
+ err = wait_on_bit_timeout(&intel->flags, STATE_BOOTING,
TASK_INTERRUPTIBLE,
- msecs_to_jiffies(5000));
-@@ -403,6 +404,33 @@ static int intel_setup(struct hci_uart *
- err = -ENOEXEC;
- goto done;
+ msecs_to_jiffies(1000));
+@@ -137,6 +138,33 @@ static int intel_wait_booting(struct hci
+ bt_dev_err(hu->hdev, "Device boot timeout");
+ return -ETIMEDOUT;
}
+#else
-+ if (test_bit(STATE_DOWNLOADING, &intel->flags)) {
++ if (test_bit(STATE_BOOTING, &intel->flags)) {
+ DECLARE_WAITQUEUE(wait, current);
+ signed long timeout;
+
-+ add_wait_queue(&hdev->req_wait_q, &wait);
++ add_wait_queue(&hu->hdev->req_wait_q, &wait);
+ set_current_state(TASK_INTERRUPTIBLE);
+
+ /* Booting into operational firmware should not take
+ * longer than 1 second. However if that happens, then
+ * just fail the setup since something went wrong.
+ */
-+ timeout = schedule_timeout(msecs_to_jiffies(5000));
++ timeout = schedule_timeout(msecs_to_jiffies(1000));
+
-+ remove_wait_queue(&hdev->req_wait_q, &wait);
++ remove_wait_queue(&hu->hdev->req_wait_q, &wait);
+
+ if (signal_pending(current)) {
-+ BT_ERR("%s: Firmware loading interrupted", hdev->name);
++ BT_ERR("%s: Device boot interrupted", hu->hdev->name);
+ return -EINTR;
+ }
+
+ if (!timeout) {
-+ BT_ERR("%s: Firmware loading timeout", hdev->name);
++ BT_ERR("%s: Device boot timeout", hu->hdev->name);
+ return -ETIMEDOUT;
+ }
+ }
+#endif
- rettime = ktime_get();
- delta = ktime_sub(rettime, calltime);
-@@ -436,6 +464,7 @@ done:
- */
- BT_INFO("%s: Waiting for device to boot", hdev->name);
+ return err;
+ }
+@@ -144,8 +172,9 @@ static int intel_wait_booting(struct hci
+ static int intel_wait_lpm_transaction(struct hci_uart *hu)
+ {
+ struct intel_data *intel = hu->priv;
+- int err;
++ int err = 0;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0)
- err = wait_on_bit_timeout(&intel->flags, STATE_BOOTING,
+ err = wait_on_bit_timeout(&intel->flags, STATE_LPM_TRANSACTION,
TASK_INTERRUPTIBLE,
msecs_to_jiffies(1000));
-@@ -449,6 +478,33 @@ done:
- BT_ERR("%s: Device boot timeout", hdev->name);
+@@ -159,6 +188,29 @@ static int intel_wait_lpm_transaction(st
+ bt_dev_err(hu->hdev, "LPM transaction timeout");
return -ETIMEDOUT;
}
+#else
-+ if (test_bit(STATE_BOOTING, &intel->flags)) {
++ if (test_bit(STATE_LPM_TRANSACTION, &intel->flags)) {
++ DECLARE_WAITQUEUE(wait, current);
++ signed long timeout;
++
++ add_wait_queue(&hu->hdev->req_wait_q, &wait);
++ set_current_state(TASK_INTERRUPTIBLE);
++
++ timeout = schedule_timeout(msecs_to_jiffies(1000));
++
++ remove_wait_queue(&hu->hdev->req_wait_q, &wait);
++
++ if (signal_pending(current)) {
++ BT_ERR("%s: LPM transaction interrupted", hu->hdev->name);
++ return -EINTR;
++ }
++
++ if (!timeout) {
++ BT_ERR("%s: LPM transaction timeout", hu->hdev->name);
++ return -ETIMEDOUT;
++ }
++ }
++#endif
+
+ return err;
+ }
+@@ -826,6 +878,7 @@ static int intel_setup(struct hci_uart *
+ * and thus just timeout if that happens and fail the setup
+ * of this device.
+ */
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0)
+ err = wait_on_bit_timeout(&intel->flags, STATE_DOWNLOADING,
+ TASK_INTERRUPTIBLE,
+ msecs_to_jiffies(5000));
+@@ -840,6 +893,33 @@ static int intel_setup(struct hci_uart *
+ err = -ETIMEDOUT;
+ goto done;
+ }
++#else
++ if (test_bit(STATE_DOWNLOADING, &intel->flags)) {
+ DECLARE_WAITQUEUE(wait, current);
+ signed long timeout;
+
@@ -68,21 +110,71 @@ index 21dfa89..f246352 100644
+ * longer than 1 second. However if that happens, then
+ * just fail the setup since something went wrong.
+ */
-+ timeout = schedule_timeout(msecs_to_jiffies(1000));
++ timeout = schedule_timeout(msecs_to_jiffies(5000));
+
+ remove_wait_queue(&hdev->req_wait_q, &wait);
+
+ if (signal_pending(current)) {
-+ BT_ERR("%s: Device boot interrupted", hdev->name);
++ BT_ERR("%s: Firmware loading interrupted", hdev->name);
+ return -EINTR;
+ }
+
+ if (!timeout) {
-+ BT_ERR("%s: Device boot timeout", hdev->name);
++ BT_ERR("%s: Firmware loading timeout", hdev->name);
+ return -ETIMEDOUT;
+ }
+ }
+#endif
- rettime = ktime_get();
- delta = ktime_sub(rettime, calltime);
+ if (test_bit(STATE_FIRMWARE_FAILED, &intel->flags)) {
+ bt_dev_err(hdev, "Firmware loading failed");
+@@ -968,8 +1048,12 @@ static int intel_recv_event(struct hci_d
+
+ if (test_and_clear_bit(STATE_DOWNLOADING, &intel->flags) &&
+ test_bit(STATE_FIRMWARE_LOADED, &intel->flags)) {
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0)
+ smp_mb__after_atomic();
+ wake_up_bit(&intel->flags, STATE_DOWNLOADING);
++#else
++ wake_up_interruptible(&hu->hdev->req_wait_q);
++#endif
+ }
+
+ /* When switching to the operational firmware the device
+@@ -979,8 +1063,12 @@ static int intel_recv_event(struct hci_d
+ } else if (skb->len == 9 && hdr->evt == 0xff && hdr->plen == 0x07 &&
+ skb->data[2] == 0x02) {
+ if (test_and_clear_bit(STATE_BOOTING, &intel->flags)) {
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0)
+ smp_mb__after_atomic();
+ wake_up_bit(&intel->flags, STATE_BOOTING);
++#else
++ wake_up_interruptible(&hu->hdev->req_wait_q);
++#endif
+ }
+ }
+ recv:
+@@ -1019,15 +1107,23 @@ static int intel_recv_lpm(struct hci_dev
+ case LPM_OP_SUSPEND_ACK:
+ set_bit(STATE_SUSPENDED, &intel->flags);
+ if (test_and_clear_bit(STATE_LPM_TRANSACTION, &intel->flags)) {
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0)
+ smp_mb__after_atomic();
+ wake_up_bit(&intel->flags, STATE_LPM_TRANSACTION);
++#else
++ wake_up_interruptible(&hu->hdev->req_wait_q);
++#endif
+ }
+ break;
+ case LPM_OP_RESUME_ACK:
+ clear_bit(STATE_SUSPENDED, &intel->flags);
+ if (test_and_clear_bit(STATE_LPM_TRANSACTION, &intel->flags)) {
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0)
+ smp_mb__after_atomic();
+ wake_up_bit(&intel->flags, STATE_LPM_TRANSACTION);
++#else
++ wake_up_interruptible(&hu->hdev->req_wait_q);
++#endif
+ }
+ break;
+ default: