public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] hci_usb: implement suspend/resume
@ 2006-01-17 23:21 Johannes Berg
  2006-01-18 13:13 ` Marcel Holtmann
  2006-01-18 13:25 ` Oliver Neukum
  0 siblings, 2 replies; 10+ messages in thread
From: Johannes Berg @ 2006-01-17 23:21 UTC (permalink / raw)
  To: marcel, maxk; +Cc: linux-kernel, bluez-devel

The attached patch implements suspend/resume for the hci_usb bluetooth
driver by simply killing all outstanding urbs on suspend, and re-issuing
them on resume.

This allows me to actually use the internal bluetooth "dongle" in my
powerbook after suspend-to-ram without taking down all userland programs
(sdpd, ...) and the hci device and reloading the module.

Signed-Off-By: Johannes Berg <johannes@sipsolutions.net>

--- linux-2.6.15.1.orig/drivers/bluetooth/hci_usb.c	2006-01-18 00:08:54.840000000 +0100
+++ linux-2.6.15.1/drivers/bluetooth/hci_usb.c	2006-01-18 00:06:35.080000000 +0100
@@ -1043,11 +1043,55 @@
 	hci_free_dev(hdev);
 }
 
+static int hci_usb_suspend(struct usb_interface *intf, pm_message_t message)
+{
+	struct hci_usb *husb = usb_get_intfdata(intf);
+	int i;
+	unsigned long flags;
+	if (!husb || intf == husb->isoc_iface)
+		return 0;
+	
+	for (i = 0; i < 4; i++) {
+		struct _urb_queue *q = &husb->pending_q[i];
+		struct _urb *_urb;
+		spin_lock_irqsave(&q->lock, flags);
+		list_for_each_entry(_urb, &q->head, list)
+			usb_kill_urb(&_urb->urb);
+		spin_unlock_irqrestore(&q->lock, flags);
+	}
+	return 0;
+}
+
+static int hci_usb_resume(struct usb_interface *intf)
+{
+	struct hci_usb *husb = usb_get_intfdata(intf);
+	int i, err;
+	unsigned long flags;
+	if (!husb || intf == husb->isoc_iface)
+		return 0;
+	
+	for (i = 0; i < 4; i++) {
+		struct _urb_queue *q = &husb->pending_q[i];
+		struct _urb *_urb;
+		spin_lock_irqsave(&q->lock, flags);
+		list_for_each_entry(_urb, &q->head, list) {
+			err = usb_submit_urb(&_urb->urb, GFP_ATOMIC);
+			if (err) break;
+		}
+		spin_unlock_irqrestore(&q->lock, flags);
+		if (err)
+			return -EIO;
+	}
+	return 0;
+}
+
 static struct usb_driver hci_usb_driver = {
 	.owner		= THIS_MODULE,
 	.name		= "hci_usb",
 	.probe		= hci_usb_probe,
 	.disconnect	= hci_usb_disconnect,
+	.suspend	= hci_usb_suspend,
+	.resume		= hci_usb_resume,
 	.id_table	= bluetooth_ids,
 };
 



^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2006-04-16 14:42 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-01-17 23:21 [PATCH] hci_usb: implement suspend/resume Johannes Berg
2006-01-18 13:13 ` Marcel Holtmann
2006-01-18 16:38   ` Johannes Berg
2006-03-21  9:42     ` Johannes Berg
2006-03-21  9:52       ` Marcel Holtmann
2006-04-16 14:42         ` Johannes Berg
2006-01-18 13:25 ` Oliver Neukum
2006-01-18 14:13   ` Johannes Berg
2006-01-18 15:34     ` Oliver Neukum
2006-01-18 20:46       ` [linux-usb-devel] " Greg KH

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox