commit 6aa42966dea9a1fc02a714211ea489c3278bf8d4 Author: Matthew Garrett 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 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 #include #include +#include #include #include @@ -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 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 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 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 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; }