Greg:
This patch (as619) adds support for suspend/resume to the usblp driver.
Alan Stern
Signed-off-by: Alan Stern <[EMAIL PROTECTED]>
---
In 2.6.15, any USB driver without such support will prevent the system
from suspending. So it would be nice, although it's certainly not
critical, if this could be added to Linus's tree before 2.6.15 is
released.
I'm afraid we may see a flurry of "USB in 2.6.15 broke suspend" bug
reports... :-(
Index: usb-2.6/drivers/usb/class/usblp.c
===================================================================
--- usb-2.6.orig/drivers/usb/class/usblp.c
+++ usb-2.6/drivers/usb/class/usblp.c
@@ -54,6 +54,7 @@
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/lp.h>
+#include <linux/suspend.h>
#undef DEBUG
#include <linux/usb.h>
@@ -152,6 +153,7 @@ struct usblp {
unsigned char used; /* True if open */
unsigned char present; /* True if not
disconnected */
unsigned char bidir; /* interface is
bidirectional */
+ unsigned char suspended; /* Obvious... */
unsigned char *device_id_string; /* IEEE 1284 DEVICE ID
string (ptr) */
/* first 2 bytes are
(big-endian) length */
};
@@ -386,7 +388,8 @@ static int usblp_open(struct inode *inod
if (usblp->bidir) {
usblp->readcount = 0;
usblp->readurb->dev = usblp->dev;
- if (usb_submit_urb(usblp->readurb, GFP_KERNEL) < 0) {
+ if (usblp->suspended || usb_submit_urb(usblp->readurb,
+ GFP_KERNEL) < 0) {
retval = -EIO;
usblp->used = 0;
file->private_data = NULL;
@@ -706,7 +709,8 @@ static ssize_t usblp_write(struct file *
usblp->writeurb->dev = usblp->dev;
usblp->wcomplete = 0;
- err = usb_submit_urb(usblp->writeurb, GFP_KERNEL);
+ err = usblp->suspended ? -EIO :
+ usb_submit_urb(usblp->writeurb, GFP_KERNEL);
if (err) {
if (err != -ENOMEM)
count = -EIO;
@@ -775,7 +779,8 @@ static ssize_t usblp_read(struct file *f
usblp->readurb->dev = usblp->dev;
usblp->readcount = 0;
usblp->rcomplete = 0;
- if (usb_submit_urb(usblp->readurb, GFP_KERNEL) < 0)
+ if (usblp->suspended || usb_submit_urb(usblp->readurb,
+ GFP_KERNEL) < 0)
dbg("error submitting urb");
count = -EIO;
goto done;
@@ -793,7 +798,8 @@ static ssize_t usblp_read(struct file *f
usblp->readcount = 0;
usblp->readurb->dev = usblp->dev;
usblp->rcomplete = 0;
- if (usb_submit_urb(usblp->readurb, GFP_KERNEL)) {
+ if (usblp->suspended || usb_submit_urb(usblp->readurb,
+ GFP_KERNEL)) {
count = -EIO;
goto done;
}
@@ -849,6 +855,31 @@ static struct usb_class_driver usblp_cla
.minor_base = USBLP_MINOR_BASE,
};
+#ifdef CONFIG_PM
+static int usblp_suspend(struct usb_interface *intf, pm_message_t message)
+{
+ struct usblp *usblp = usb_get_intfdata(intf);
+
+ down(&usblp->sem);
+ usblp->suspended = 1;
+ usblp_unlink_urbs(usblp);
+ intf->dev.power.power_state.event = message.event;
+ up(&usblp->sem);
+ return 0;
+}
+
+static int usblp_resume(struct usb_interface *intf)
+{
+ struct usblp *usblp = usb_get_intfdata(intf);
+
+ down(&usblp->sem);
+ usblp->suspended = 0;
+ intf->dev.power.power_state.event = PM_EVENT_ON;
+ up(&usblp->sem);
+ return 0;
+}
+#endif
+
static int usblp_probe(struct usb_interface *intf,
const struct usb_device_id *id)
{
@@ -1190,6 +1221,10 @@ static struct usb_driver usblp_driver =
.probe = usblp_probe,
.disconnect = usblp_disconnect,
.id_table = usblp_ids,
+#ifdef CONFIG_PM
+ .suspend = usblp_suspend,
+ .resume = usblp_resume,
+#endif
};
static int __init usblp_init(void)
-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems? Stop! Download the new AJAX search engine that makes
searching your log files as easy as surfing the web. DOWNLOAD SPLUNK!
http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel