160 lines
4.6 KiB
Diff
160 lines
4.6 KiB
Diff
|
commit 6aa42966dea9a1fc02a714211ea489c3278bf8d4
|
||
|
Author: Matthew Garrett <mjg@redhat.com>
|
||
|
Date: Thu Sep 16 13:34:55 2010 -0400
|
||
|
|
||
|
bluetooth: Take a runtime pm reference on hid connections
|
||
|
|
||
|
Bluetooth runtime PM interacts badly with input devices - the connection
|
||
|
will be dropped if the device becomes idle, resulting in noticable lag when
|
||
|
the user interacts with the input device again. Bump the pm runtime count
|
||
|
when the device is associated and release it when it's disassociated in
|
||
|
order to avoid this.
|
||
|
|
||
|
Signed-off-by: Matthew Garrett <mjg@redhat.com>
|
||
|
|
||
|
diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c
|
||
|
index bfe641b..a4489a7 100644
|
||
|
--- a/net/bluetooth/hidp/core.c
|
||
|
+++ b/net/bluetooth/hidp/core.c
|
||
|
@@ -36,6 +36,7 @@
|
||
|
#include <linux/file.h>
|
||
|
#include <linux/init.h>
|
||
|
#include <linux/wait.h>
|
||
|
+#include <linux/pm_runtime.h>
|
||
|
#include <net/sock.h>
|
||
|
|
||
|
#include <linux/input.h>
|
||
|
@@ -622,6 +623,14 @@ static int hidp_session(void *arg)
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
+static struct hci_dev *hidp_get_hci(struct hidp_session *session)
|
||
|
+{
|
||
|
+ bdaddr_t *src = &bt_sk(session->ctrl_sock->sk)->src;
|
||
|
+ bdaddr_t *dst = &bt_sk(session->ctrl_sock->sk)->dst;
|
||
|
+
|
||
|
+ return hci_get_route(dst, src);
|
||
|
+}
|
||
|
+
|
||
|
static struct device *hidp_get_device(struct hidp_session *session)
|
||
|
{
|
||
|
bdaddr_t *src = &bt_sk(session->ctrl_sock->sk)->src;
|
||
|
@@ -819,6 +828,7 @@ fault:
|
||
|
int hidp_add_connection(struct hidp_connadd_req *req, struct socket *ctrl_sock, struct socket *intr_sock)
|
||
|
{
|
||
|
struct hidp_session *session, *s;
|
||
|
+ struct hci_dev *hdev;
|
||
|
int err;
|
||
|
|
||
|
BT_DBG("");
|
||
|
@@ -889,6 +899,10 @@ int hidp_add_connection(struct hidp_connadd_req *req, struct socket *ctrl_sock,
|
||
|
hidp_input_event(session->input, EV_LED, 0, 0);
|
||
|
}
|
||
|
|
||
|
+ hdev = hidp_get_hci(session);
|
||
|
+ pm_runtime_get(hdev->parent);
|
||
|
+ hci_dev_put(hdev);
|
||
|
+
|
||
|
up_write(&hidp_session_sem);
|
||
|
return 0;
|
||
|
|
||
|
@@ -925,6 +939,7 @@ failed:
|
||
|
int hidp_del_connection(struct hidp_conndel_req *req)
|
||
|
{
|
||
|
struct hidp_session *session;
|
||
|
+ struct hci_dev *hdev;
|
||
|
int err = 0;
|
||
|
|
||
|
BT_DBG("");
|
||
|
@@ -952,6 +967,9 @@ int hidp_del_connection(struct hidp_conndel_req *req)
|
||
|
} else
|
||
|
err = -ENOENT;
|
||
|
|
||
|
+ hdev = hidp_get_hci(session);
|
||
|
+ pm_runtime_put(hdev->parent);
|
||
|
+ hci_dev_put(hdev);
|
||
|
up_read(&hidp_session_sem);
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
commit 482eca592615e85b048753750b101d051b77fde9
|
||
|
Author: Matthew Garrett <mjg@redhat.com>
|
||
|
Date: Thu Sep 16 13:49:24 2010 -0400
|
||
|
|
||
|
bluetooth: Remove some unnecessary error messages
|
||
|
|
||
|
The main reason for these urbs to error out on submission is that runtime
|
||
|
pm has kicked in, which is unnecessary noise. Let's just drop them.
|
||
|
|
||
|
Signed-off-by: Matthew Garrett <mjg@redhat.com>
|
||
|
|
||
|
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
|
||
|
index d22ce3c..3ace025 100644
|
||
|
--- a/drivers/bluetooth/btusb.c
|
||
|
+++ b/drivers/bluetooth/btusb.c
|
||
|
@@ -229,11 +229,8 @@ static void btusb_intr_complete(struct urb *urb)
|
||
|
usb_anchor_urb(urb, &data->intr_anchor);
|
||
|
|
||
|
err = usb_submit_urb(urb, GFP_ATOMIC);
|
||
|
- if (err < 0) {
|
||
|
- BT_ERR("%s urb %p failed to resubmit (%d)",
|
||
|
- hdev->name, urb, -err);
|
||
|
+ if (err < 0)
|
||
|
usb_unanchor_urb(urb);
|
||
|
- }
|
||
|
}
|
||
|
|
||
|
static int btusb_submit_intr_urb(struct hci_dev *hdev, gfp_t mem_flags)
|
||
|
@@ -313,11 +310,8 @@ static void btusb_bulk_complete(struct urb *urb)
|
||
|
usb_mark_last_busy(data->udev);
|
||
|
|
||
|
err = usb_submit_urb(urb, GFP_ATOMIC);
|
||
|
- if (err < 0) {
|
||
|
- BT_ERR("%s urb %p failed to resubmit (%d)",
|
||
|
- hdev->name, urb, -err);
|
||
|
+ if (err < 0)
|
||
|
usb_unanchor_urb(urb);
|
||
|
- }
|
||
|
}
|
||
|
|
||
|
static int btusb_submit_bulk_urb(struct hci_dev *hdev, gfp_t mem_flags)
|
||
|
@@ -402,11 +396,8 @@ static void btusb_isoc_complete(struct urb *urb)
|
||
|
usb_anchor_urb(urb, &data->isoc_anchor);
|
||
|
|
||
|
err = usb_submit_urb(urb, GFP_ATOMIC);
|
||
|
- if (err < 0) {
|
||
|
- BT_ERR("%s urb %p failed to resubmit (%d)",
|
||
|
- hdev->name, urb, -err);
|
||
|
+ if (err < 0)
|
||
|
usb_unanchor_urb(urb);
|
||
|
- }
|
||
|
}
|
||
|
|
||
|
static void inline __fill_isoc_descriptor(struct urb *urb, int len, int mtu)
|
||
|
|
||
|
commit fd763c5b14ed99ac2401f8e8f1a07c3687ae01cc
|
||
|
Author: Matthew Garrett <mjg@redhat.com>
|
||
|
Date: Thu Sep 16 13:37:38 2010 -0400
|
||
|
|
||
|
bluetooth: Enable USB autosuspend by default on btusb
|
||
|
|
||
|
We've done this for a while in Fedora without any obvious problems other
|
||
|
than some interaction with input devices. Those should be fixed now, so
|
||
|
let's try this in mainline.
|
||
|
|
||
|
Signed-off-by: Matthew Garrett <mjg@redhat.com>
|
||
|
|
||
|
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
|
||
|
index 3ace025..03b64e4 100644
|
||
|
--- a/drivers/bluetooth/btusb.c
|
||
|
+++ b/drivers/bluetooth/btusb.c
|
||
|
@@ -1014,6 +1014,8 @@ static int btusb_probe(struct usb_interface *intf,
|
||
|
|
||
|
usb_set_intfdata(intf, data);
|
||
|
|
||
|
+ usb_enable_autosuspend(interface_to_usbdev(intf));
|
||
|
+
|
||
|
return 0;
|
||
|
}
|
||
|
|